diff --git a/workspaces/frontend/.gitignore b/workspaces/frontend/.gitignore index e374755..e742cf9 100644 --- a/workspaces/frontend/.gitignore +++ b/workspaces/frontend/.gitignore @@ -11,4 +11,5 @@ node_modules/ *.mjs *.log +openapi.json src/client diff --git a/workspaces/frontend/package-lock.json b/workspaces/frontend/package-lock.json index 3fae682..8ab3b83 100644 --- a/workspaces/frontend/package-lock.json +++ b/workspaces/frontend/package-lock.json @@ -9,8 +9,10 @@ "version": "0.0.5", "dependencies": { "@catppuccin/tailwindcss": "^0.1.6", + "@hey-api/client-axios": "^0.2.3", "autoprefixer": "^10.4.18", "axios": "^1.6.8", + "filesize": "^10.1.6", "pinia": "^2.1.7", "postcss": "^8.4.35", "tailwindcss": "^3.4.1", @@ -18,6 +20,7 @@ "vue-router": "^4.3.0" }, "devDependencies": { + "@hey-api/openapi-ts": "^0.53.0", "@tsconfig/node18": "^18.2.2", "@types/node": "^18.19.3", "@vitejs/plugin-vue": "^4.5.2", @@ -879,6 +882,44 @@ "node": ">=12" } }, + "node_modules/@hey-api/client-axios": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.2.3.tgz", + "integrity": "sha512-v1BoTozp8LQ9JawZF9atXdmaBdQEvoIf39pIYf/0WSdkZSv0rUJDVXxNWHnDDs+S1/6pOfbOhM/0VXD5YJqr8w==", + "peerDependencies": { + "axios": ">= 1.0.0 < 2" + } + }, + "node_modules/@hey-api/openapi-ts": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.53.0.tgz", + "integrity": "sha512-5pDd/s0yHJniruYyKYmEsAMbY10Nh/EwhHlgIrdpQ1KZWQdyTbH/tn8rVHT5Mopr1dMuYX0kq0TzpjcNlvrROQ==", + "dev": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "11.7.0", + "c12": "1.11.1", + "commander": "12.1.0", + "handlebars": "4.7.8" + }, + "bin": { + "openapi-ts": "bin/index.cjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "typescript": "^5.x" + } + }, + "node_modules/@hey-api/openapi-ts/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1422,6 +1463,18 @@ "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", "dev": true }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -1587,6 +1640,34 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/c12": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.11.1.tgz", + "integrity": "sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg==", + "dev": true, + "dependencies": { + "chokidar": "^3.6.0", + "confbox": "^0.1.7", + "defu": "^6.1.4", + "dotenv": "^16.4.5", + "giget": "^1.2.3", + "jiti": "^1.21.6", + "mlly": "^1.7.1", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.1.1", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.4" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -1674,6 +1755,24 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dev": true, + "dependencies": { + "consola": "^3.2.3" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1714,6 +1813,21 @@ "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", "dev": true }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1772,6 +1886,12 @@ } } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1780,6 +1900,12 @@ "node": ">=0.4.0" } }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", + "dev": true + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -1790,6 +1916,18 @@ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -1876,6 +2014,29 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -1910,6 +2071,14 @@ "reusify": "^1.0.4" } }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "engines": { + "node": ">= 10.4.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -1994,6 +2163,36 @@ "node": ">=14.14" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2024,6 +2223,37 @@ "node": ">=6.9.0" } }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz", + "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==", + "dev": true, + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.3", + "nypm": "^0.3.8", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "tar": "^6.2.0" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, "node_modules/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -2133,6 +2363,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2190,6 +2429,18 @@ "node": ">=0.12.0" } }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2325,6 +2576,12 @@ "node": ">= 0.10.0" } }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2364,6 +2621,18 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -2395,6 +2664,61 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2440,6 +2764,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/node-fetch-native": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", + "dev": true + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -2507,6 +2837,53 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.11.tgz", + "integrity": "sha512-E5GqaAYSnbb6n1qZyik2wjPDZON43FqOJO59+3OkWrnmQtjggrMOVnsyzfjxp/tS6nlYJBA4zRA5jSM2YaadMg==", + "dev": true, + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "execa": "^8.0.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "ufo": "^1.5.4" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2523,6 +2900,27 @@ "node": ">= 6" } }, + "node_modules/ohash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", + "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", + "dev": true + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/openapi-typescript-codegen": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.29.0.tgz", @@ -2590,6 +2988,18 @@ "node": "14 || >=16.14" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -2684,6 +3094,17 @@ "node": ">= 6" } }, + "node_modules/pkg-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", + "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", + "dev": true, + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.1", + "pathe": "^1.1.2" + } + }, "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -2849,6 +3270,16 @@ } ] }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "dev": true, + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -3113,6 +3544,18 @@ "node": ">=8" } }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -3199,6 +3642,38 @@ "node": ">=14.0.0" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -3256,6 +3731,12 @@ "node": ">=14.17" } }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true + }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", diff --git a/workspaces/frontend/package.json b/workspaces/frontend/package.json index f2f0027..e78d4da 100644 --- a/workspaces/frontend/package.json +++ b/workspaces/frontend/package.json @@ -9,12 +9,15 @@ "preview": "vite preview", "build": "vite build", "type-check": "vue-tsc --build --force", - "generate-client": "openapi --input ./openapi.json --output ./src/client/ --client axios" + "generate-client": "openapi --input ./openapi.json --output ./src/client_old/ --client axios --name Client", + "openapi-ts": "openapi-ts --input ./openapi.json --output ./src/client/ --client @hey-api/client-axios" }, "dependencies": { "@catppuccin/tailwindcss": "^0.1.6", + "@hey-api/client-axios": "^0.2.3", "autoprefixer": "^10.4.18", "axios": "^1.6.8", + "filesize": "^10.1.6", "pinia": "^2.1.7", "postcss": "^8.4.35", "tailwindcss": "^3.4.1", @@ -22,6 +25,7 @@ "vue-router": "^4.3.0" }, "devDependencies": { + "@hey-api/openapi-ts": "^0.53.0", "@tsconfig/node18": "^18.2.2", "@types/node": "^18.19.3", "@vitejs/plugin-vue": "^4.5.2", diff --git a/workspaces/frontend/src/api/auth.ts b/workspaces/frontend/src/api/auth.ts deleted file mode 100644 index 14329be..0000000 --- a/workspaces/frontend/src/api/auth.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { api_client, type ResponseError, handle_error } from "@/client"; - -export interface UserCredentials { - name: string, - password: string, - email?: string -} - -export async function signup(body: UserCredentials): Promise { - return await api_client.post("/auth/signup", JSON.stringify(body)) - .catch(handle_error); -} - -export async function signin(body: UserCredentials): Promise { - return await api_client.post("/auth/signin", JSON.stringify(body)) - .catch(handle_error); -} - -export async function signout(): Promise { - return await api_client.get("/auth/signout") - .catch(handle_error); -} diff --git a/workspaces/frontend/src/api/directory.ts b/workspaces/frontend/src/api/directory.ts deleted file mode 100644 index 78ec698..0000000 --- a/workspaces/frontend/src/api/directory.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { api_client, type ResponseError, handle_error } from "@/client"; - -export interface DirectoryInfo { - id: number, - repository_id: number, - parent_id?: number, - created: number, - updated: number, - name: string, - path?: string, - is_public: boolean, - used?: number -} diff --git a/workspaces/frontend/src/api/file.ts b/workspaces/frontend/src/api/file.ts deleted file mode 100644 index 55214bf..0000000 --- a/workspaces/frontend/src/api/file.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { api_client, type ResponseError, handle_error } from "@/client"; - -export interface FileInfo { - id: number, - repository_id: number, - parent_id?: number, - created: number, - updated: number, - name: string, - path?: string, - is_public: boolean, - size: number -} diff --git a/workspaces/frontend/src/api/index.ts b/workspaces/frontend/src/api/index.ts deleted file mode 100644 index a71b0db..0000000 --- a/workspaces/frontend/src/api/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * as auth from "@/api/auth"; -export * as user from "@/api/user"; -export * as repository from "@/api/repository"; -export * as directory from "@/api/directory"; -export * as file from "@/api/file"; diff --git a/workspaces/frontend/src/api/repository.ts b/workspaces/frontend/src/api/repository.ts deleted file mode 100644 index dc3bf46..0000000 --- a/workspaces/frontend/src/api/repository.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { api_client, type ResponseError, handle_error } from "@/client"; -import { file, directory } from "@/api" - -export interface RepositoryInfo { - id: number, - capacity: number, - used?: number -} - -export interface RepositoryContent { - files: file.FileInfo[], - directories: directory.DirectoryInfo[] -} - -export async function info(): Promise { - return await api_client.get("/repository") - .then(async response => { return Promise.resolve(response.data); }) - .catch(handle_error); -} - -export async function create(): Promise { - return await api_client.post("/repository") - .catch(handle_error); -} - -export async function remove(): Promise { - return await api_client.delete("/repository") - .catch(handle_error); -} - -export async function content(): Promise { - return await api_client.get("/repository/content") - .then(async response => { return Promise.resolve(response.data); }) - .catch(handle_error); -} diff --git a/workspaces/frontend/src/api/user.ts b/workspaces/frontend/src/api/user.ts deleted file mode 100644 index cd924bf..0000000 --- a/workspaces/frontend/src/api/user.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { api_client, type ResponseError, handle_error } from "@/client"; - -export interface UserCredentials { - name: string, - password: string, - email?: string -} - -export interface UserInfo { - id: string, - name: string, - lower_name: string, - full_name?: string, - email?: string, - is_email_private: boolean, - must_change_password: boolean, - login_type: string, - created: number, - updated: number, - last_login?: number, - is_active: boolean, - is_admin: boolean, - avatar?: string -} - - -export type Image = string | ArrayBuffer; - -export async function info(): Promise { - return await api_client.get("/user") - .then(async response => { return Promise.resolve(response.data); }) - .catch(handle_error); -} - - diff --git a/workspaces/frontend/src/assets/style.css b/workspaces/frontend/src/assets/style.css index 5cf7282..869a07c 100644 --- a/workspaces/frontend/src/assets/style.css +++ b/workspaces/frontend/src/assets/style.css @@ -10,11 +10,16 @@ } a { - @apply text-ctp-green; + @apply text-ctp-lavender; } .input { - @apply w-full pl-3 pr-3 pt-2 pb-2 rounded border bg-ctp-mantle border-ctp-overlay0 hover:border-ctp-overlay1 focus:border-ctp-green text-ctp-text outline-none; + @apply w-full pl-3 pr-3 pt-2 pb-2 rounded border bg-ctp-mantle border-ctp-overlay0 hover:border-ctp-overlay1 focus:border-ctp-lavender text-ctp-text outline-none; + } + + .input-file { + @apply block w-full border rounded cursor-pointer bg-ctp-base border-ctp-surface0 text-ctp-subtext0 focus:outline-none; + @apply file:bg-ctp-mantle file:border-ctp-surface0 file:mr-5 file:py-2 file:px-3 file:h-full file:border-y-0 file:border-l-0 file:border-r file:text-ctp-blue hover:file:cursor-pointer hover:file:bg-ctp-base; } label { @@ -22,15 +27,15 @@ } .button { - @apply pt-2 pb-2 pl-5 pr-5 rounded bg-ctp-mantle hover:bg-ctp-base text-ctp-blue cursor-pointer; + @apply pt-1 pb-1 pl-3 pr-3 sm:pt-2 sm:pb-2 sm:pl-5 sm:pr-5 rounded bg-ctp-mantle border border-ctp-surface0 hover:bg-ctp-base text-ctp-blue cursor-pointer; } .link-button { - @apply button text-ctp-green cursor-pointer; + @apply button text-ctp-lavender cursor-pointer border-none; } .hline { - @apply border-t border-ctp-overlay0 ml-0 mr-0; + @apply border-t border-ctp-surface0 ml-0 mr-0; } h1 { @@ -40,6 +45,10 @@ label { @apply text-ctp-text; } + + .icon { + @apply inline-block select-none text-center overflow-visible w-6 h-6 stroke-ctp-text; + } } @layer utilities { diff --git a/workspaces/frontend/src/client.ts b/workspaces/frontend/src/client.ts deleted file mode 100644 index 437b98f..0000000 --- a/workspaces/frontend/src/client.ts +++ /dev/null @@ -1,45 +0,0 @@ -import axios, { type AxiosInstance, AxiosError } from "axios"; - -export class HttpError extends Error { - status_code: number; - - constructor(status_code: number, message: string) { - super(JSON.stringify({ status_code: status_code, message: message })); - Object.setPrototypeOf(this, new.target.prototype); - - this.name = Error.name; - this.status_code = status_code; - } -} - -export interface ResponseError { - status: number | null, - message: string | null -} - -export function handle_error(error: AxiosError): Promise { - let message = error.response?.data?.detail || error.response?.data; - console.log(error); - // extract pydantic error message - if (error.response.status == 422) { - message = error.response?.data?.detail[1].ctx.reason; - } - - return Promise.reject({ status: error.response.status, message: message}); -} - -const debug = import.meta.hot; - -export const api_client: AxiosInstance = axios.create({ - baseURL: debug ? "http://localhost:54601/api" : "/api", - headers: { - "Content-Type": "application/json" - }, - withCredentials: true, -}); - -export const resources_client: AxiosInstance = axios.create({ - baseURL: debug ? "http://localhost:54601/resources" : "/resources", - responseType: "blob" -}); - diff --git a/workspaces/frontend/src/components/ContextMenu.vue b/workspaces/frontend/src/components/ContextMenu.vue index 227143e..3b0cab8 100644 --- a/workspaces/frontend/src/components/ContextMenu.vue +++ b/workspaces/frontend/src/components/ContextMenu.vue @@ -1,12 +1,4 @@ - - - + + diff --git a/workspaces/frontend/src/components/CtxMenu.vue b/workspaces/frontend/src/components/CtxMenu.vue new file mode 100644 index 0000000..c88d359 --- /dev/null +++ b/workspaces/frontend/src/components/CtxMenu.vue @@ -0,0 +1,38 @@ + + + diff --git a/workspaces/frontend/src/components/DataTable.vue b/workspaces/frontend/src/components/DataTable.vue new file mode 100644 index 0000000..66aac3e --- /dev/null +++ b/workspaces/frontend/src/components/DataTable.vue @@ -0,0 +1,84 @@ + + + diff --git a/workspaces/frontend/src/components/DragItem.vue b/workspaces/frontend/src/components/DragItem.vue new file mode 100644 index 0000000..13c104a --- /dev/null +++ b/workspaces/frontend/src/components/DragItem.vue @@ -0,0 +1,15 @@ + + + diff --git a/workspaces/frontend/src/components/DropItem.vue b/workspaces/frontend/src/components/DropItem.vue new file mode 100644 index 0000000..f06e8d7 --- /dev/null +++ b/workspaces/frontend/src/components/DropItem.vue @@ -0,0 +1,18 @@ + + + diff --git a/workspaces/frontend/src/components/Error.vue b/workspaces/frontend/src/components/Error.vue index 9470c5a..ac53022 100644 --- a/workspaces/frontend/src/components/Error.vue +++ b/workspaces/frontend/src/components/Error.vue @@ -1,5 +1,40 @@ + + diff --git a/workspaces/frontend/src/components/Modal.vue b/workspaces/frontend/src/components/Modal.vue new file mode 100644 index 0000000..a460521 --- /dev/null +++ b/workspaces/frontend/src/components/Modal.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/workspaces/frontend/src/components/NavBar.vue b/workspaces/frontend/src/components/NavBar.vue index 9c101dc..dbf8719 100644 --- a/workspaces/frontend/src/components/NavBar.vue +++ b/workspaces/frontend/src/components/NavBar.vue @@ -1,7 +1,6 @@ diff --git a/workspaces/frontend/src/views/auth/SignUp.vue b/workspaces/frontend/src/views/AuthSignUp.vue similarity index 71% rename from workspaces/frontend/src/views/auth/SignUp.vue rename to workspaces/frontend/src/views/AuthSignUp.vue index ca85435..ec019ca 100644 --- a/workspaces/frontend/src/views/auth/SignUp.vue +++ b/workspaces/frontend/src/views/AuthSignUp.vue @@ -2,24 +2,30 @@ import Base from "@/views/Base.vue"; import Error from "@/components/Error.vue"; -import { ref } from "vue"; +import { ref, onMounted } from "vue"; +import { router, api, schemas, store } from "@"; -import router from "@/router"; -import { api } from "@"; const login = defineModel("login"); const email = defineModel("email"); const password = defineModel("password"); +const userStore = store.useUser(); const error = ref(null); -async function signup() { +onMounted(async () => { + if (userStore.current) { + router.replace({ name: "home" }); + } +}); + +const signup = async () => { if (!login.value || !email.value || !password.value) { return; } - await api.auth.signup({ name: login.value, password: password.value, email: email.value }) - .then(async user => { router.push({ path: "/auth/signin" }); }) - .catch(err => { error.value = err.message; }); + await api.authSignup({ body: { name: login.value, password: password.value, email: email.value }, throwOnError: true }) + .then(async () => { router.replace({ name: "signin" }); }) + .catch(err => { error.value = err; }); }; @@ -44,7 +50,7 @@ async function signup() { - {{ error }} + diff --git a/workspaces/frontend/src/views/Base.vue b/workspaces/frontend/src/views/Base.vue index 9f3f78d..9a16c6e 100644 --- a/workspaces/frontend/src/views/Base.vue +++ b/workspaces/frontend/src/views/Base.vue @@ -1,30 +1,25 @@