feat(schemas): add new API schema definitions for invitation, deployment, and issue management

- Add AcceptInvitationParams and AcceptInvitationRequest schemas
- Add AddDeployKeyParams, AddDomainParams, AddGpgKeyParams, AddMemberParams, AddReplyParams, AddRepoMemberParams, and AddSshKeyParams schemas
- Add ApiEmptyResponse and ApiErrorResponse schemas
- Add ApiResponse schemas for BranchMergeCheck, BranchProtectionRule, CaptchaResponse, ContextMe, CreateInvitationResponse, EmailResponse, Enable2FAResponse, Get2FAStatusResponse
- Add ApiResponse schemas for Issue, IssueAssignee, IssueComment, IssueEvent, IssueLabel, IssueLabelRelation, IssueMilestone, IssuePrRelation, IssueReaction, IssueRepoRelation, IssueSubscriber, and IssueTemplate
- Add ApiResponse schemas for Option_BranchProtectionRule, PrAssignee, PrCheckRun, PrCommit, PrEvent, PrFile, and PrLabel
This commit is contained in:
zhenyi
2026-06-07 21:20:51 +08:00
commit defde2bca9
706 changed files with 72213 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
+28
View File
@@ -0,0 +1,28 @@
## Usage
```bash
$ npm install # or pnpm install or yarn install
```
### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs)
## Available Scripts
In the project directory, you can run:
### `npm run dev`
Runs the app in the development mode.<br>
Open [http://localhost:5173](http://localhost:5173) to view it in the browser.
### `npm run build`
Builds the app for production to the `dist` folder.<br>
It correctly bundles Solid in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.<br>
Your app is ready to be deployed!
## Deployment
Learn more about deploying your application with the [documentations](https://vite.dev/guide/static-deploy.html)
+419
View File
@@ -0,0 +1,419 @@
{
"lockfileVersion": 1,
"configVersion": 1,
"workspaces": {
"": {
"name": "appwebks",
"dependencies": {
"@solid-primitives/history": "^0.2.3",
"@solid-primitives/i18n": "^2.2.1",
"@solid-primitives/keyboard": "^1.3.5",
"@solid-primitives/sse": "^0.0.102",
"@solid-primitives/storage": "^4.3.4",
"@solid-primitives/websocket": "^1.4.0",
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^0.16.1",
"@tailwindcss/vite": "^4.3.0",
"@tanstack/solid-query": "^5.101.0",
"axios": "^1.17.0",
"ky": "^2.0.2",
"solid-icons": "^1.2.0",
"solid-js": "^1.9.12",
"tailwindcss": "^4.3.0",
"zod": "^4.4.3",
},
"devDependencies": {
"@types/node": "^24.12.3",
"openapi-typescript-codegen": "^0.30.0",
"typescript": "~6.0.2",
"vite": "^8.0.12",
"vite-plugin-solid": "^2.11.12",
},
},
},
"packages": {
"@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@14.2.1", "https://registry.npmmirror.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.2.1.tgz", { "dependencies": { "js-yaml": "^4.1.0" }, "peerDependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg=="],
"@babel/code-frame": ["@babel/code-frame@7.29.7", "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
"@babel/compat-data": ["@babel/compat-data@7.29.7", "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="],
"@babel/core": ["@babel/core@7.29.7", "https://registry.npmmirror.com/@babel/core/-/core-7.29.7.tgz", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="],
"@babel/generator": ["@babel/generator@7.29.7", "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.7.tgz", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="],
"@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="],
"@babel/helper-globals": ["@babel/helper-globals@7.29.7", "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="],
"@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="],
"@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="],
"@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="],
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
"@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="],
"@babel/helpers": ["@babel/helpers@7.29.7", "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="],
"@babel/parser": ["@babel/parser@7.29.7", "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
"@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.29.7", "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A=="],
"@babel/template": ["@babel/template@7.29.7", "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="],
"@babel/traverse": ["@babel/traverse@7.29.7", "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.7.tgz", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/types": "^7.29.7", "debug": "^4.3.1" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="],
"@babel/types": ["@babel/types@7.29.7", "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
"@emnapi/core": ["@emnapi/core@1.10.0", "https://registry.npmmirror.com/@emnapi/core/-/core-1.10.0.tgz", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
"@emnapi/runtime": ["@emnapi/runtime@1.10.0", "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.10.0.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
"@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="],
"@oxc-project/types": ["@oxc-project/types@0.133.0", "https://registry.npmmirror.com/@oxc-project/types/-/types-0.133.0.tgz", {}, "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA=="],
"@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", { "os": "android", "cpu": "arm64" }, "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw=="],
"@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA=="],
"@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg=="],
"@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g=="],
"@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", { "os": "linux", "cpu": "arm" }, "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw=="],
"@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw=="],
"@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q=="],
"@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg=="],
"@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg=="],
"@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", { "os": "linux", "cpu": "x64" }, "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg=="],
"@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", { "os": "linux", "cpu": "x64" }, "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow=="],
"@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", { "os": "none", "cpu": "arm64" }, "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg=="],
"@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg=="],
"@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g=="],
"@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.3", "https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", { "os": "win32", "cpu": "x64" }, "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA=="],
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="],
"@solid-primitives/event-listener": ["@solid-primitives/event-listener@2.4.5", "https://registry.npmmirror.com/@solid-primitives/event-listener/-/event-listener-2.4.5.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA=="],
"@solid-primitives/history": ["@solid-primitives/history@0.2.3", "https://registry.npmmirror.com/@solid-primitives/history/-/history-0.2.3.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-Qy9Xh5T2NNnPFhMWFDFBeXG118A1te/rqbroMETRNCLdyggAbjjX0KCPp7yCTYPG0KpySTUFLoC3NDiZRfSO6g=="],
"@solid-primitives/i18n": ["@solid-primitives/i18n@2.2.1", "https://registry.npmmirror.com/@solid-primitives/i18n/-/i18n-2.2.1.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-TnTnE2Ku11MGYZ1JzhJ8pYscwg1fr9MteoYxPwsfxWfh9Jp5K7RRJncJn9BhOHvNLwROjqOHZ46PT7sPHqbcXw=="],
"@solid-primitives/keyboard": ["@solid-primitives/keyboard@1.3.5", "https://registry.npmmirror.com/@solid-primitives/keyboard/-/keyboard-1.3.5.tgz", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ=="],
"@solid-primitives/rootless": ["@solid-primitives/rootless@1.5.3", "https://registry.npmmirror.com/@solid-primitives/rootless/-/rootless-1.5.3.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA=="],
"@solid-primitives/sse": ["@solid-primitives/sse@0.0.102", "https://registry.npmmirror.com/@solid-primitives/sse/-/sse-0.0.102.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-2s/MMoGfK03lrFjVlYk1lIW1ltlPgaMehLjxBzknBzkNPyEuAP2Xco5vxGTY9L6UQJuzNQ4S8oOpmQaaO5l5jg=="],
"@solid-primitives/storage": ["@solid-primitives/storage@4.3.4", "https://registry.npmmirror.com/@solid-primitives/storage/-/storage-4.3.4.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "@tauri-apps/plugin-store": "*", "solid-js": "^1.6.12", "solid-start": "*" }, "optionalPeers": ["@tauri-apps/plugin-store", "solid-start"] }, "sha512-GSxPAIuyxhJWOcv7n10iv3aid5oHN3KUgyA9IV0GYWlPpgyGs43aS9E85b0VXDLoH+D4ThNK8+2WEJ8B/S6Ccg=="],
"@solid-primitives/utils": ["@solid-primitives/utils@6.4.0", "https://registry.npmmirror.com/@solid-primitives/utils/-/utils-6.4.0.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A=="],
"@solid-primitives/websocket": ["@solid-primitives/websocket@1.4.0", "https://registry.npmmirror.com/@solid-primitives/websocket/-/websocket-1.4.0.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-XJIObSUrg6oBvBP1z8CF1lg3npWEgOYc08CbGv9SIIpruG0ROa1cAwEuVLksF3oqZl8NIMKbDFWttD45q0LpIg=="],
"@solidjs/meta": ["@solidjs/meta@0.29.4", "https://registry.npmmirror.com/@solidjs/meta/-/meta-0.29.4.tgz", { "peerDependencies": { "solid-js": ">=1.8.4" } }, "sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g=="],
"@solidjs/router": ["@solidjs/router@0.16.1", "https://registry.npmmirror.com/@solidjs/router/-/router-0.16.1.tgz", { "peerDependencies": { "solid-js": "^1.8.6" } }, "sha512-IhyjedgC6LRpw/8CPGGI89FrV+r0xTHzOl2c4CRyzYQ1bLepJxbVI1LLKvsavMWY5TRBRacV7hAeOhuTXkjiqg=="],
"@tailwindcss/node": ["@tailwindcss/node@4.3.0", "https://registry.npmmirror.com/@tailwindcss/node/-/node-4.3.0.tgz", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.21.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.0" } }, "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g=="],
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide/-/oxide-4.3.0.tgz", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.0", "@tailwindcss/oxide-darwin-arm64": "4.3.0", "@tailwindcss/oxide-darwin-x64": "4.3.0", "@tailwindcss/oxide-freebsd-x64": "4.3.0", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", "@tailwindcss/oxide-linux-x64-musl": "4.3.0", "@tailwindcss/oxide-wasm32-wasi": "4.3.0", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" } }, "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg=="],
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng=="],
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ=="],
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA=="],
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ=="],
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA=="],
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg=="],
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ=="],
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ=="],
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg=="],
"@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", { "dependencies": { "@emnapi/core": "^1.10.0", "@emnapi/runtime": "^1.10.0", "@emnapi/wasi-threads": "^1.2.1", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA=="],
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ=="],
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.0", "https://registry.npmmirror.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA=="],
"@tailwindcss/vite": ["@tailwindcss/vite@4.3.0", "https://registry.npmmirror.com/@tailwindcss/vite/-/vite-4.3.0.tgz", { "dependencies": { "@tailwindcss/node": "4.3.0", "@tailwindcss/oxide": "4.3.0", "tailwindcss": "4.3.0" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw=="],
"@tanstack/query-core": ["@tanstack/query-core@5.101.0", "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-5.101.0.tgz", {}, "sha512-cQetA74EB+seWySv1TTKr828TnP0u39m6LykwDXIo84SNortpDkp30TMEjkqtYCNP9c40uT/iwl6MLiufEt0Ow=="],
"@tanstack/solid-query": ["@tanstack/solid-query@5.101.0", "https://registry.npmmirror.com/@tanstack/solid-query/-/solid-query-5.101.0.tgz", { "dependencies": { "@tanstack/query-core": "5.101.0" }, "peerDependencies": { "solid-js": "^1.6.0" } }, "sha512-XoPWynbaWquvSisMvUirakfD9OmLas1cOwt1gBDUTn8HC2CVkZm+O/jBgEa5SL5LrY6vxmWjzzskhXkywLfymw=="],
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
"@types/babel__core": ["@types/babel__core@7.20.5", "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
"@types/babel__generator": ["@types/babel__generator@7.27.0", "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
"@types/babel__template": ["@types/babel__template@7.4.4", "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
"@types/babel__traverse": ["@types/babel__traverse@7.28.0", "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
"@types/json-schema": ["@types/json-schema@7.0.15", "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
"@types/node": ["@types/node@24.13.1", "https://registry.npmmirror.com/@types/node/-/node-24.13.1.tgz", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-RSpUJGmvsJ1ZeBehQZFhIdpsz+bIpES0nIQXko4Ybq+N+kX6XvOq3Jo+iJ82FWLdblFq85AsMikd3m35jgezYg=="],
"agent-base": ["agent-base@6.0.2", "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
"argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
"asynckit": ["asynckit@0.4.0", "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
"axios": ["axios@1.17.0", "https://registry.npmmirror.com/axios/-/axios-1.17.0.tgz", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw=="],
"babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.7", "https://registry.npmmirror.com/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.7.tgz", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ=="],
"babel-preset-solid": ["babel-preset-solid@1.9.12", "https://registry.npmmirror.com/babel-preset-solid/-/babel-preset-solid-1.9.12.tgz", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.40.6" }, "peerDependencies": { "@babel/core": "^7.0.0", "solid-js": "^1.9.12" }, "optionalPeers": ["solid-js"] }, "sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg=="],
"baseline-browser-mapping": ["baseline-browser-mapping@2.10.34", "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw=="],
"browserslist": ["browserslist@4.28.2", "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.2.tgz", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="],
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
"camelcase": ["camelcase@6.3.0", "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="],
"caniuse-lite": ["caniuse-lite@1.0.30001797", "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="],
"combined-stream": ["combined-stream@1.0.8", "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
"commander": ["commander@14.0.3", "https://registry.npmmirror.com/commander/-/commander-14.0.3.tgz", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
"convert-source-map": ["convert-source-map@2.0.0", "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
"csstype": ["csstype@3.2.3", "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
"debug": ["debug@4.4.3", "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"delayed-stream": ["delayed-stream@1.0.0", "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
"detect-libc": ["detect-libc@2.1.2", "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
"dunder-proto": ["dunder-proto@1.0.1", "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
"electron-to-chromium": ["electron-to-chromium@1.5.368", "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz", {}, "sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw=="],
"enhanced-resolve": ["enhanced-resolve@5.23.0", "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA=="],
"entities": ["entities@6.0.1", "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
"es-define-property": ["es-define-property@1.0.1", "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"es-errors": ["es-errors@1.3.0", "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
"es-object-atoms": ["es-object-atoms@1.1.2", "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="],
"es-set-tostringtag": ["es-set-tostringtag@2.1.0", "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
"escalade": ["escalade@3.2.0", "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
"fdir": ["fdir@6.5.0", "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
"follow-redirects": ["follow-redirects@1.16.0", "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.16.0.tgz", { "peerDependencies": { "debug": "*" }, "optionalPeers": ["debug"] }, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="],
"form-data": ["form-data@4.0.5", "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="],
"fs-extra": ["fs-extra@11.3.5", "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.5.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
"fsevents": ["fsevents@2.3.3", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
"function-bind": ["function-bind@1.1.2", "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
"gensync": ["gensync@1.0.0-beta.2", "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
"get-intrinsic": ["get-intrinsic@1.3.0", "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
"get-proto": ["get-proto@1.0.1", "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
"gopd": ["gopd@1.2.0", "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
"graceful-fs": ["graceful-fs@4.2.11", "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
"handlebars": ["handlebars@4.7.9", "https://registry.npmmirror.com/handlebars/-/handlebars-4.7.9.tgz", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ=="],
"has-symbols": ["has-symbols@1.1.0", "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
"has-tostringtag": ["has-tostringtag@1.0.2", "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
"hasown": ["hasown@2.0.4", "https://registry.npmmirror.com/hasown/-/hasown-2.0.4.tgz", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="],
"html-entities": ["html-entities@2.3.3", "https://registry.npmmirror.com/html-entities/-/html-entities-2.3.3.tgz", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="],
"https-proxy-agent": ["https-proxy-agent@5.0.1", "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="],
"is-what": ["is-what@4.1.16", "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="],
"jiti": ["jiti@2.7.0", "https://registry.npmmirror.com/jiti/-/jiti-2.7.0.tgz", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
"js-tokens": ["js-tokens@4.0.0", "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
"js-yaml": ["js-yaml@4.2.0", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.2.0.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="],
"jsesc": ["jsesc@3.1.0", "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
"json5": ["json5@2.2.3", "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
"jsonfile": ["jsonfile@6.2.1", "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
"ky": ["ky@2.0.2", "https://registry.npmmirror.com/ky/-/ky-2.0.2.tgz", {}, "sha512-/GmXpo9F9W+f8n4Ivr2iH+7h7wL7jLbLKWkMlpflcCRb6kGjBfTlASEXaZ9qUgNTn4VgS0P2pwxxzQ4EM6Ulgg=="],
"lightningcss": ["lightningcss@1.32.0", "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.32.0.tgz", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
"lru-cache": ["lru-cache@5.1.1", "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
"magic-string": ["magic-string@0.30.21", "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
"math-intrinsics": ["math-intrinsics@1.1.0", "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
"merge-anything": ["merge-anything@5.1.7", "https://registry.npmmirror.com/merge-anything/-/merge-anything-5.1.7.tgz", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="],
"mime-db": ["mime-db@1.52.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
"mime-types": ["mime-types@2.1.35", "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
"minimist": ["minimist@1.2.8", "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
"ms": ["ms@2.1.3", "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"nanoid": ["nanoid@3.3.12", "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.12.tgz", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="],
"neo-async": ["neo-async@2.6.2", "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="],
"node-releases": ["node-releases@2.0.47", "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.47.tgz", {}, "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og=="],
"openapi-typescript-codegen": ["openapi-typescript-codegen@0.30.0", "https://registry.npmmirror.com/openapi-typescript-codegen/-/openapi-typescript-codegen-0.30.0.tgz", { "dependencies": { "@apidevtools/json-schema-ref-parser": "^14.2.1", "camelcase": "^6.3.0", "commander": "^14.0.2", "fs-extra": "^11.3.3", "handlebars": "^4.7.8" }, "bin": { "openapi": "bin/index.js" } }, "sha512-NO24vrOYEEREkuEwtLemXiV0/3wUj1HvS+0UuAinVNWKJOyNlXTj5hehdW9Dyob4u5YGrRG9dc9TBZW7/UszGw=="],
"parse5": ["parse5@7.3.0", "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
"picocolors": ["picocolors@1.1.1", "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
"picomatch": ["picomatch@4.0.4", "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
"postcss": ["postcss@8.5.15", "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="],
"proxy-from-env": ["proxy-from-env@2.1.0", "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="],
"rolldown": ["rolldown@1.0.3", "https://registry.npmmirror.com/rolldown/-/rolldown-1.0.3.tgz", { "dependencies": { "@oxc-project/types": "=0.133.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.3", "@rolldown/binding-darwin-arm64": "1.0.3", "@rolldown/binding-darwin-x64": "1.0.3", "@rolldown/binding-freebsd-x64": "1.0.3", "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", "@rolldown/binding-linux-arm64-gnu": "1.0.3", "@rolldown/binding-linux-arm64-musl": "1.0.3", "@rolldown/binding-linux-ppc64-gnu": "1.0.3", "@rolldown/binding-linux-s390x-gnu": "1.0.3", "@rolldown/binding-linux-x64-gnu": "1.0.3", "@rolldown/binding-linux-x64-musl": "1.0.3", "@rolldown/binding-openharmony-arm64": "1.0.3", "@rolldown/binding-wasm32-wasi": "1.0.3", "@rolldown/binding-win32-arm64-msvc": "1.0.3", "@rolldown/binding-win32-x64-msvc": "1.0.3" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g=="],
"semver": ["semver@6.3.1", "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"seroval": ["seroval@1.5.4", "https://registry.npmmirror.com/seroval/-/seroval-1.5.4.tgz", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="],
"seroval-plugins": ["seroval-plugins@1.5.4", "https://registry.npmmirror.com/seroval-plugins/-/seroval-plugins-1.5.4.tgz", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="],
"solid-icons": ["solid-icons@1.2.0", "https://registry.npmmirror.com/solid-icons/-/solid-icons-1.2.0.tgz", { "peerDependencies": { "solid-js": "*" } }, "sha512-yjQxWQMi9l19P5Af9vjsvalTMDFPDL4XD6etrUdNxNVhFp1bMYF0SFwUa5VYDfJ7u0SF3Qkz/F7BZxqcLUwklw=="],
"solid-js": ["solid-js@1.9.13", "https://registry.npmmirror.com/solid-js/-/solid-js-1.9.13.tgz", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", "seroval-plugins": "~1.5.0" } }, "sha512-6hJeJMOcEX8ktqjpDoJZEmld3ijvcvWBDtiXBm7f4332SiFN66QeAQI1REQshvyUoISsSeJ4PHDauKYbwao9JQ=="],
"solid-refresh": ["solid-refresh@0.6.3", "https://registry.npmmirror.com/solid-refresh/-/solid-refresh-0.6.3.tgz", { "dependencies": { "@babel/generator": "^7.23.6", "@babel/helper-module-imports": "^7.22.15", "@babel/types": "^7.23.6" }, "peerDependencies": { "solid-js": "^1.3" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="],
"source-map": ["source-map@0.6.1", "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
"source-map-js": ["source-map-js@1.2.1", "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
"tailwindcss": ["tailwindcss@4.3.0", "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.3.0.tgz", {}, "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q=="],
"tapable": ["tapable@2.3.3", "https://registry.npmmirror.com/tapable/-/tapable-2.3.3.tgz", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
"tinyglobby": ["tinyglobby@0.2.17", "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
"tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"typescript": ["typescript@6.0.3", "https://registry.npmmirror.com/typescript/-/typescript-6.0.3.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
"uglify-js": ["uglify-js@3.19.3", "https://registry.npmmirror.com/uglify-js/-/uglify-js-3.19.3.tgz", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="],
"undici-types": ["undici-types@7.18.2", "https://registry.npmmirror.com/undici-types/-/undici-types-7.18.2.tgz", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
"universalify": ["universalify@2.0.1", "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"update-browserslist-db": ["update-browserslist-db@1.2.3", "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
"vite": ["vite@8.0.16", "https://registry.npmmirror.com/vite/-/vite-8.0.16.tgz", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "1.0.3", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw=="],
"vite-plugin-solid": ["vite-plugin-solid@2.11.12", "https://registry.npmmirror.com/vite-plugin-solid/-/vite-plugin-solid-2.11.12.tgz", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^1.0.4" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-FgjPcx2OwX9h6f28jli7A4bG7PP3te8uyakE5iqsmpq3Jqi1TWLgSroC9N6cMfGRU2zXsl4Q6ISvTr2VL0QHpA=="],
"vitefu": ["vitefu@1.1.3", "https://registry.npmmirror.com/vitefu/-/vitefu-1.1.3.tgz", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
"wordwrap": ["wordwrap@1.0.0", "https://registry.npmmirror.com/wordwrap/-/wordwrap-1.0.0.tgz", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="],
"yallist": ["yallist@3.1.1", "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
"zod": ["zod@4.4.3", "https://registry.npmmirror.com/zod/-/zod-4.4.3.tgz", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "https://registry.npmmirror.com/@emnapi/core/-/core-1.10.0.tgz", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.10.0.tgz", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
"@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
"@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="],
"@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="],
}
}
+35
View File
@@ -0,0 +1,35 @@
import { createRequire } from 'node:module';
import { dirname, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import { readFile, writeFile } from 'node:fs/promises';
const require = createRequire(import.meta.url);
const { generate } = require('openapi-typescript-codegen');
const rootDir = dirname(fileURLToPath(import.meta.url));
const input = resolve(rootDir, 'openapi.json');
const output = resolve(rootDir, 'src/client');
await generate({
input,
output,
httpClient: 'axios',
useOptions: true,
useUnionTypes: true,
exportCore: true,
exportServices: true,
exportModels: true,
exportSchemas: true,
indent: 'tab',
});
console.log(`Generated OpenAPI client: ${output}`);
const openApiPath = resolve(output, 'core/OpenAPI.ts');
const openApiContent = await readFile(openApiPath, 'utf8');
const updatedOpenApiContent = openApiContent.replace(
'WITH_CREDENTIALS: false,',
'WITH_CREDENTIALS: true,',
);
await writeFile(openApiPath, updatedOpenApiContent);
console.log(`Updated OpenAPI.ts`);
+13
View File
@@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>appwebks</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/index.tsx"></script>
</body>
</html>
+38500
View File
File diff suppressed because it is too large Load Diff
+40
View File
@@ -0,0 +1,40 @@
{
"name": "appwebks",
"private": true,
"version": "0.0.0",
"type": "module",
"imports": {
"@/*": "./src/*"
},
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"preview": "vite preview",
"genapi": "node genapi.js"
},
"dependencies": {
"@solid-primitives/history": "^0.2.3",
"@solid-primitives/i18n": "^2.2.1",
"@solid-primitives/keyboard": "^1.3.5",
"@solid-primitives/sse": "^0.0.102",
"@solid-primitives/storage": "^4.3.4",
"@solid-primitives/websocket": "^1.4.0",
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^0.16.1",
"@tailwindcss/vite": "^4.3.0",
"@tanstack/solid-query": "^5.101.0",
"axios": "^1.17.0",
"ky": "^2.0.2",
"solid-icons": "^1.2.0",
"solid-js": "^1.9.12",
"tailwindcss": "^4.3.0",
"zod": "^4.4.3"
},
"devDependencies": {
"@types/node": "^24.12.3",
"openapi-typescript-codegen": "^0.30.0",
"typescript": "~6.0.2",
"vite": "^8.0.12",
"vite-plugin-solid": "^2.11.12"
}
}
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.3 KiB

+24
View File
@@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="bluesky-icon" viewBox="0 0 16 17">
<g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
<defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
</symbol>
<symbol id="discord-icon" viewBox="0 0 20 19">
<path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
</symbol>
<symbol id="documentation-icon" viewBox="0 0 21 20">
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
</symbol>
<symbol id="github-icon" viewBox="0 0 19 19">
<path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
</symbol>
<symbol id="social-icon" viewBox="0 0 20 20">
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
</symbol>
<symbol id="x-icon" viewBox="0 0 19 19">
<path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

+184
View File
@@ -0,0 +1,184 @@
.counter {
font-size: 16px;
padding: 5px 10px;
border-radius: 5px;
color: var(--accent);
background: var(--accent-bg);
border: 2px solid transparent;
transition: border-color 0.3s;
margin-bottom: 24px;
&:hover {
border-color: var(--accent-border);
}
&:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
}
.hero {
position: relative;
.base,
.framework,
.vite {
inset-inline: 0;
margin: 0 auto;
}
.base {
width: 170px;
position: relative;
z-index: 0;
}
.framework,
.vite {
position: absolute;
}
.framework {
z-index: 1;
top: 34px;
height: 28px;
transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg)
scale(1.4);
}
.vite {
z-index: 0;
top: 107px;
height: 26px;
width: auto;
transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg)
scale(0.8);
}
}
#center {
display: flex;
flex-direction: column;
gap: 25px;
place-content: center;
place-items: center;
flex-grow: 1;
@media (max-width: 1024px) {
padding: 32px 20px 24px;
gap: 18px;
}
}
#next-steps {
display: flex;
border-top: 1px solid var(--border);
text-align: left;
& > div {
flex: 1 1 0;
padding: 32px;
@media (max-width: 1024px) {
padding: 24px 20px;
}
}
.icon {
margin-bottom: 16px;
width: 22px;
height: 22px;
}
@media (max-width: 1024px) {
flex-direction: column;
text-align: center;
}
}
#docs {
border-right: 1px solid var(--border);
@media (max-width: 1024px) {
border-right: none;
border-bottom: 1px solid var(--border);
}
}
#next-steps ul {
list-style: none;
padding: 0;
display: flex;
gap: 8px;
margin: 32px 0 0;
.logo {
height: 18px;
}
a {
color: var(--text-h);
font-size: 16px;
border-radius: 6px;
background: var(--social-bg);
display: flex;
padding: 6px 12px;
align-items: center;
gap: 8px;
text-decoration: none;
transition: box-shadow 0.3s;
&:hover {
box-shadow: var(--shadow);
}
.button-icon {
height: 18px;
width: 18px;
}
}
@media (max-width: 1024px) {
margin-top: 20px;
flex-wrap: wrap;
justify-content: center;
li {
flex: 1 1 calc(50% - 8px);
}
a {
width: 100%;
justify-content: center;
box-sizing: border-box;
}
}
}
#spacer {
height: 88px;
border-top: 1px solid var(--border);
@media (max-width: 1024px) {
height: 48px;
}
}
.ticks {
position: relative;
width: 100%;
&::before,
&::after {
content: '';
position: absolute;
top: -4.5px;
border: 5px solid transparent;
}
&::before {
left: 0;
border-left-color: var(--border);
}
&::after {
right: 0;
border-right-color: var(--border);
}
}
+1
View File
@@ -0,0 +1 @@
export default function App() { return null; }
+579
View File
@@ -0,0 +1,579 @@
/* ─────────────────────────────────────────────────────────────────
* Authks — Design System Tokens (Light + Dark)
* ───────────────────────────────────────────────────────────────── */
/* Override #root during auth pages */
.auth-page #root {
width: 100%;
max-width: none;
border: none;
text-align: left;
padding: 0;
margin: 0;
}
.auth-root {
/* Reset conflicting styles from index.css */
margin: 0;
padding: 0;
border: none;
/* Surfaces */
--bg: #ffffff;
--surface: #f5f5f7;
--surface-warm: #fbfbfd;
/* Foreground ramp */
--fg: #1d1d1f;
--fg-2: #424245;
--muted: #6e6e73;
--meta: #86868b;
/* Borders */
--border: #d2d2d7;
--border-soft: #e8e8ed;
/* Accent */
--accent: #0071e3;
--accent-on: #ffffff;
--accent-hover: #0077ed;
--accent-active: #0066cc;
/* Semantic */
--success: #16a34a;
--warn: #eab308;
--danger: #dc2626;
/* Typography */
--font-display: "SF Pro Display", "SF Pro Icons", "Helvetica Neue", "Inter", system-ui, -apple-system, sans-serif;
--font-body: "SF Pro Text", "SF Pro Icons", "Helvetica Neue", "Inter", system-ui, -apple-system, sans-serif;
--font-mono: "SF Mono", ui-monospace, "JetBrains Mono", Menlo, Monaco, Consolas, monospace;
/* Radius */
--radius-sm: 8px;
--radius-md: 12px;
--radius-lg: 18px;
--radius-pill: 980px;
/* Motion */
--motion-fast: 150ms;
--motion-base: 220ms;
--ease-standard: cubic-bezier(0.28, 0, 0.22, 1);
/* Focus */
--focus-ring: 0 0 0 4px color-mix(in oklab, var(--accent), transparent 65%);
/* Elevation */
--elev-flat: none;
--elev-ring: 0 0 0 1px var(--border);
--elev-raised: 0 12px 32px rgba(0, 0, 0, 0.08);
font-family: var(--font-body);
font-size: 17px;
line-height: 1.47;
color: var(--fg);
background: var(--surface);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
min-height: 100dvh;
}
@media (prefers-color-scheme: dark) {
.auth-root {
--bg: #1c1c1e;
--surface: #2c2c2e;
--surface-warm: #232325;
--fg: #f5f5f7;
--fg-2: #d1d1d6;
--muted: #98989d;
--meta: #86868b;
--border: #48484a;
--border-soft: #38383a;
--accent: #0a84ff;
--accent-on: #ffffff;
--accent-hover: #409cff;
--accent-active: #0071e3;
--success: #30d158;
--warn: #ffd60a;
--danger: #ff453a;
--elev-raised: 0 12px 32px rgba(0, 0, 0, 0.4);
}
}
.auth-root *,
.auth-root ::before,
.auth-root ::after {
box-sizing: border-box;
}
.auth-root h1,
.auth-root h2,
.auth-root h3,
.auth-root h4,
.auth-root h5,
.auth-root h6 {
font-family: var(--font-display);
font-weight: 600;
font-size: inherit;
letter-spacing: -0.015em;
margin: 0;
}
.auth-root a {
color: var(--accent);
text-decoration: none;
transition: color var(--motion-fast) var(--ease-standard);
}
.auth-root a:hover {
color: var(--accent-hover);
text-decoration: underline;
}
/* ─── Form field base ─────────────────────────────────────────────── */
.auth-root .field {
display: flex;
flex-direction: column;
gap: 6px;
min-width: 0;
}
.auth-root .field label {
font-size: 14px;
font-weight: 600;
color: var(--fg);
}
.auth-root .field .field-optional {
font-size: 12px;
font-weight: 400;
color: var(--meta);
margin-left: 4px;
}
.auth-root .field input {
width: 100%;
min-width: 0;
height: 48px;
padding: 0 16px;
font-family: var(--font-body);
font-size: 17px;
color: var(--fg);
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
outline: none;
transition: border-color var(--motion-fast) var(--ease-standard),
box-shadow var(--motion-fast) var(--ease-standard);
}
.auth-root .field input::placeholder {
color: var(--meta);
}
.auth-root .field input:hover {
border-color: var(--meta);
}
.auth-root .field input:focus-visible {
border-color: var(--accent);
box-shadow: var(--focus-ring);
}
.auth-root .field input.input-error {
border-color: var(--danger);
}
.auth-root .field input.input-error:focus-visible {
box-shadow: 0 0 0 4px color-mix(in oklab, var(--danger), transparent 65%);
}
.auth-root .field input:disabled {
opacity: 0.6;
cursor: not-allowed;
background: var(--surface);
}
/* ─── Password group ──────────────────────────────────────────────── */
.auth-root .password-group {
position: relative;
display: flex;
align-items: center;
}
.auth-root .password-group input {
width: 100%;
height: 48px;
padding: 0 44px 0 16px;
font-family: var(--font-body);
font-size: 17px;
color: var(--fg);
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
outline: none;
transition: border-color var(--motion-fast) var(--ease-standard),
box-shadow var(--motion-fast) var(--ease-standard);
}
.auth-root .password-group input::placeholder {
color: var(--meta);
}
.auth-root .password-group input:hover {
border-color: var(--meta);
}
.auth-root .password-group input:focus-visible {
border-color: var(--accent);
box-shadow: var(--focus-ring);
}
.auth-root .password-group input.input-error {
border-color: var(--danger);
}
.auth-root .password-group input.input-error:focus-visible {
box-shadow: 0 0 0 4px color-mix(in oklab, var(--danger), transparent 65%);
}
.auth-root .password-group input:disabled {
opacity: 0.6;
cursor: not-allowed;
background: var(--surface);
}
.auth-root .eye-btn {
position: absolute;
right: 8px;
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background: transparent;
border: none;
border-radius: 6px;
cursor: pointer;
color: var(--meta);
transition: background var(--motion-fast) var(--ease-standard);
}
.auth-root .eye-btn:hover {
background: color-mix(in oklab, var(--fg), transparent 94%);
}
.auth-root .eye-btn:focus-visible {
outline: none;
box-shadow: var(--focus-ring);
}
/* ─── Error banner ─────────────────────────────────────────────────── */
.auth-root .error-banner {
display: flex;
align-items: center;
gap: 10px;
padding: 12px 16px;
font-size: 14px;
color: var(--danger);
background: color-mix(in oklab, var(--danger), transparent 92%);
border: 1px solid color-mix(in oklab, var(--danger), transparent 80%);
border-radius: 12px;
line-height: 1.4;
}
.auth-root .error-banner[role="alert"]:focus {
outline: none;
box-shadow: 0 0 0 4px color-mix(in oklab, var(--danger), transparent 65%);
}
/* ─── Buttons ────────────────────────────────────────────────────── */
.auth-root .btn-primary {
display: inline-flex;
align-items: center;
justify-content: center;
height: 48px;
padding: 0 24px;
font-family: var(--font-body);
font-size: 17px;
font-weight: 600;
color: var(--accent-on);
background: var(--accent);
border: none;
border-radius: var(--radius-md);
cursor: pointer;
transition: background var(--motion-fast) var(--ease-standard),
transform var(--motion-fast) var(--ease-standard);
user-select: none;
-webkit-tap-highlight-color: transparent;
}
.auth-root .btn-primary:hover {
background: var(--accent-hover);
}
.auth-root .btn-primary:active {
background: var(--accent-active);
transform: scale(0.98);
}
.auth-root .btn-primary:focus-visible {
outline: none;
box-shadow: var(--focus-ring);
}
.auth-root .btn-primary:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.auth-root .btn-secondary {
display: inline-flex;
align-items: center;
justify-content: center;
height: 48px;
padding: 0 20px;
font-family: var(--font-body);
font-size: 17px;
font-weight: 600;
color: var(--accent);
background: transparent;
border: 1px solid var(--border-soft);
border-radius: var(--radius-md);
cursor: pointer;
transition: background var(--motion-fast) var(--ease-standard),
border-color var(--motion-fast) var(--ease-standard);
}
.auth-root .btn-secondary:hover {
background: color-mix(in oklab, var(--accent), transparent 92%);
border-color: color-mix(in oklab, var(--accent), transparent 70%);
}
.auth-root .btn-secondary:focus-visible {
outline: none;
box-shadow: var(--focus-ring);
}
.auth-root .btn-block {
width: 100%;
}
/* ─── Form layout primitives ──────────────────────────────────────── */
.auth-root .form-stack {
display: flex;
flex-direction: column;
gap: 20px;
}
.auth-root .form-row {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 16px;
width: 100%;
}
@media (max-width: 600px) {
.auth-root .form-row {
grid-template-columns: 1fr;
gap: 14px;
}
}
.auth-root .form-header {
font-family: var(--font-display);
font-size: 28px;
font-weight: 600;
color: var(--fg);
letter-spacing: -0.015em;
text-align: center;
margin: 0 0 2px;
}
.auth-root .form-desc {
font-family: var(--font-body);
font-size: 15px;
color: var(--muted);
line-height: 1.47;
text-align: center;
margin: 0;
}
.auth-root .form-hint {
font-family: var(--font-body);
font-size: 13px;
color: var(--meta);
line-height: 1.4;
margin: -8px 0 0;
}
/* ─── Divider ──────────────────────────────────────────────────────── */
.auth-root .auth-divider {
display: flex;
align-items: center;
gap: 16px;
margin: 2px 0;
}
.auth-root .auth-divider::before,
.auth-root .auth-divider::after {
content: '';
flex: 1;
height: 1px;
background: var(--border-soft);
}
.auth-root .auth-divider span {
font-family: var(--font-body);
font-size: 13px;
color: var(--meta);
flex-shrink: 0;
}
/* ─── Spinner ──────────────────────────────────────────────────────── */
.auth-root .spinner-sm {
display: inline-block;
width: 16px;
height: 16px;
border: 2px solid rgba(255, 255, 255, 0.3);
border-top-color: white;
border-radius: 50%;
animation: spin 0.6s linear infinite;
flex-shrink: 0;
}
/* ─── Back link ────────────────────────────────────────────────────── */
.auth-root .back-link {
display: inline-flex;
align-items: center;
gap: 6px;
font-family: var(--font-body);
font-size: 14px;
font-weight: 500;
color: var(--muted);
text-decoration: none;
transition: color var(--motion-fast) var(--ease-standard);
}
.auth-root .back-link:hover {
color: var(--fg);
text-decoration: none;
}
.auth-root .forgot-link-row {
display: flex;
justify-content: flex-end;
margin-top: -8px;
}
/* ─── Status icon ──────────────────────────────────────────────────── */
.auth-root .status-icon {
width: 56px;
height: 56px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.auth-root .status-icon--accent {
background: color-mix(in oklab, var(--accent), transparent 90%);
}
.auth-root .status-icon--success {
background: color-mix(in oklab, var(--success), transparent 90%);
}
.auth-root .status-icon--warn {
background: color-mix(in oklab, var(--warn), transparent 90%);
}
/* ─── Strength meter ──────────────────────────────────────────────── */
.auth-root .strength-meter {
display: flex;
align-items: center;
gap: 10px;
margin-top: -2px;
}
.auth-root .strength-meter__track {
flex: 1;
height: 4px;
background: var(--border-soft);
border-radius: 2px;
overflow: hidden;
}
.auth-root .strength-meter__fill {
height: 100%;
border-radius: 2px;
transition: width var(--motion-base) var(--ease-standard),
background var(--motion-base) var(--ease-standard);
}
.auth-root .strength-meter__label {
font-family: var(--font-body);
font-size: 13px;
font-weight: 500;
min-width: 32px;
text-align: right;
}
/* ─── Captcha ───────────────────────────────────────────────────── */
.auth-root .captcha-group {
display: flex;
flex-direction: column;
gap: 6px;
}
.auth-root .captcha-group label {
font-size: 14px;
font-weight: 600;
color: var(--fg);
}
.auth-root .captcha-row {
display: flex;
gap: 12px;
align-items: center;
}
.auth-root .captcha-row img {
height: 48px;
border-radius: var(--radius-sm);
border: 1px solid var(--border-soft);
cursor: pointer;
flex-shrink: 0;
}
.auth-root .captcha-row input {
flex: 1;
min-width: 0;
height: 48px;
padding: 0 16px;
font-family: var(--font-body);
font-size: 17px;
color: var(--fg);
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
outline: none;
transition: border-color var(--motion-fast) var(--ease-standard),
box-shadow var(--motion-fast) var(--ease-standard);
}
.auth-root .captcha-row input::placeholder {
color: var(--meta);
}
.auth-root .captcha-row input:focus-visible {
border-color: var(--accent);
box-shadow: var(--focus-ring);
}
/* ─── PIN code input ─────────────────────────────────────────────── */
.auth-root .pin-code-row {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 8px;
}
.auth-root .pin-code-input {
width: 100%;
min-width: 0;
height: 52px;
padding: 0;
font-family: var(--font-mono);
font-size: 24px;
font-weight: 600;
color: var(--fg);
text-align: center;
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
outline: none;
transition: border-color var(--motion-fast) var(--ease-standard),
box-shadow var(--motion-fast) var(--ease-standard),
transform var(--motion-fast) var(--ease-standard);
}
.auth-root .pin-code-input:focus-visible {
border-color: var(--accent);
box-shadow: var(--focus-ring);
transform: translateY(-1px);
}
.auth-root .pin-code-input:disabled {
opacity: 0.6;
cursor: not-allowed;
background: var(--surface);
}
/* ─── Animations ─────────────────────────────────────────────────── */
@keyframes fade-in {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes spin {
to { transform: rotate(360deg); }
}
+61
View File
@@ -0,0 +1,61 @@
import { onMount, onCleanup, type JSX } from 'solid-js';
import '@/app/auth/auth.css';
interface AuthLayoutProps {
children: JSX.Element;
eyebrow?: string;
maxWidth?: number;
}
export default function AuthLayout({ children, eyebrow, maxWidth }: AuthLayoutProps) {
onMount(() => document.documentElement.classList.add('auth-page'));
onCleanup(() => document.documentElement.classList.remove('auth-page'));
return (
<div class="auth-root" style={s.wrapper}>
<div style={s.backdrop} />
<div style={{ ...s.container, 'max-width': `${maxWidth ?? 460}px` }}>
<header style={s.header}>
<p style={s.brandName}>AppKS</p>
</header>
{eyebrow && <p style={s.eyebrow}>{eyebrow}</p>}
<div style={s.card}>{children}</div>
<footer style={s.footer}>
&copy; {new Date().getFullYear()} AppKS. All rights reserved.
</footer>
</div>
</div>
);
}
const s: Record<string, JSX.CSSProperties> = {
wrapper: {
position: 'relative', display: 'flex', 'justify-content': 'center',
'min-height': '100dvh', padding: '48px 16px',
},
backdrop: {
position: 'fixed', inset: '0', background: 'var(--surface)', 'z-index': '0',
},
container: {
position: 'relative', 'z-index': '1', width: '100%',
display: 'flex', 'flex-direction': 'column', 'align-items': 'center',
gap: '24px', animation: 'fade-in 0.4s var(--ease-standard) both', margin: 'auto 0',
},
header: { display: 'flex', 'align-items': 'center', gap: '12px' },
brandName: {
'font-family': 'var(--font-display)', 'font-size': '22px', 'font-weight': '600',
color: 'var(--fg)', 'letter-spacing': '-0.015em', 'line-height': '1.15', margin: '0',
},
eyebrow: {
'font-family': 'var(--font-body)', 'font-size': '14px', 'font-weight': '500',
color: 'var(--muted)', 'text-align': 'center', margin: '-8px 0 0',
},
card: {
width: '100%', background: 'var(--bg)', border: '1px solid var(--border-soft)',
'border-radius': '18px', padding: '32px 28px', 'box-shadow': 'var(--elev-raised)',
},
footer: {
'font-family': 'var(--font-body)', 'font-size': '12px', color: 'var(--meta)',
'letter-spacing': '0.02em', 'margin-top': '4px',
},
};
+31
View File
@@ -0,0 +1,31 @@
export function CaptchaBox(props: {
image: string;
value: string;
onChange: (v: string) => void;
onRefresh: () => void;
id?: string;
}) {
const inputId = props.id ?? 'captcha-input';
return (
<div class="captcha-group">
<label for={inputId}>Captcha</label>
<div class="captcha-row">
<img
src={props.image ? `data:image/png;base64,${props.image}` : ''}
alt="Captcha"
onClick={props.onRefresh}
title="Click to refresh"
/>
<input
id={inputId}
type="text"
autocomplete="off"
placeholder="Enter captcha"
value={props.value}
onInput={(e) => props.onChange(e.currentTarget.value)}
/>
</div>
</div>
);
}
+135
View File
@@ -0,0 +1,135 @@
import { createSignal, onCleanup, onMount, type JSX } from 'solid-js';
import { PASSWORD_MAX_LENGTH, calcStrength, meetsPasswordPolicy } from '@/app/auth/lib/password';
function WarningCircle(props: { size: number; color: string }) {
return (
<svg width={props.size} height={props.size} viewBox="0 0 256 256" fill={props.color}
style={{ 'flex-shrink': '0' }}>
<path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-8,56a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm8,104a12,12,0,1,1,12-12A12,12,0,0,1,128,184Z" />
</svg>
);
}
function Eye(props: { size: number; color: string }) {
return (
<svg width={props.size} height={props.size} viewBox="0 0 256 256" fill={props.color}>
<path d="M247.31,124.76c-.35-.79-8.82-19.58-27.65-38.41C194.57,61.26,162.88,48,128,48S61.43,61.26,36.34,86.35C17.51,105.18,9,124,8.69,124.76a8,8,0,0,0,0,6.5c.35.79,8.82,19.57,27.65,38.4C61.43,194.74,93.12,208,128,208s66.57-13.26,91.66-38.34c18.83-18.83,27.3-37.61,27.65-38.4A8,8,0,0,0,247.31,124.76ZM128,192c-30.78,0-59.27-12.14-82.34-35.23C28.75,139.87,22.81,124.64,22.09,122.63a.49.49,0,0,1,0-.26c.72-2,6.66-17.25,23.57-34.14C68.73,65.14,97.22,53,128,53s59.27,12.14,82.34,35.23c16.91,16.89,22.85,32.12,23.57,34.14a.49.49,0,0,1,0,.26c-.72,2-6.66,17.25-23.57,34.14C187.27,179.86,158.78,192,128,192Zm0-112a42,42,0,1,0,42,42A42,42,0,0,0,128,80Zm0,68a26,26,0,1,1,26-26A26,26,0,0,1,128,148Z" />
</svg>
);
}
function EyeSlash(props: { size: number; color: string }) {
return (
<svg width={props.size} height={props.size} viewBox="0 0 256 256" fill={props.color}>
<path d="M53.92,34.62A8,8,0,1,0,42.08,45.38l22.59,24.7A105.07,105.07,0,0,0,36.34,86.35C17.51,105.18,9,124,8.69,124.76a8,8,0,0,0,0,6.5c.35.79,8.82,19.57,27.65,38.4C61.43,194.74,93.12,208,128,208a108.07,108.07,0,0,0,48.78-11.62l25.3,27.7a8,8,0,1,0,11.84-10.76L66.4,40.37A8,8,0,0,0,53.92,34.62ZM78.29,80.44l115.42,126.3A90.81,90.81,0,0,1,128,192c-30.78,0-59.27-12.14-82.34-35.23C28.75,139.87,22.81,124.64,22.09,122.63a.49.49,0,0,1,0-.26c.72-2,6.66-17.25,23.57-34.14A89.86,89.86,0,0,1,78.29,80.44ZM128,80a41.91,41.91,0,0,1,39.9,28.82l-56.1-61.4A42.17,42.17,0,0,1,128,80Zm91.66,6.35c18.83,18.83,27.3,37.61,27.65,38.4a8,8,0,0,1,0,6.5c-.35.79-8.82,19.57-27.65,38.4A106.06,106.06,0,0,1,154.24,197l-11.33-12.41a90.71,90.71,0,0,0,38.76-27.82c16.91-16.89,22.85-32.12,23.57-34.14a.49.49,0,0,0,0-.26c-.72-2-6.66-17.25-23.57-34.14a91,91,0,0,0-28-18.51l-11.3-12.38A106,106,0,0,1,219.66,86.35Z" />
</svg>
);
}
export function ErrorMessage(props: { children: JSX.Element; id?: string }) {
let ref: HTMLDivElement | undefined;
onMount(() => {
const timeoutId = window.setTimeout(() => ref?.focus(), 0);
onCleanup(() => window.clearTimeout(timeoutId));
});
return (
<div ref={ref} id={props.id} class="error-banner" role="alert" tabIndex={-1}>
<WarningCircle size={16} color="var(--danger)" />
<span>{props.children}</span>
</div>
);
}
export function SubmitButton(props: {
loading: boolean;
disabled?: boolean;
loadingText?: string;
children: JSX.Element;
}) {
return (
<button type="submit" class="btn-primary btn-block" disabled={props.loading || props.disabled}>
{props.loading ? (
<span style={{ display: 'inline-flex', 'align-items': 'center', gap: '8px' }}>
<span class="spinner-sm" />
{props.loadingText ?? 'Please wait…'}
</span>
) : (props.children)}
</button>
);
}
interface PasswordFieldProps {
id: string;
label: string;
value: string;
onChange: (v: string) => void;
placeholder?: string;
autoComplete?: string;
autofocus?: boolean;
hasError?: boolean;
describedBy?: string;
disabled?: boolean;
maxLength?: number;
}
export function PasswordField(props: PasswordFieldProps) {
const [visible, setVisible] = createSignal(false);
return (
<div class="field">
<label for={props.id}>{props.label}</label>
<div class="password-group">
<input
id={props.id}
type={visible() ? 'text' : 'password'}
autocomplete={props.autoComplete ?? 'current-password'}
placeholder={props.placeholder ?? '••••••••'}
value={props.value}
onInput={(e) => props.onChange(e.currentTarget.value)}
autofocus={props.autofocus}
class={props.hasError ? 'input-error' : ''}
aria-invalid={props.hasError}
aria-describedby={props.describedBy}
disabled={props.disabled}
maxLength={props.maxLength ?? PASSWORD_MAX_LENGTH}
/>
<button
type="button"
onClick={() => setVisible(!visible())}
class="eye-btn"
tabIndex={-1}
aria-pressed={visible()}
aria-label={visible() ? 'Hide password' : 'Show password'}
>
{visible() ? <EyeSlash size={18} color="var(--meta)" />
: <Eye size={18} color="var(--meta)" />}
</button>
</div>
</div>
);
}
const STRENGTH_LABELS = ['', 'Weak', 'Fair', 'Strong', 'Very strong'];
export function StrengthMeter(props: { password: string }) {
if (!props.password) return null;
const score = calcStrength(props.password);
const label = STRENGTH_LABELS[score] || '';
const color = score <= 1 ? 'var(--danger)' : score === 2 ? 'var(--warn)' : 'var(--success)';
return (
<div class="strength-meter">
<div class="strength-meter__track">
<div
class="strength-meter__fill"
style={{ width: `${(score / 4) * 100}%`, background: color }}
/>
</div>
<span class="strength-meter__label" style={{ color }}>{label}</span>
</div>
);
}
export { meetsPasswordPolicy, calcStrength };
+87
View File
@@ -0,0 +1,87 @@
import { For } from 'solid-js';
interface PinCodeInputProps {
id: string;
label: string;
value: string;
length?: number;
disabled?: boolean;
autofocus?: boolean;
onChange: (value: string) => void;
onComplete?: (value: string) => void;
}
export function PinCodeInput(props: PinCodeInputProps) {
const length = () => props.length ?? 6;
const indexes = () => Array.from({ length: length() }, (_, i) => i);
const digits = () => props.value.padEnd(length()).slice(0, length()).split('');
const inputs: HTMLInputElement[] = [];
function commit(next: string[]) {
const value = next.join('').slice(0, length());
props.onChange(value);
if (value.length === length()) props.onComplete?.(value);
}
function setFrom(index: number, raw: string) {
const values = digits();
const chars = raw.replace(/\D/g, '').slice(0, length() - index).split('');
if (chars.length === 0) {
values[index] = '';
commit(values);
return;
}
chars.forEach((char, offset) => { values[index + offset] = char; });
commit(values);
const nextIndex = Math.min(index + chars.length, length() - 1);
inputs[nextIndex]?.focus();
}
function handleKeyDown(index: number, e: KeyboardEvent) {
if (e.key !== 'Backspace') return;
const values = digits();
if (values[index]) {
values[index] = '';
commit(values);
return;
}
if (index > 0) {
e.preventDefault();
values[index - 1] = '';
commit(values);
inputs[index - 1]?.focus();
}
}
return (
<div class="field pin-field">
<label id={`${props.id}-label`}>{props.label}</label>
<div class="pin-code-row" role="group" aria-labelledby={`${props.id}-label`}>
<For each={indexes()}>{(index) => (
<input
ref={(el) => { inputs[index] = el; }}
id={index === 0 ? props.id : undefined}
class="pin-code-input"
type="text"
inputmode="numeric"
pattern="[0-9]*"
autocomplete={index === 0 ? 'one-time-code' : 'off'}
value={digits()[index]}
maxlength={1}
disabled={props.disabled}
autofocus={props.autofocus && index === 0}
aria-label={`Digit ${index + 1} of ${length()}`}
onInput={(e) => setFrom(index, e.currentTarget.value)}
onKeyDown={(e) => handleKeyDown(index, e)}
onPaste={(e) => {
e.preventDefault();
setFrom(index, e.clipboardData?.getData('text') ?? '');
}}
/>
)}</For>
</div>
</div>
);
}
+46
View File
@@ -0,0 +1,46 @@
import { createSignal, onCleanup, onMount } from 'solid-js';
import { AuthService } from '@/client';
import type { ApiResponse_CaptchaResponse } from '@/client';
export function useCaptcha() {
const [captcha, setCaptcha] = createSignal({ image: '', rsaKey: null as string | null });
const [captchaError, setCaptchaError] = createSignal('');
const [captchaLoading, setCaptchaLoading] = createSignal(false);
let requestId = 0;
let disposed = false;
const refresh = async (): Promise<boolean> => {
const currentRequest = ++requestId;
setCaptchaLoading(true);
setCaptchaError('');
try {
const res: ApiResponse_CaptchaResponse = await AuthService.authGetCaptcha({
w: 200, h: 60, dark: false, rsa: true,
});
if (disposed || currentRequest !== requestId) return false;
setCaptcha({
image: res.data.base64,
rsaKey: res.data.rsa?.public_key ?? null,
});
return true;
} catch {
if (!disposed && currentRequest === requestId) {
setCaptcha({ image: '', rsaKey: null });
setCaptchaError('Captcha failed to load. Please refresh and try again.');
}
return false;
} finally {
if (!disposed && currentRequest === requestId) setCaptchaLoading(false);
}
};
onMount(() => { void refresh(); });
onCleanup(() => {
disposed = true;
requestId++;
});
return { captcha, captchaError, captchaLoading, refresh };
}
+22
View File
@@ -0,0 +1,22 @@
export const PASSWORD_MIN_LENGTH = 12;
export const PASSWORD_MAX_LENGTH = 128;
function categoryCount(pw: string): number {
const has = [/[A-Z]/.test(pw), /[a-z]/.test(pw), /\d/.test(pw), /[^a-zA-Z0-9]/.test(pw)];
return has.filter(Boolean).length;
}
export function meetsPasswordPolicy(pw: string): boolean {
return pw.length >= PASSWORD_MIN_LENGTH && categoryCount(pw) >= 3;
}
export function calcStrength(pw: string): number {
if (!pw) return 0;
let s = 0;
if (pw.length >= PASSWORD_MIN_LENGTH) s++;
if (pw.length >= 16) s++;
if (/[a-z]/.test(pw) && /[A-Z]/.test(pw)) s++;
if (/\d/.test(pw)) s++;
if (/[^a-zA-Z0-9]/.test(pw)) s++;
return Math.min(s, 4);
}
+91
View File
@@ -0,0 +1,91 @@
function pemToDer(pem: string): Uint8Array {
const b64 = pem
.replace(/-----BEGIN (?:RSA |)PUBLIC KEY-----/g, '')
.replace(/-----END (?:RSA |)PUBLIC KEY-----/g, '')
.replace(/\s/g, '');
if (!b64) throw new Error('Invalid RSA public key');
return Uint8Array.from(atob(b64), (c) => c.charCodeAt(0));
}
function derLength(length: number): Uint8Array {
if (length < 0x80) return new Uint8Array([length]);
const bytes: number[] = [];
let value = length;
while (value > 0) {
bytes.unshift(value & 0xff);
value >>= 8;
}
return new Uint8Array([0x80 | bytes.length, ...bytes]);
}
function derTagged(tag: number, value: Uint8Array): Uint8Array {
const length = derLength(value.length);
const result = new Uint8Array(1 + length.length + value.length);
result[0] = tag;
result.set(length, 1);
result.set(value, 1 + length.length);
return result;
}
function concatBytes(...parts: Uint8Array[]): Uint8Array {
const length = parts.reduce((sum, part) => sum + part.length, 0);
const result = new Uint8Array(length);
let offset = 0;
for (const part of parts) {
result.set(part, offset);
offset += part.length;
}
return result;
}
function toArrayBuffer(bytes: Uint8Array): ArrayBuffer {
const buffer = new ArrayBuffer(bytes.length);
new Uint8Array(buffer).set(bytes);
return buffer;
}
function pkcs1DerToSpkiDer(pkcs1: Uint8Array): ArrayBuffer {
const rsaEncryptionOid = new Uint8Array([
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
]);
const nullParams = new Uint8Array([0x05, 0x00]);
const algorithmIdentifier = derTagged(0x30, concatBytes(rsaEncryptionOid, nullParams));
const publicKeyBitString = derTagged(0x03, concatBytes(new Uint8Array([0x00]), pkcs1));
return toArrayBuffer(derTagged(0x30, concatBytes(algorithmIdentifier, publicKeyBitString)));
}
async function importRsaPublicKey(pem: string): Promise<CryptoKey> {
const der = pemToDer(pem);
try {
return await crypto.subtle.importKey(
'spki', toArrayBuffer(der),
{ name: 'RSA-OAEP', hash: 'SHA-256' },
false, ['encrypt'],
);
} catch {
return await crypto.subtle.importKey(
'spki', pkcs1DerToSpkiDer(der),
{ name: 'RSA-OAEP', hash: 'SHA-256' },
false, ['encrypt'],
);
}
}
function bytesToBase64(bytes: Uint8Array): string {
let binary = '';
const chunkSize = 0x8000;
for (let i = 0; i < bytes.length; i += chunkSize) {
binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));
}
return btoa(binary);
}
export async function rsaEncrypt(plaintext: string, publicKeyPem: string): Promise<string> {
const key = await importRsaPublicKey(publicKeyPem);
const encoded = new TextEncoder().encode(plaintext);
const encrypted = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, key, encoded);
return bytesToBase64(new Uint8Array(encrypted));
}
+106
View File
@@ -0,0 +1,106 @@
import { createSignal, Show } from 'solid-js';
import { useNavigate, useLocation } from '@solidjs/router';
import AuthLayout from '@/app/auth/components/AuthLayout';
import { SubmitButton, ErrorMessage } from '@/app/auth/components/FormElements';
import { AuthService } from '@/client';
import { ApiError } from '@/client/core/ApiError';
function ArrowLeft(props: { size: number }) {
return (
<svg width={props.size} height={props.size} viewBox="0 0 256 256" fill="currentColor">
<path d="M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z" />
</svg>
);
}
function Envelope(props: { size: number; color: string }) {
return (
<svg width={props.size} height={props.size} viewBox="0 0 256 256" fill={props.color}>
<path d="M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-8,27.31V192H40V75.19l84.42,73.87a8,8,0,0,0,10.52.05ZM40,64l88,77,88-77v0H40Z" />
</svg>
);
}
export default function ForgotPassword() {
const navigate = useNavigate();
const location = useLocation();
const [email, setEmail] = createSignal('');
const [error, setError] = createSignal('');
const [loading, setLoading] = createSignal(false);
const isSent = () => location.hash === '#sent';
function setStepSent() { navigate('/forgot-password#sent', { replace: true }); }
function setStepForm() { navigate('/forgot-password', { replace: true }); }
async function handleSubmit(e: SubmitEvent) {
e.preventDefault();
if (loading()) return;
setError('');
if (!email().trim()) { setError('Please enter your email'); return; }
const emailRe = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRe.test(email().trim())) { setError('Invalid email format'); return; }
setLoading(true);
try {
await AuthService.authRequestPasswordReset({ requestBody: { email: email().trim() } });
setStepSent();
} catch (err) {
if (err instanceof ApiError && err.status === 429) {
setError('Too many requests, please try again later');
} else {
setError('Unable to request password reset, please try again');
}
} finally { setLoading(false); }
}
return (
<Show
when={!isSent()}
fallback={
<AuthLayout eyebrow="Reset Password">
<div style={{ display: 'flex', 'flex-direction': 'column', 'align-items': 'center', gap: '16px', 'text-align': 'center' }}>
<div class="status-icon status-icon--accent">
<Envelope size={32} color="var(--accent)" />
</div>
<h1 class="form-header">Email Sent</h1>
<p style={{ 'font-family': 'var(--font-body)', 'font-size': '15px', color: 'var(--fg)', 'line-height': '1.5', margin: '0' }}>
If {email() || 'the email address'} is registered, you will receive a password reset email.
</p>
<p style={{ 'font-family': 'var(--font-body)', 'font-size': '13px', color: 'var(--meta)', 'line-height': '1.45', margin: '0' }}>
Please check your inbox and spam folder. The link is valid for 1 hour.
</p>
<div style={{ display: 'flex', 'flex-direction': 'column', gap: '8px', width: '100%', 'margin-top': '4px' }}>
<a href="/login" style={{ 'text-decoration': 'none' }}>
<button type="button" class="btn-primary btn-block">Back to Sign In</button>
</a>
<button type="button" class="btn-secondary btn-block"
onClick={() => { setStepForm(); setError(''); }}>Change email</button>
</div>
</div>
</AuthLayout>
}
>
<AuthLayout eyebrow="Reset Password">
<form onSubmit={handleSubmit} class="form-stack" noValidate>
<h1 class="form-header">Forgot Password</h1>
<p class="form-desc">Enter your registered email to receive a password reset link.</p>
{error() && <ErrorMessage>{error()}</ErrorMessage>}
<div class="field">
<label for="email-input">Email</label>
<input id="email-input" type="email" autocomplete="email" placeholder="your@email.com"
value={email()} onInput={(e) => setEmail(e.currentTarget.value)} autofocus />
</div>
<SubmitButton loading={loading()} loadingText="Sending…">Send Reset Link</SubmitButton>
<div style={{ display: 'flex', 'justify-content': 'center' }}>
<a href="/login" class="back-link"><ArrowLeft size={14} /> Back to Sign In</a>
</div>
</form>
</AuthLayout>
</Show>
);
}
+192
View File
@@ -0,0 +1,192 @@
import { createSignal, Show } from 'solid-js';
import { useNavigate, useSearchParams } from '@solidjs/router';
import AuthLayout from '@/app/auth/components/AuthLayout';
import { PasswordField, SubmitButton, ErrorMessage } from '@/app/auth/components/FormElements';
import { CaptchaBox } from '@/app/auth/components/CaptchaBox';
import { PinCodeInput } from '@/app/auth/components/PinCodeInput';
import { useCaptcha } from '@/app/auth/hooks/useCaptcha';
import { PASSWORD_MAX_LENGTH } from '@/app/auth/lib/password';
import { rsaEncrypt } from '@/app/auth/lib/rsa';
import { AuthService, type LoginParams } from '@/client';
import { ApiError } from '@/client/core/ApiError';
const ERROR_ID = 'login-error';
function isSafeLocalRedirect(value: string): boolean {
return value.startsWith('/') && !value.startsWith('//') && !value.includes('\\');
}
export default function Login() {
const navigate = useNavigate();
const [searchParams] = useSearchParams();
const {
captcha, captchaError, captchaLoading, refresh: refreshCaptcha,
} = useCaptcha();
const [loginValue, setLoginValue] = createSignal('');
const [password, setPassword] = createSignal('');
const [captchaText, setCaptchaText] = createSignal('');
const [totpCode, setTotpCode] = createSignal('');
const [show2FA, setShow2FA] = createSignal(false);
const [error, setError] = createSignal('');
const [loading, setLoading] = createSignal(false);
function handleCaptchaRefresh() {
setCaptchaText('');
void refreshCaptcha();
}
function getRedirectTo(): string {
const r = searchParams.redirect;
if (typeof r === 'string' && isSafeLocalRedirect(r)) return r;
return '/';
}
async function submitLogin(totpOverride?: string) {
if (loading()) return;
setError('');
const totp = (totpOverride ?? totpCode()).trim();
if (!loginValue().trim()) { setError('Please enter your username or email'); return; }
if (!password()) { setError('Please enter your password'); return; }
if (password().length > PASSWORD_MAX_LENGTH) { setError('Password is too long'); return; }
if (show2FA() && !/^\d{6}$/.test(totp)) {
setError('Please enter a valid 6-digit 2FA code');
return;
}
if (!show2FA()) {
if (captchaLoading()) { setError('Captcha is still loading'); return; }
if (captchaError()) { setError(captchaError()); return; }
if (!captchaText().trim()) { setError('Please enter the captcha'); return; }
}
setLoading(true);
try {
let rsaKey = captcha().rsaKey;
if (!rsaKey) {
const rsaRes = await AuthService.authGetRsaPublicKey();
rsaKey = rsaRes.data.public_key;
}
const encrypted = await rsaEncrypt(password(), rsaKey);
const body: LoginParams = {
username: loginValue().trim(),
password: encrypted,
captcha: show2FA() ? '' : captchaText().trim(),
};
if (show2FA()) body.totp_code = totp;
await AuthService.authLogin({ requestBody: body });
navigate(getRedirectTo(), { replace: true });
} catch (err) {
if (err instanceof ApiError) {
const msg = String(err.body?.error ?? err.message ?? '').toLowerCase();
if (msg.includes('two-factor') || msg.includes('2fa') || msg.includes('totp')) {
setShow2FA(true);
setTotpCode('');
setError('Please enter your 2FA code');
} else if (msg.includes('captcha')) {
setError('Invalid captcha, please try again');
handleCaptchaRefresh();
} else if (err.status === 404 || err.status === 400) {
setError('Invalid username, password, or verification code');
} else if (err.status === 429) {
setError('Too many attempts, please try again later');
} else {
setError('Login failed, please try again');
}
} else {
setError('Unable to complete login, please try again');
}
} finally {
setLoading(false);
}
}
function handleSubmit(e: SubmitEvent) {
e.preventDefault();
void submitLogin();
}
function handleTotpComplete(code: string) {
if (!loading()) void submitLogin(code);
}
return (
<AuthLayout eyebrow="Sign in to your account">
<form onSubmit={handleSubmit} class="form-stack" noValidate>
<h1 class="form-header">Sign In</h1>
{(error() || (!show2FA() && captchaError())) && (
<ErrorMessage id={ERROR_ID}>{error() || captchaError()}</ErrorMessage>
)}
<div class="field">
<label for="login-input">Username or Email</label>
<input
id="login-input"
type="text"
autocomplete="username"
placeholder="Enter your username or email"
value={loginValue()}
onInput={(e) => setLoginValue(e.currentTarget.value)}
autofocus
/>
</div>
<PasswordField
id="password-input"
label="Password"
value={password()}
onChange={setPassword}
autoComplete="current-password"
hasError={!!error()}
describedBy={error() ? ERROR_ID : undefined}
/>
<Show when={show2FA()}>
<PinCodeInput
id="totp-input"
label="Two-Factor Code"
value={totpCode()}
onChange={setTotpCode}
onComplete={handleTotpComplete}
disabled={loading()}
autofocus
/>
</Show>
<Show when={!show2FA()}>
<CaptchaBox
id="login-captcha"
image={captcha().image}
value={captchaText()}
onChange={setCaptchaText}
onRefresh={handleCaptchaRefresh}
/>
</Show>
<div class="forgot-link-row">
<a href="/forgot-password" class="back-link" style={{ color: 'var(--accent)' }}>
Forgot password?
</a>
</div>
<SubmitButton
loading={loading()}
loadingText="Signing in…"
disabled={!show2FA() && (captchaLoading() || !!captchaError())}
>
Sign In
</SubmitButton>
<div class="auth-divider"><span>or</span></div>
<a href="/register" style={{ 'text-decoration': 'none' }}>
<button type="button" class="btn-secondary btn-block">Create an account</button>
</a>
</form>
</AuthLayout>
);
}
+262
View File
@@ -0,0 +1,262 @@
import { createSignal } from 'solid-js';
import { useNavigate, useSearchParams } from '@solidjs/router';
import AuthLayout from '@/app/auth/components/AuthLayout';
import { PasswordField, SubmitButton, ErrorMessage, meetsPasswordPolicy } from '@/app/auth/components/FormElements';
import { CaptchaBox } from '@/app/auth/components/CaptchaBox';
import { useCaptcha } from '@/app/auth/hooks/useCaptcha';
import { PASSWORD_MAX_LENGTH } from '@/app/auth/lib/password';
import { rsaEncrypt } from '@/app/auth/lib/rsa';
import { AuthService, type RegisterEmailCodeParams, type RegisterParams } from '@/client';
import { ApiError } from '@/client/core/ApiError';
const ERROR_ID = 'register-error';
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
function isSafeLocalRedirect(value: string): boolean {
return value.startsWith('/') && !value.startsWith('//') && !value.includes('\\');
}
export default function Register() {
const navigate = useNavigate();
const {
captcha, captchaError, captchaLoading, refresh: refreshCaptcha,
} = useCaptcha();
const [form, setForm] = createSignal({
username: '', email: '', password: '', confirmPassword: '', emailCode: '',
});
const [captchaText, setCaptchaText] = createSignal('');
const [step, setStep] = createSignal<'email' | 'register'>('email');
const [error, setError] = createSignal('');
const [loading, setLoading] = createSignal(false);
const [codeLoading, setCodeLoading] = createSignal(false);
const [searchParams] = useSearchParams();
function getRedirectTo(): string {
const r = searchParams.redirect;
if (typeof r === 'string' && isSafeLocalRedirect(r)) return r;
return '/';
}
function setField(key: keyof ReturnType<typeof form>) {
return (e: InputEvent & { currentTarget: HTMLInputElement }) =>
setForm((prev) => ({ ...prev, [key]: e.currentTarget.value }));
}
function handleCaptchaRefresh() {
setCaptchaText('');
void refreshCaptcha();
}
function validateCaptcha(): boolean {
if (captchaLoading()) { setError('Captcha is still loading'); return false; }
if (captchaError()) { setError(captchaError()); return false; }
if (!captchaText().trim()) { setError('Please enter the captcha'); return false; }
return true;
}
async function handleSendCode(e: MouseEvent) {
e.preventDefault();
if (codeLoading()) return;
setError('');
const email = form().email.trim();
if (!email) { setError('Please enter your email'); return; }
if (!EMAIL_RE.test(email)) { setError('Invalid email format'); return; }
if (!validateCaptcha()) return;
setCodeLoading(true);
try {
const requestBody: RegisterEmailCodeParams = { email, captcha: captchaText().trim() };
await AuthService.authSendRegisterEmailCode({ requestBody });
setStep('register');
handleCaptchaRefresh();
} catch (err) {
if (err instanceof ApiError) {
const msg = String(err.body?.error ?? err.message ?? '').toLowerCase();
if (msg.includes('captcha') || err.status === 400) {
setError('Invalid captcha or email, please try again');
handleCaptchaRefresh();
} else if (err.status === 409) {
setError('This email is already used');
} else if (err.status === 429) {
setError('Too many requests, please try again later');
} else {
setError('Failed to send code, please try again');
}
} else {
setError('Unable to send code, please try again');
}
} finally {
setCodeLoading(false);
}
}
async function handleSubmit(e: SubmitEvent) {
e.preventDefault();
if (loading()) return;
setError('');
const f = form();
if (!f.username.trim()) { setError('Please enter a username'); return; }
if (!f.email.trim()) { setError('Please enter your email'); return; }
if (!f.emailCode.trim()) { setError('Please enter the verification code'); return; }
if (!/^\d{6}$/.test(f.emailCode.trim())) { setError('Please enter a valid 6-digit code'); return; }
if (!f.password) { setError('Please enter a password'); return; }
if (f.password.length > PASSWORD_MAX_LENGTH) { setError('Password is too long'); return; }
if (!meetsPasswordPolicy(f.password)) {
setError('Password must be at least 12 characters with 3 of: uppercase, lowercase, digit, special character');
return;
}
if (f.password !== f.confirmPassword) { setError('Passwords do not match'); return; }
if (!EMAIL_RE.test(f.email.trim())) { setError('Invalid email format'); return; }
if (!validateCaptcha()) return;
setLoading(true);
try {
let rsaKey = captcha().rsaKey;
if (!rsaKey) {
const rsaRes = await AuthService.authGetRsaPublicKey();
rsaKey = rsaRes.data.public_key;
}
const encrypted = await rsaEncrypt(f.password, rsaKey);
const requestBody: RegisterParams = {
username: f.username.trim(),
email: f.email.trim(),
password: encrypted,
captcha: captchaText().trim(),
email_code: f.emailCode.trim(),
};
await AuthService.authRegister({ requestBody });
navigate(getRedirectTo(), { replace: true });
} catch (err) {
if (err instanceof ApiError) {
const msg = String(err.body?.error ?? err.message ?? '').toLowerCase();
if (msg.includes('captcha') || err.status === 400) {
setError('Invalid captcha, code, or password. Please try again');
handleCaptchaRefresh();
} else if (err.status === 409) {
setError('Username or email is already taken');
} else if (err.status === 429) {
setError('Too many attempts, please try again later');
} else {
setError('Registration failed, please try again');
}
} else {
setError('Unable to complete registration, please try again');
}
} finally {
setLoading(false);
}
}
if (step() === 'email') {
return (
<AuthLayout eyebrow="Create a new account">
<div class="form-stack" style={{ gap: '20px' }}>
<h1 class="form-header">Register</h1>
<p class="form-desc">Enter your email to receive a verification code.</p>
{(error() || captchaError()) && <ErrorMessage id={ERROR_ID}>{error() || captchaError()}</ErrorMessage>}
<div class="field">
<label for="reg-email">Email</label>
<input id="reg-email" type="email" autocomplete="email" placeholder="your@email.com"
value={form().email} onInput={setField('email')} autofocus />
</div>
<CaptchaBox
id="register-email-captcha"
image={captcha().image}
value={captchaText()}
onChange={setCaptchaText}
onRefresh={handleCaptchaRefresh}
/>
<button
type="button"
class="btn-primary btn-block"
disabled={codeLoading() || captchaLoading() || !!captchaError()}
onClick={handleSendCode}
>
{codeLoading() ? (
<span style={{ display: 'inline-flex', 'align-items': 'center', gap: '8px' }}>
<span class="spinner-sm" /> Sending
</span>
) : 'Send Code'}
</button>
<div class="auth-divider"><span>or</span></div>
<a href="/login" style={{ 'text-decoration': 'none' }}>
<button type="button" class="btn-secondary btn-block">Already have an account? Sign in</button>
</a>
</div>
</AuthLayout>
);
}
return (
<AuthLayout eyebrow="Create a new account" maxWidth={520}>
<form onSubmit={handleSubmit} class="form-stack" noValidate style={{ gap: '14px' }}>
<h1 class="form-header">Register</h1>
{(error() || captchaError()) && <ErrorMessage id={ERROR_ID}>{error() || captchaError()}</ErrorMessage>}
<div class="field">
<label for="reg-email">Email</label>
<input id="reg-email" type="email" autocomplete="email" value={form().email} disabled />
</div>
<div class="field">
<label for="reg-code">Verification Code</label>
<input id="reg-code" type="text" inputmode="numeric" autocomplete="off"
placeholder="Enter 6-digit code" value={form().emailCode}
onInput={setField('emailCode')} autofocus maxlength={6} />
</div>
<div class="field">
<label for="reg-username">Username</label>
<input id="reg-username" type="text" autocomplete="username" placeholder="Choose a username"
value={form().username} onInput={setField('username')} />
</div>
<PasswordField id="password" label="Password" value={form().password}
onChange={(v) => setForm((p) => ({ ...p, password: v }))}
autoComplete="new-password" placeholder="At least 12 characters"
hasError={!!error()} describedBy={error() ? ERROR_ID : undefined} />
<PasswordField id="confirm-password" label="Confirm Password"
value={form().confirmPassword}
onChange={(v) => setForm((p) => ({ ...p, confirmPassword: v }))}
autoComplete="new-password" placeholder="Re-enter your password"
hasError={!!error()} />
<p class="form-hint">
At least 12 characters with 3 of: uppercase, lowercase, digit, special character.
</p>
<CaptchaBox
id="register-final-captcha"
image={captcha().image}
value={captchaText()}
onChange={setCaptchaText}
onRefresh={handleCaptchaRefresh}
/>
<SubmitButton
loading={loading()}
loadingText="Creating account…"
disabled={captchaLoading() || !!captchaError()}
>Register</SubmitButton>
<div class="auth-divider"><span>or</span></div>
<a href="/login" style={{ 'text-decoration': 'none' }}>
<button type="button" class="btn-secondary btn-block">Already have an account? Sign in</button>
</a>
</form>
</AuthLayout>
);
}
+158
View File
@@ -0,0 +1,158 @@
import { createSignal } from 'solid-js';
import { useSearchParams } from '@solidjs/router';
import AuthLayout from '@/app/auth/components/AuthLayout';
import { PasswordField, SubmitButton, ErrorMessage, StrengthMeter, meetsPasswordPolicy } from '@/app/auth/components/FormElements';
import { PASSWORD_MAX_LENGTH } from '@/app/auth/lib/password';
import { rsaEncrypt } from '@/app/auth/lib/rsa';
import { AuthService } from '@/client';
import { ApiError } from '@/client/core/ApiError';
function WarningCircle(props: { size: number; color: string }) {
return (
<svg width={props.size} height={props.size} viewBox="0 0 256 256" fill={props.color}>
<path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-8,56a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm8,104a12,12,0,1,1,12-12A12,12,0,0,1,128,184Z" />
</svg>
);
}
function CheckCircle(props: { size: number; color: string }) {
return (
<svg width={props.size} height={props.size} viewBox="0 0 256 256" fill={props.color}>
<path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm45.66,85.66-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35a8,8,0,0,1,11.32,11.32Z" />
</svg>
);
}
function ArrowLeft(props: { size: number }) {
return (
<svg width={props.size} height={props.size} viewBox="0 0 256 256" fill="currentColor">
<path d="M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z" />
</svg>
);
}
function InvalidTokenView() {
return (
<AuthLayout eyebrow="Reset Password">
<div style={{ display: 'flex', 'flex-direction': 'column', 'align-items': 'center', gap: '16px', 'text-align': 'center' }}>
<div class="status-icon status-icon--warn">
<WarningCircle size={32} color="var(--warn)" />
</div>
<h1 class="form-header">Invalid Link</h1>
<p class="form-desc">This password reset link is invalid or has expired. Please request a new one.</p>
<a href="/forgot-password" style={{ 'text-decoration': 'none', width: '100%' }}>
<button type="button" class="btn-primary btn-block">Request New Link</button>
</a>
<a href="/login" class="back-link" style={{ 'margin-top': '4px' }}>
<ArrowLeft size={14} /> Back to Sign In
</a>
</div>
</AuthLayout>
);
}
function SuccessView() {
return (
<AuthLayout eyebrow="Reset Password">
<div style={{ display: 'flex', 'flex-direction': 'column', 'align-items': 'center', gap: '16px', 'text-align': 'center' }}>
<div class="status-icon status-icon--success">
<CheckCircle size={32} color="var(--success)" />
</div>
<h1 class="form-header">Password Reset</h1>
<p style={{ 'font-family': 'var(--font-body)', 'font-size': '15px', color: 'var(--fg)', 'line-height': '1.5', margin: '0' }}>
Your password has been successfully reset. Please sign in with your new password.
</p>
<a href="/login" style={{ 'text-decoration': 'none', width: '100%' }}>
<button type="button" class="btn-primary btn-block">Go to Sign In</button>
</a>
</div>
</AuthLayout>
);
}
function ResetFormView(props: { token: string }) {
const [password, setPassword] = createSignal('');
const [confirmPassword, setConfirmPassword] = createSignal('');
const [success, setSuccess] = createSignal(false);
const [error, setError] = createSignal('');
const [loading, setLoading] = createSignal(false);
async function handleSubmit(e: SubmitEvent) {
e.preventDefault();
if (loading()) return;
setError('');
if (!password()) { setError('Please enter a new password'); return; }
if (password().length > PASSWORD_MAX_LENGTH) { setError('Password is too long'); return; }
if (!meetsPasswordPolicy(password())) {
setError('Password must be at least 12 characters with 3 of: uppercase, lowercase, digit, special character');
return;
}
if (password() !== confirmPassword()) { setError('Passwords do not match'); return; }
setLoading(true);
try {
const rsaRes = await AuthService.authGetRsaPublicKey();
const encrypted = await rsaEncrypt(password(), rsaRes.data.public_key);
await AuthService.authVerifyPasswordReset({
requestBody: { token: props.token, password: encrypted },
});
setSuccess(true);
} catch (err) {
if (err instanceof ApiError) {
if (err.status === 400) {
setError('Link is invalid or expired. Please request a new one.');
} else if (err.status === 429) {
setError('Too many attempts, please try again later');
} else {
setError('Reset failed, please try again');
}
} else {
setError('Unable to reset password, please try again');
}
} finally { setLoading(false); }
}
if (success()) return <SuccessView />;
return (
<AuthLayout eyebrow="Set a new password">
<form onSubmit={handleSubmit} class="form-stack" noValidate>
<h1 class="form-header">Reset Password</h1>
<p class="form-desc">Enter your new password.</p>
{error() && <ErrorMessage>{error()}</ErrorMessage>}
<PasswordField id="new-password" label="New Password" value={password()}
onChange={setPassword} autoComplete="new-password" placeholder="At least 12 characters"
autofocus />
<PasswordField id="confirm-password" label="Confirm Password" value={confirmPassword()}
onChange={setConfirmPassword} autoComplete="new-password" placeholder="Re-enter new password" />
<StrengthMeter password={password()} />
<SubmitButton loading={loading()} loadingText="Resetting…">Reset Password</SubmitButton>
<div style={{ display: 'flex', 'justify-content': 'center' }}>
<a href="/login" class="back-link"><ArrowLeft size={14} /> Back to Sign In</a>
</div>
</form>
</AuthLayout>
);
}
export default function ResetPassword() {
const [searchParams] = useSearchParams();
function getToken(): string {
const t = searchParams.token;
if (typeof t === 'string') return t;
return '';
}
const token = getToken();
if (!token) return <InvalidTokenView />;
return <ResetFormView token={token} />;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 166 155.3"><path d="M163 35S110-4 69 5l-3 1c-6 2-11 5-14 9l-2 3-15 26 26 5c11 7 25 10 38 7l46 9 18-30z" fill="#76b3e1"/><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="27.5" y1="3" x2="152" y2="63.5"><stop offset=".1" stop-color="#76b3e1"/><stop offset=".3" stop-color="#dcf2fd"/><stop offset="1" stop-color="#76b3e1"/></linearGradient><path d="M163 35S110-4 69 5l-3 1c-6 2-11 5-14 9l-2 3-15 26 26 5c11 7 25 10 38 7l46 9 18-30z" opacity=".3" fill="url(#a)"/><path d="M52 35l-4 1c-17 5-22 21-13 35 10 13 31 20 48 15l62-21S92 26 52 35z" fill="#518ac8"/><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="95.8" y1="32.6" x2="74" y2="105.2"><stop offset="0" stop-color="#76b3e1"/><stop offset=".5" stop-color="#4377bb"/><stop offset="1" stop-color="#1f3b77"/></linearGradient><path d="M52 35l-4 1c-17 5-22 21-13 35 10 13 31 20 48 15l62-21S92 26 52 35z" opacity=".3" fill="url(#b)"/><linearGradient id="c" gradientUnits="userSpaceOnUse" x1="18.4" y1="64.2" x2="144.3" y2="149.8"><stop offset="0" stop-color="#315aa9"/><stop offset=".5" stop-color="#518ac8"/><stop offset="1" stop-color="#315aa9"/></linearGradient><path d="M134 80a45 45 0 00-48-15L24 85 4 120l112 19 20-36c4-7 3-15-2-23z" fill="url(#c)"/><linearGradient id="d" gradientUnits="userSpaceOnUse" x1="75.2" y1="74.5" x2="24.4" y2="260.8"><stop offset="0" stop-color="#4377bb"/><stop offset=".5" stop-color="#1a336b"/><stop offset="1" stop-color="#1a336b"/></linearGradient><path d="M114 115a45 45 0 00-48-15L4 120s53 40 94 30l3-1c17-5 23-21 13-34z" fill="url(#d)"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.5 KiB

+25
View File
@@ -0,0 +1,25 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
export class ApiError extends Error {
public readonly url: string;
public readonly status: number;
public readonly statusText: string;
public readonly body: any;
public readonly request: ApiRequestOptions;
constructor(request: ApiRequestOptions, response: ApiResult, message: string) {
super(message);
this.name = 'ApiError';
this.url = response.url;
this.status = response.status;
this.statusText = response.statusText;
this.body = response.body;
this.request = request;
}
}
+17
View File
@@ -0,0 +1,17 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiRequestOptions = {
readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH';
readonly url: string;
readonly path?: Record<string, any>;
readonly cookies?: Record<string, any>;
readonly headers?: Record<string, any>;
readonly query?: Record<string, any>;
readonly formData?: Record<string, any>;
readonly body?: any;
readonly mediaType?: string;
readonly responseHeader?: string;
readonly errors?: Record<number, string>;
};
+11
View File
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResult = {
readonly url: string;
readonly ok: boolean;
readonly status: number;
readonly statusText: string;
readonly body: any;
};
+131
View File
@@ -0,0 +1,131 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export class CancelError extends Error {
constructor(message: string) {
super(message);
this.name = 'CancelError';
}
public get isCancelled(): boolean {
return true;
}
}
export interface OnCancel {
readonly isResolved: boolean;
readonly isRejected: boolean;
readonly isCancelled: boolean;
(cancelHandler: () => void): void;
}
export class CancelablePromise<T> implements Promise<T> {
#isResolved: boolean;
#isRejected: boolean;
#isCancelled: boolean;
readonly #cancelHandlers: (() => void)[];
readonly #promise: Promise<T>;
#resolve?: (value: T | PromiseLike<T>) => void;
#reject?: (reason?: any) => void;
constructor(
executor: (
resolve: (value: T | PromiseLike<T>) => void,
reject: (reason?: any) => void,
onCancel: OnCancel
) => void
) {
this.#isResolved = false;
this.#isRejected = false;
this.#isCancelled = false;
this.#cancelHandlers = [];
this.#promise = new Promise<T>((resolve, reject) => {
this.#resolve = resolve;
this.#reject = reject;
const onResolve = (value: T | PromiseLike<T>): void => {
if (this.#isResolved || this.#isRejected || this.#isCancelled) {
return;
}
this.#isResolved = true;
if (this.#resolve) this.#resolve(value);
};
const onReject = (reason?: any): void => {
if (this.#isResolved || this.#isRejected || this.#isCancelled) {
return;
}
this.#isRejected = true;
if (this.#reject) this.#reject(reason);
};
const onCancel = (cancelHandler: () => void): void => {
if (this.#isResolved || this.#isRejected || this.#isCancelled) {
return;
}
this.#cancelHandlers.push(cancelHandler);
};
Object.defineProperty(onCancel, 'isResolved', {
get: (): boolean => this.#isResolved,
});
Object.defineProperty(onCancel, 'isRejected', {
get: (): boolean => this.#isRejected,
});
Object.defineProperty(onCancel, 'isCancelled', {
get: (): boolean => this.#isCancelled,
});
return executor(onResolve, onReject, onCancel as OnCancel);
});
}
get [Symbol.toStringTag]() {
return "Cancellable Promise";
}
public then<TResult1 = T, TResult2 = never>(
onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null
): Promise<TResult1 | TResult2> {
return this.#promise.then(onFulfilled, onRejected);
}
public catch<TResult = never>(
onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null
): Promise<T | TResult> {
return this.#promise.catch(onRejected);
}
public finally(onFinally?: (() => void) | null): Promise<T> {
return this.#promise.finally(onFinally);
}
public cancel(): void {
if (this.#isResolved || this.#isRejected || this.#isCancelled) {
return;
}
this.#isCancelled = true;
if (this.#cancelHandlers.length) {
try {
for (const cancelHandler of this.#cancelHandlers) {
cancelHandler();
}
} catch (error) {
console.warn('Cancellation threw an error', error);
return;
}
}
this.#cancelHandlers.length = 0;
if (this.#reject) this.#reject(new CancelError('Request aborted'));
}
public get isCancelled(): boolean {
return this.#isCancelled;
}
}
+32
View File
@@ -0,0 +1,32 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { ApiRequestOptions } from './ApiRequestOptions';
type Resolver<T> = (options: ApiRequestOptions) => Promise<T>;
type Headers = Record<string, string>;
export type OpenAPIConfig = {
BASE: string;
VERSION: string;
WITH_CREDENTIALS: boolean;
CREDENTIALS: 'include' | 'omit' | 'same-origin';
TOKEN?: string | Resolver<string> | undefined;
USERNAME?: string | Resolver<string> | undefined;
PASSWORD?: string | Resolver<string> | undefined;
HEADERS?: Headers | Resolver<Headers> | undefined;
ENCODE_PATH?: ((path: string) => string) | undefined;
};
export const OpenAPI: OpenAPIConfig = {
BASE: '',
VERSION: '0.1.0',
WITH_CREDENTIALS: true,
CREDENTIALS: 'include',
TOKEN: undefined,
USERNAME: undefined,
PASSWORD: undefined,
HEADERS: undefined,
ENCODE_PATH: undefined,
};
+323
View File
@@ -0,0 +1,323 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import axios from 'axios';
import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios';
import FormData from 'form-data';
import { ApiError } from './ApiError';
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
import { CancelablePromise } from './CancelablePromise';
import type { OnCancel } from './CancelablePromise';
import type { OpenAPIConfig } from './OpenAPI';
export const isDefined = <T>(value: T | null | undefined): value is Exclude<T, null | undefined> => {
return value !== undefined && value !== null;
};
export const isString = (value: any): value is string => {
return typeof value === 'string';
};
export const isStringWithValue = (value: any): value is string => {
return isString(value) && value !== '';
};
export const isBlob = (value: any): value is Blob => {
return (
typeof value === 'object' &&
typeof value.type === 'string' &&
typeof value.stream === 'function' &&
typeof value.arrayBuffer === 'function' &&
typeof value.constructor === 'function' &&
typeof value.constructor.name === 'string' &&
/^(Blob|File)$/.test(value.constructor.name) &&
/^(Blob|File)$/.test(value[Symbol.toStringTag])
);
};
export const isFormData = (value: any): value is FormData => {
return value instanceof FormData;
};
export const isSuccess = (status: number): boolean => {
return status >= 200 && status < 300;
};
export const base64 = (str: string): string => {
try {
return btoa(str);
} catch (err) {
// @ts-ignore
return Buffer.from(str).toString('base64');
}
};
export const getQueryString = (params: Record<string, any>): string => {
const qs: string[] = [];
const append = (key: string, value: any) => {
qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
};
const process = (key: string, value: any) => {
if (isDefined(value)) {
if (Array.isArray(value)) {
value.forEach(v => {
process(key, v);
});
} else if (typeof value === 'object') {
Object.entries(value).forEach(([k, v]) => {
process(`${key}[${k}]`, v);
});
} else {
append(key, value);
}
}
};
Object.entries(params).forEach(([key, value]) => {
process(key, value);
});
if (qs.length > 0) {
return `?${qs.join('&')}`;
}
return '';
};
const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {
const encoder = config.ENCODE_PATH || encodeURI;
const path = options.url
.replace('{api-version}', config.VERSION)
.replace(/{(.*?)}/g, (substring: string, group: string) => {
if (options.path?.hasOwnProperty(group)) {
return encoder(String(options.path[group]));
}
return substring;
});
const url = `${config.BASE}${path}`;
if (options.query) {
return `${url}${getQueryString(options.query)}`;
}
return url;
};
export const getFormData = (options: ApiRequestOptions): FormData | undefined => {
if (options.formData) {
const formData = new FormData();
const process = (key: string, value: any) => {
if (isString(value) || isBlob(value)) {
formData.append(key, value);
} else {
formData.append(key, JSON.stringify(value));
}
};
Object.entries(options.formData)
.filter(([_, value]) => isDefined(value))
.forEach(([key, value]) => {
if (Array.isArray(value)) {
value.forEach(v => process(key, v));
} else {
process(key, value);
}
});
return formData;
}
return undefined;
};
type Resolver<T> = (options: ApiRequestOptions) => Promise<T>;
export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> => {
if (typeof resolver === 'function') {
return (resolver as Resolver<T>)(options);
}
return resolver;
};
export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => {
const [token, username, password, additionalHeaders] = await Promise.all([
resolve(options, config.TOKEN),
resolve(options, config.USERNAME),
resolve(options, config.PASSWORD),
resolve(options, config.HEADERS),
]);
const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {}
const headers = Object.entries({
Accept: 'application/json',
...additionalHeaders,
...options.headers,
...formHeaders,
})
.filter(([_, value]) => isDefined(value))
.reduce((headers, [key, value]) => ({
...headers,
[key]: String(value),
}), {} as Record<string, string>);
if (isStringWithValue(token)) {
headers['Authorization'] = `Bearer ${token}`;
}
if (isStringWithValue(username) && isStringWithValue(password)) {
const credentials = base64(`${username}:${password}`);
headers['Authorization'] = `Basic ${credentials}`;
}
if (options.body !== undefined) {
if (options.mediaType) {
headers['Content-Type'] = options.mediaType;
} else if (isBlob(options.body)) {
headers['Content-Type'] = options.body.type || 'application/octet-stream';
} else if (isString(options.body)) {
headers['Content-Type'] = 'text/plain';
} else if (!isFormData(options.body)) {
headers['Content-Type'] = 'application/json';
}
}
return headers;
};
export const getRequestBody = (options: ApiRequestOptions): any => {
if (options.body) {
return options.body;
}
return undefined;
};
export const sendRequest = async <T>(
config: OpenAPIConfig,
options: ApiRequestOptions,
url: string,
body: any,
formData: FormData | undefined,
headers: Record<string, string>,
onCancel: OnCancel,
axiosClient: AxiosInstance
): Promise<AxiosResponse<T>> => {
const source = axios.CancelToken.source();
const requestConfig: AxiosRequestConfig = {
url,
headers,
data: body ?? formData,
method: options.method,
withCredentials: config.WITH_CREDENTIALS,
withXSRFToken: config.CREDENTIALS === 'include' ? config.WITH_CREDENTIALS : false,
cancelToken: source.token,
};
onCancel(() => source.cancel('The user aborted a request.'));
try {
return await axiosClient.request(requestConfig);
} catch (error) {
const axiosError = error as AxiosError<T>;
if (axiosError.response) {
return axiosError.response;
}
throw error;
}
};
export const getResponseHeader = (response: AxiosResponse<any>, responseHeader?: string): string | undefined => {
if (responseHeader) {
const content = response.headers[responseHeader];
if (isString(content)) {
return content;
}
}
return undefined;
};
export const getResponseBody = (response: AxiosResponse<any>): any => {
if (response.status !== 204) {
return response.data;
}
return undefined;
};
export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => {
const errors: Record<number, string> = {
400: 'Bad Request',
401: 'Unauthorized',
403: 'Forbidden',
404: 'Not Found',
500: 'Internal Server Error',
502: 'Bad Gateway',
503: 'Service Unavailable',
...options.errors,
}
const error = errors[result.status];
if (error) {
throw new ApiError(options, result, error);
}
if (!result.ok) {
const errorStatus = result.status ?? 'unknown';
const errorStatusText = result.statusText ?? 'unknown';
const errorBody = (() => {
try {
return JSON.stringify(result.body, null, 2);
} catch (e) {
return undefined;
}
})();
throw new ApiError(options, result,
`Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`
);
}
};
/**
* Request method
* @param config The OpenAPI configuration object
* @param options The request options from the service
* @param axiosClient The axios client instance to use
* @returns CancelablePromise<T>
* @throws ApiError
*/
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise<T> => {
return new CancelablePromise(async (resolve, reject, onCancel) => {
try {
const url = getUrl(config, options);
const formData = getFormData(options);
const body = getRequestBody(options);
const headers = await getHeaders(config, options, formData);
if (!onCancel.isCancelled) {
const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel, axiosClient);
const responseBody = getResponseBody(response);
const responseHeader = getResponseHeader(response, options.responseHeader);
const result: ApiResult = {
url,
ok: isSuccess(response.status),
status: response.status,
statusText: response.statusText,
body: responseHeader ?? responseBody,
};
catchErrorCodes(options, result);
resolve(result.body);
}
} catch (error) {
reject(error);
}
});
};
+678
View File
@@ -0,0 +1,678 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export { ApiError } from './core/ApiError';
export { CancelablePromise, CancelError } from './core/CancelablePromise';
export { OpenAPI } from './core/OpenAPI';
export type { OpenAPIConfig } from './core/OpenAPI';
export type { AcceptInvitationParams } from './models/AcceptInvitationParams';
export type { AcceptInvitationRequest } from './models/AcceptInvitationRequest';
export type { AddDeployKeyParams } from './models/AddDeployKeyParams';
export type { AddDomainParams } from './models/AddDomainParams';
export type { AddGpgKeyParams } from './models/AddGpgKeyParams';
export type { AddMemberParams } from './models/AddMemberParams';
export type { AddReplyParams } from './models/AddReplyParams';
export type { AddRepoMemberParams } from './models/AddRepoMemberParams';
export type { AddSshKeyParams } from './models/AddSshKeyParams';
export type { ApiEmptyResponse } from './models/ApiEmptyResponse';
export type { ApiErrorResponse } from './models/ApiErrorResponse';
export type { ApiResponse_BranchMergeCheck } from './models/ApiResponse_BranchMergeCheck';
export type { ApiResponse_BranchProtectionRule } from './models/ApiResponse_BranchProtectionRule';
export type { ApiResponse_CaptchaResponse } from './models/ApiResponse_CaptchaResponse';
export type { ApiResponse_ContextMe } from './models/ApiResponse_ContextMe';
export type { ApiResponse_CreateInvitationResponse } from './models/ApiResponse_CreateInvitationResponse';
export type { ApiResponse_EmailResponse } from './models/ApiResponse_EmailResponse';
export type { ApiResponse_Enable2FAResponse } from './models/ApiResponse_Enable2FAResponse';
export type { ApiResponse_Get2FAStatusResponse } from './models/ApiResponse_Get2FAStatusResponse';
export type { ApiResponse_Issue } from './models/ApiResponse_Issue';
export type { ApiResponse_IssueAssignee } from './models/ApiResponse_IssueAssignee';
export type { ApiResponse_IssueComment } from './models/ApiResponse_IssueComment';
export type { ApiResponse_IssueEvent } from './models/ApiResponse_IssueEvent';
export type { ApiResponse_IssueLabel } from './models/ApiResponse_IssueLabel';
export type { ApiResponse_IssueLabelRelation } from './models/ApiResponse_IssueLabelRelation';
export type { ApiResponse_IssueMilestone } from './models/ApiResponse_IssueMilestone';
export type { ApiResponse_IssuePrRelation } from './models/ApiResponse_IssuePrRelation';
export type { ApiResponse_IssueReaction } from './models/ApiResponse_IssueReaction';
export type { ApiResponse_IssueRepoRelation } from './models/ApiResponse_IssueRepoRelation';
export type { ApiResponse_IssueSubscriber } from './models/ApiResponse_IssueSubscriber';
export type { ApiResponse_IssueTemplate } from './models/ApiResponse_IssueTemplate';
export type { ApiResponse_Option_BranchProtectionRule } from './models/ApiResponse_Option_BranchProtectionRule';
export type { ApiResponse_PrAssignee } from './models/ApiResponse_PrAssignee';
export type { ApiResponse_PrCheckRun } from './models/ApiResponse_PrCheckRun';
export type { ApiResponse_PrCommit } from './models/ApiResponse_PrCommit';
export type { ApiResponse_PrEvent } from './models/ApiResponse_PrEvent';
export type { ApiResponse_PrFile } from './models/ApiResponse_PrFile';
export type { ApiResponse_PrLabel } from './models/ApiResponse_PrLabel';
export type { ApiResponse_PrLabelRelation } from './models/ApiResponse_PrLabelRelation';
export type { ApiResponse_PrMergeStrategy } from './models/ApiResponse_PrMergeStrategy';
export type { ApiResponse_PrReaction } from './models/ApiResponse_PrReaction';
export type { ApiResponse_PrReview } from './models/ApiResponse_PrReview';
export type { ApiResponse_PrReviewComment } from './models/ApiResponse_PrReviewComment';
export type { ApiResponse_PrStatus } from './models/ApiResponse_PrStatus';
export type { ApiResponse_PrSubscription } from './models/ApiResponse_PrSubscription';
export type { ApiResponse_PullRequest } from './models/ApiResponse_PullRequest';
export type { ApiResponse_Regenerate2FABackupCodesResponse } from './models/ApiResponse_Regenerate2FABackupCodesResponse';
export type { ApiResponse_RegisterEmailCodeResponse } from './models/ApiResponse_RegisterEmailCodeResponse';
export type { ApiResponse_RegisterResponse } from './models/ApiResponse_RegisterResponse';
export type { ApiResponse_Repo } from './models/ApiResponse_Repo';
export type { ApiResponse_RepoBranch } from './models/ApiResponse_RepoBranch';
export type { ApiResponse_RepoCommitComment } from './models/ApiResponse_RepoCommitComment';
export type { ApiResponse_RepoCommitStatus } from './models/ApiResponse_RepoCommitStatus';
export type { ApiResponse_RepoDeployKey } from './models/ApiResponse_RepoDeployKey';
export type { ApiResponse_RepoFork } from './models/ApiResponse_RepoFork';
export type { ApiResponse_RepoInvitation } from './models/ApiResponse_RepoInvitation';
export type { ApiResponse_RepoMember } from './models/ApiResponse_RepoMember';
export type { ApiResponse_RepoRelease } from './models/ApiResponse_RepoRelease';
export type { ApiResponse_RepoStar } from './models/ApiResponse_RepoStar';
export type { ApiResponse_RepoStats } from './models/ApiResponse_RepoStats';
export type { ApiResponse_RepoTag } from './models/ApiResponse_RepoTag';
export type { ApiResponse_RepoWatch } from './models/ApiResponse_RepoWatch';
export type { ApiResponse_RepoWebhook } from './models/ApiResponse_RepoWebhook';
export type { ApiResponse_RsaResponse } from './models/ApiResponse_RsaResponse';
export type { ApiResponse_String } from './models/ApiResponse_String';
export type { ApiResponse_User } from './models/ApiResponse_User';
export type { ApiResponse_UserAppearance } from './models/ApiResponse_UserAppearance';
export type { ApiResponse_UserAvatarResponse } from './models/ApiResponse_UserAvatarResponse';
export type { ApiResponse_UserDevice } from './models/ApiResponse_UserDevice';
export type { ApiResponse_UserGpgKey } from './models/ApiResponse_UserGpgKey';
export type { ApiResponse_UserNotifySetting } from './models/ApiResponse_UserNotifySetting';
export type { ApiResponse_UserOAuthInfo } from './models/ApiResponse_UserOAuthInfo';
export type { ApiResponse_UserPersonalAccessTokenInfo } from './models/ApiResponse_UserPersonalAccessTokenInfo';
export type { ApiResponse_UserProfile } from './models/ApiResponse_UserProfile';
export type { ApiResponse_UserSecurityLog } from './models/ApiResponse_UserSecurityLog';
export type { ApiResponse_UserSessionInfo } from './models/ApiResponse_UserSessionInfo';
export type { ApiResponse_UserSshKey } from './models/ApiResponse_UserSshKey';
export type { ApiResponse_Vec_BranchProtectionRule } from './models/ApiResponse_Vec_BranchProtectionRule';
export type { ApiResponse_Vec_Issue } from './models/ApiResponse_Vec_Issue';
export type { ApiResponse_Vec_IssueAssignee } from './models/ApiResponse_Vec_IssueAssignee';
export type { ApiResponse_Vec_IssueComment } from './models/ApiResponse_Vec_IssueComment';
export type { ApiResponse_Vec_IssueEvent } from './models/ApiResponse_Vec_IssueEvent';
export type { ApiResponse_Vec_IssueLabel } from './models/ApiResponse_Vec_IssueLabel';
export type { ApiResponse_Vec_IssueLabelRelation } from './models/ApiResponse_Vec_IssueLabelRelation';
export type { ApiResponse_Vec_IssueMilestone } from './models/ApiResponse_Vec_IssueMilestone';
export type { ApiResponse_Vec_IssuePrRelation } from './models/ApiResponse_Vec_IssuePrRelation';
export type { ApiResponse_Vec_IssueReaction } from './models/ApiResponse_Vec_IssueReaction';
export type { ApiResponse_Vec_IssueRepoRelation } from './models/ApiResponse_Vec_IssueRepoRelation';
export type { ApiResponse_Vec_IssueSubscriber } from './models/ApiResponse_Vec_IssueSubscriber';
export type { ApiResponse_Vec_IssueTemplate } from './models/ApiResponse_Vec_IssueTemplate';
export type { ApiResponse_Vec_PrAssignee } from './models/ApiResponse_Vec_PrAssignee';
export type { ApiResponse_Vec_PrCheckRun } from './models/ApiResponse_Vec_PrCheckRun';
export type { ApiResponse_Vec_PrCommit } from './models/ApiResponse_Vec_PrCommit';
export type { ApiResponse_Vec_PrEvent } from './models/ApiResponse_Vec_PrEvent';
export type { ApiResponse_Vec_PrFile } from './models/ApiResponse_Vec_PrFile';
export type { ApiResponse_Vec_PrLabel } from './models/ApiResponse_Vec_PrLabel';
export type { ApiResponse_Vec_PrLabelRelation } from './models/ApiResponse_Vec_PrLabelRelation';
export type { ApiResponse_Vec_PrReaction } from './models/ApiResponse_Vec_PrReaction';
export type { ApiResponse_Vec_PrReview } from './models/ApiResponse_Vec_PrReview';
export type { ApiResponse_Vec_PrReviewComment } from './models/ApiResponse_Vec_PrReviewComment';
export type { ApiResponse_Vec_PrSubscription } from './models/ApiResponse_Vec_PrSubscription';
export type { ApiResponse_Vec_PullRequest } from './models/ApiResponse_Vec_PullRequest';
export type { ApiResponse_Vec_Repo } from './models/ApiResponse_Vec_Repo';
export type { ApiResponse_Vec_RepoBranch } from './models/ApiResponse_Vec_RepoBranch';
export type { ApiResponse_Vec_RepoCommitComment } from './models/ApiResponse_Vec_RepoCommitComment';
export type { ApiResponse_Vec_RepoCommitStatus } from './models/ApiResponse_Vec_RepoCommitStatus';
export type { ApiResponse_Vec_RepoDeployKey } from './models/ApiResponse_Vec_RepoDeployKey';
export type { ApiResponse_Vec_RepoFork } from './models/ApiResponse_Vec_RepoFork';
export type { ApiResponse_Vec_RepoInvitation } from './models/ApiResponse_Vec_RepoInvitation';
export type { ApiResponse_Vec_RepoMember } from './models/ApiResponse_Vec_RepoMember';
export type { ApiResponse_Vec_RepoRelease } from './models/ApiResponse_Vec_RepoRelease';
export type { ApiResponse_Vec_RepoStar } from './models/ApiResponse_Vec_RepoStar';
export type { ApiResponse_Vec_RepoTag } from './models/ApiResponse_Vec_RepoTag';
export type { ApiResponse_Vec_RepoWatch } from './models/ApiResponse_Vec_RepoWatch';
export type { ApiResponse_Vec_RepoWebhook } from './models/ApiResponse_Vec_RepoWebhook';
export type { ApiResponse_Vec_UserDevice } from './models/ApiResponse_Vec_UserDevice';
export type { ApiResponse_Vec_UserGpgKey } from './models/ApiResponse_Vec_UserGpgKey';
export type { ApiResponse_Vec_UserOAuthInfo } from './models/ApiResponse_Vec_UserOAuthInfo';
export type { ApiResponse_Vec_UserPersonalAccessTokenInfo } from './models/ApiResponse_Vec_UserPersonalAccessTokenInfo';
export type { ApiResponse_Vec_UserSecurityLog } from './models/ApiResponse_Vec_UserSecurityLog';
export type { ApiResponse_Vec_UserSessionInfo } from './models/ApiResponse_Vec_UserSessionInfo';
export type { ApiResponse_Vec_UserSshKey } from './models/ApiResponse_Vec_UserSshKey';
export type { ApiResponse_Vec_WikiPage } from './models/ApiResponse_Vec_WikiPage';
export type { ApiResponse_Vec_WikiPageRevision } from './models/ApiResponse_Vec_WikiPageRevision';
export type { ApiResponse_Vec_Workspace } from './models/ApiResponse_Vec_Workspace';
export type { ApiResponse_Vec_WorkspaceAuditLog } from './models/ApiResponse_Vec_WorkspaceAuditLog';
export type { ApiResponse_Vec_WorkspaceDomain } from './models/ApiResponse_Vec_WorkspaceDomain';
export type { ApiResponse_Vec_WorkspaceIntegration } from './models/ApiResponse_Vec_WorkspaceIntegration';
export type { ApiResponse_Vec_WorkspaceInvitation } from './models/ApiResponse_Vec_WorkspaceInvitation';
export type { ApiResponse_Vec_WorkspaceMember } from './models/ApiResponse_Vec_WorkspaceMember';
export type { ApiResponse_Vec_WorkspacePendingApproval } from './models/ApiResponse_Vec_WorkspacePendingApproval';
export type { ApiResponse_Vec_WorkspaceWebhook } from './models/ApiResponse_Vec_WorkspaceWebhook';
export type { ApiResponse_WikiCompareResult } from './models/ApiResponse_WikiCompareResult';
export type { ApiResponse_WikiPage } from './models/ApiResponse_WikiPage';
export type { ApiResponse_WikiPageRevision } from './models/ApiResponse_WikiPageRevision';
export type { ApiResponse_Workspace } from './models/ApiResponse_Workspace';
export type { ApiResponse_WorkspaceBilling } from './models/ApiResponse_WorkspaceBilling';
export type { ApiResponse_WorkspaceCustomBranding } from './models/ApiResponse_WorkspaceCustomBranding';
export type { ApiResponse_WorkspaceDomain } from './models/ApiResponse_WorkspaceDomain';
export type { ApiResponse_WorkspaceIntegration } from './models/ApiResponse_WorkspaceIntegration';
export type { ApiResponse_WorkspaceInvitation } from './models/ApiResponse_WorkspaceInvitation';
export type { ApiResponse_WorkspaceMember } from './models/ApiResponse_WorkspaceMember';
export type { ApiResponse_WorkspacePendingApproval } from './models/ApiResponse_WorkspacePendingApproval';
export type { ApiResponse_WorkspaceSettings } from './models/ApiResponse_WorkspaceSettings';
export type { ApiResponse_WorkspaceStats } from './models/ApiResponse_WorkspaceStats';
export type { ApiResponse_WorkspaceWebhook } from './models/ApiResponse_WorkspaceWebhook';
export type { BranchMergeCheck } from './models/BranchMergeCheck';
export type { BranchProtectionRule } from './models/BranchProtectionRule';
export type { CaptchaQuery } from './models/CaptchaQuery';
export type { CaptchaResponse } from './models/CaptchaResponse';
export type { ColorScheme } from './models/ColorScheme';
export type { ContextMe } from './models/ContextMe';
export type { CreateBranchParams } from './models/CreateBranchParams';
export type { CreateCheckRunParams } from './models/CreateCheckRunParams';
export type { CreateCommentParams } from './models/CreateCommentParams';
export type { CreateCommitCommentParams } from './models/CreateCommitCommentParams';
export type { CreateCommitStatusParams } from './models/CreateCommitStatusParams';
export type { CreateIntegrationParams } from './models/CreateIntegrationParams';
export type { CreateInvitationParams } from './models/CreateInvitationParams';
export type { CreateInvitationResponse } from './models/CreateInvitationResponse';
export type { CreateIssueParams } from './models/CreateIssueParams';
export type { CreateIssueReactionParams } from './models/CreateIssueReactionParams';
export type { CreateLabelParams } from './models/CreateLabelParams';
export type { CreateMilestoneParams } from './models/CreateMilestoneParams';
export type { CreatePrLabelParams } from './models/CreatePrLabelParams';
export type { CreateProtectionRuleParams } from './models/CreateProtectionRuleParams';
export type { CreatePrParams } from './models/CreatePrParams';
export type { CreateReactionParams } from './models/CreateReactionParams';
export type { CreateReleaseParams } from './models/CreateReleaseParams';
export type { CreateRepoInvitationParams } from './models/CreateRepoInvitationParams';
export type { CreateRepoParams } from './models/CreateRepoParams';
export type { CreateReviewParams } from './models/CreateReviewParams';
export type { CreateTagParams } from './models/CreateTagParams';
export type { CreateTemplateParams } from './models/CreateTemplateParams';
export type { CreateWebhookParams } from './models/CreateWebhookParams';
export type { CreateWikiPageParams } from './models/CreateWikiPageParams';
export type { CreateWorkspaceParams } from './models/CreateWorkspaceParams';
export type { Density } from './models/Density';
export type { DeviceType } from './models/DeviceType';
export type { DigestFrequency } from './models/DigestFrequency';
export type { Disable2FAParams } from './models/Disable2FAParams';
export type { DismissReviewParams } from './models/DismissReviewParams';
export type { EmailChangeRequest } from './models/EmailChangeRequest';
export type { EmailResponse } from './models/EmailResponse';
export type { EmailVerifyRequest } from './models/EmailVerifyRequest';
export type { Enable2FAResponse } from './models/Enable2FAResponse';
export type { EventType } from './models/EventType';
export type { FontSize } from './models/FontSize';
export type { ForkRepoParams } from './models/ForkRepoParams';
export type { Get2FAStatusResponse } from './models/Get2FAStatusResponse';
export type { GitService } from './models/GitService';
export type { Issue } from './models/Issue';
export type { IssueAssignee } from './models/IssueAssignee';
export type { IssueComment } from './models/IssueComment';
export type { IssueEvent } from './models/IssueEvent';
export type { IssueLabel } from './models/IssueLabel';
export type { IssueLabelRelation } from './models/IssueLabelRelation';
export type { IssueListFilters } from './models/IssueListFilters';
export type { IssueMilestone } from './models/IssueMilestone';
export type { IssuePrRelation } from './models/IssuePrRelation';
export type { IssueReaction } from './models/IssueReaction';
export type { IssueRepoRelation } from './models/IssueRepoRelation';
export type { IssueSubscriber } from './models/IssueSubscriber';
export type { IssueTemplate } from './models/IssueTemplate';
export type { KeyType } from './models/KeyType';
export type { LinkPrParams } from './models/LinkPrParams';
export type { LinkRepoParams } from './models/LinkRepoParams';
export type { LockIssueParams } from './models/LockIssueParams';
export type { LockPrParams } from './models/LockPrParams';
export type { LoginParams } from './models/LoginParams';
export type { MergePrParams } from './models/MergePrParams';
export type { MergeStrategyKind } from './models/MergeStrategyKind';
export type { MuteIssueParams } from './models/MuteIssueParams';
export type { MutePrParams } from './models/MutePrParams';
export type { Permission } from './models/Permission';
export type { PrAssignee } from './models/PrAssignee';
export type { PrCheckRun } from './models/PrCheckRun';
export type { PrCommit } from './models/PrCommit';
export type { PrEvent } from './models/PrEvent';
export type { PrFile } from './models/PrFile';
export type { Priority } from './models/Priority';
export type { PrLabel } from './models/PrLabel';
export type { PrLabelRelation } from './models/PrLabelRelation';
export type { PrListFilters } from './models/PrListFilters';
export type { PrMergeStrategy } from './models/PrMergeStrategy';
export type { Provider } from './models/Provider';
export type { PrReaction } from './models/PrReaction';
export type { PrReview } from './models/PrReview';
export type { PrReviewComment } from './models/PrReviewComment';
export type { PrStatus } from './models/PrStatus';
export type { PrSubscription } from './models/PrSubscription';
export type { PullRequest } from './models/PullRequest';
export type { Regenerate2FABackupCodesRequest } from './models/Regenerate2FABackupCodesRequest';
export type { Regenerate2FABackupCodesResponse } from './models/Regenerate2FABackupCodesResponse';
export type { RegisterEmailCodeParams } from './models/RegisterEmailCodeParams';
export type { RegisterEmailCodeResponse } from './models/RegisterEmailCodeResponse';
export type { RegisterParams } from './models/RegisterParams';
export type { RegisterResponse } from './models/RegisterResponse';
export type { RelationType } from './models/RelationType';
export type { Repo } from './models/Repo';
export type { RepoBranch } from './models/RepoBranch';
export type { RepoCommitComment } from './models/RepoCommitComment';
export type { RepoCommitStatus } from './models/RepoCommitStatus';
export type { RepoDeployKey } from './models/RepoDeployKey';
export type { RepoFork } from './models/RepoFork';
export type { RepoInvitation } from './models/RepoInvitation';
export type { RepoMember } from './models/RepoMember';
export type { RepoRelease } from './models/RepoRelease';
export type { RepoStar } from './models/RepoStar';
export type { RepoStats } from './models/RepoStats';
export type { RepoTag } from './models/RepoTag';
export type { RepoWatch } from './models/RepoWatch';
export type { RepoWebhook } from './models/RepoWebhook';
export type { RequestApprovalParams } from './models/RequestApprovalParams';
export type { RequestType } from './models/RequestType';
export type { ResetPasswordRequest } from './models/ResetPasswordRequest';
export type { ResetPasswordVerifyParams } from './models/ResetPasswordVerifyParams';
export type { ReviewApprovalRequest } from './models/ReviewApprovalRequest';
export type { ReviewCommentParams } from './models/ReviewCommentParams';
export type { Role } from './models/Role';
export type { RsaResponse } from './models/RsaResponse';
export type { Scope } from './models/Scope';
export type { SetBranchProtectionParams } from './models/SetBranchProtectionParams';
export type { State } from './models/State';
export type { Status } from './models/Status';
export type { SubmitReviewParams } from './models/SubmitReviewParams';
export type { SubscriptionLevel } from './models/SubscriptionLevel';
export type { TargetType } from './models/TargetType';
export type { Theme } from './models/Theme';
export type { TransferIssueParams } from './models/TransferIssueParams';
export type { TransferOwnerParams } from './models/TransferOwnerParams';
export type { TransferOwnerRequest } from './models/TransferOwnerRequest';
export type { UpdateBillingParams } from './models/UpdateBillingParams';
export type { UpdateBrandingParams } from './models/UpdateBrandingParams';
export type { UpdateCheckRunParams } from './models/UpdateCheckRunParams';
export type { UpdateCommentParams } from './models/UpdateCommentParams';
export type { UpdateIntegrationParams } from './models/UpdateIntegrationParams';
export type { UpdateIssueParams } from './models/UpdateIssueParams';
export type { UpdateLabelParams } from './models/UpdateLabelParams';
export type { UpdateMemberRoleParams } from './models/UpdateMemberRoleParams';
export type { UpdateMergeStrategyParams } from './models/UpdateMergeStrategyParams';
export type { UpdateMilestoneParams } from './models/UpdateMilestoneParams';
export type { UpdatePrLabelParams } from './models/UpdatePrLabelParams';
export type { UpdateProtectionRuleParams } from './models/UpdateProtectionRuleParams';
export type { UpdatePrParams } from './models/UpdatePrParams';
export type { UpdateReleaseParams } from './models/UpdateReleaseParams';
export type { UpdateRepoMemberRoleParams } from './models/UpdateRepoMemberRoleParams';
export type { UpdateRepoParams } from './models/UpdateRepoParams';
export type { UpdateTemplateParams } from './models/UpdateTemplateParams';
export type { UpdateUserAccountParams } from './models/UpdateUserAccountParams';
export type { UpdateUserAppearanceParams } from './models/UpdateUserAppearanceParams';
export type { UpdateUserNotifySettingParams } from './models/UpdateUserNotifySettingParams';
export type { UpdateUserProfileParams } from './models/UpdateUserProfileParams';
export type { UpdateWebhookParams } from './models/UpdateWebhookParams';
export type { UpdateWikiPageParams } from './models/UpdateWikiPageParams';
export type { UpdateWorkspaceParams } from './models/UpdateWorkspaceParams';
export type { UpdateWorkspaceSettingsParams } from './models/UpdateWorkspaceSettingsParams';
export type { UploadUserAvatarParams } from './models/UploadUserAvatarParams';
export type { User } from './models/User';
export type { UserAppearance } from './models/UserAppearance';
export type { UserAvatarResponse } from './models/UserAvatarResponse';
export type { UserDevice } from './models/UserDevice';
export type { UserGpgKey } from './models/UserGpgKey';
export type { UserNotifySetting } from './models/UserNotifySetting';
export type { UserOAuthInfo } from './models/UserOAuthInfo';
export type { UserPersonalAccessTokenInfo } from './models/UserPersonalAccessTokenInfo';
export type { UserProfile } from './models/UserProfile';
export type { UserSecurityLog } from './models/UserSecurityLog';
export type { UserSessionInfo } from './models/UserSessionInfo';
export type { UserSshKey } from './models/UserSshKey';
export type { Value } from './models/Value';
export type { Verify2FAParams } from './models/Verify2FAParams';
export type { Visibility } from './models/Visibility';
export type { WatchParams } from './models/WatchParams';
export type { WikiCompareResult } from './models/WikiCompareResult';
export type { WikiPage } from './models/WikiPage';
export type { WikiPageRevision } from './models/WikiPageRevision';
export type { Workspace } from './models/Workspace';
export type { WorkspaceAuditLog } from './models/WorkspaceAuditLog';
export type { WorkspaceBilling } from './models/WorkspaceBilling';
export type { WorkspaceCustomBranding } from './models/WorkspaceCustomBranding';
export type { WorkspaceDomain } from './models/WorkspaceDomain';
export type { WorkspaceIntegration } from './models/WorkspaceIntegration';
export type { WorkspaceIntegrationConfig } from './models/WorkspaceIntegrationConfig';
export type { WorkspaceInvitation } from './models/WorkspaceInvitation';
export type { WorkspaceMember } from './models/WorkspaceMember';
export type { WorkspacePendingApproval } from './models/WorkspacePendingApproval';
export type { WorkspaceSettings } from './models/WorkspaceSettings';
export type { WorkspaceStats } from './models/WorkspaceStats';
export type { WorkspaceWebhook } from './models/WorkspaceWebhook';
export { $AcceptInvitationParams } from './schemas/$AcceptInvitationParams';
export { $AcceptInvitationRequest } from './schemas/$AcceptInvitationRequest';
export { $AddDeployKeyParams } from './schemas/$AddDeployKeyParams';
export { $AddDomainParams } from './schemas/$AddDomainParams';
export { $AddGpgKeyParams } from './schemas/$AddGpgKeyParams';
export { $AddMemberParams } from './schemas/$AddMemberParams';
export { $AddReplyParams } from './schemas/$AddReplyParams';
export { $AddRepoMemberParams } from './schemas/$AddRepoMemberParams';
export { $AddSshKeyParams } from './schemas/$AddSshKeyParams';
export { $ApiEmptyResponse } from './schemas/$ApiEmptyResponse';
export { $ApiErrorResponse } from './schemas/$ApiErrorResponse';
export { $ApiResponse_BranchMergeCheck } from './schemas/$ApiResponse_BranchMergeCheck';
export { $ApiResponse_BranchProtectionRule } from './schemas/$ApiResponse_BranchProtectionRule';
export { $ApiResponse_CaptchaResponse } from './schemas/$ApiResponse_CaptchaResponse';
export { $ApiResponse_ContextMe } from './schemas/$ApiResponse_ContextMe';
export { $ApiResponse_CreateInvitationResponse } from './schemas/$ApiResponse_CreateInvitationResponse';
export { $ApiResponse_EmailResponse } from './schemas/$ApiResponse_EmailResponse';
export { $ApiResponse_Enable2FAResponse } from './schemas/$ApiResponse_Enable2FAResponse';
export { $ApiResponse_Get2FAStatusResponse } from './schemas/$ApiResponse_Get2FAStatusResponse';
export { $ApiResponse_Issue } from './schemas/$ApiResponse_Issue';
export { $ApiResponse_IssueAssignee } from './schemas/$ApiResponse_IssueAssignee';
export { $ApiResponse_IssueComment } from './schemas/$ApiResponse_IssueComment';
export { $ApiResponse_IssueEvent } from './schemas/$ApiResponse_IssueEvent';
export { $ApiResponse_IssueLabel } from './schemas/$ApiResponse_IssueLabel';
export { $ApiResponse_IssueLabelRelation } from './schemas/$ApiResponse_IssueLabelRelation';
export { $ApiResponse_IssueMilestone } from './schemas/$ApiResponse_IssueMilestone';
export { $ApiResponse_IssuePrRelation } from './schemas/$ApiResponse_IssuePrRelation';
export { $ApiResponse_IssueReaction } from './schemas/$ApiResponse_IssueReaction';
export { $ApiResponse_IssueRepoRelation } from './schemas/$ApiResponse_IssueRepoRelation';
export { $ApiResponse_IssueSubscriber } from './schemas/$ApiResponse_IssueSubscriber';
export { $ApiResponse_IssueTemplate } from './schemas/$ApiResponse_IssueTemplate';
export { $ApiResponse_Option_BranchProtectionRule } from './schemas/$ApiResponse_Option_BranchProtectionRule';
export { $ApiResponse_PrAssignee } from './schemas/$ApiResponse_PrAssignee';
export { $ApiResponse_PrCheckRun } from './schemas/$ApiResponse_PrCheckRun';
export { $ApiResponse_PrCommit } from './schemas/$ApiResponse_PrCommit';
export { $ApiResponse_PrEvent } from './schemas/$ApiResponse_PrEvent';
export { $ApiResponse_PrFile } from './schemas/$ApiResponse_PrFile';
export { $ApiResponse_PrLabel } from './schemas/$ApiResponse_PrLabel';
export { $ApiResponse_PrLabelRelation } from './schemas/$ApiResponse_PrLabelRelation';
export { $ApiResponse_PrMergeStrategy } from './schemas/$ApiResponse_PrMergeStrategy';
export { $ApiResponse_PrReaction } from './schemas/$ApiResponse_PrReaction';
export { $ApiResponse_PrReview } from './schemas/$ApiResponse_PrReview';
export { $ApiResponse_PrReviewComment } from './schemas/$ApiResponse_PrReviewComment';
export { $ApiResponse_PrStatus } from './schemas/$ApiResponse_PrStatus';
export { $ApiResponse_PrSubscription } from './schemas/$ApiResponse_PrSubscription';
export { $ApiResponse_PullRequest } from './schemas/$ApiResponse_PullRequest';
export { $ApiResponse_Regenerate2FABackupCodesResponse } from './schemas/$ApiResponse_Regenerate2FABackupCodesResponse';
export { $ApiResponse_RegisterEmailCodeResponse } from './schemas/$ApiResponse_RegisterEmailCodeResponse';
export { $ApiResponse_RegisterResponse } from './schemas/$ApiResponse_RegisterResponse';
export { $ApiResponse_Repo } from './schemas/$ApiResponse_Repo';
export { $ApiResponse_RepoBranch } from './schemas/$ApiResponse_RepoBranch';
export { $ApiResponse_RepoCommitComment } from './schemas/$ApiResponse_RepoCommitComment';
export { $ApiResponse_RepoCommitStatus } from './schemas/$ApiResponse_RepoCommitStatus';
export { $ApiResponse_RepoDeployKey } from './schemas/$ApiResponse_RepoDeployKey';
export { $ApiResponse_RepoFork } from './schemas/$ApiResponse_RepoFork';
export { $ApiResponse_RepoInvitation } from './schemas/$ApiResponse_RepoInvitation';
export { $ApiResponse_RepoMember } from './schemas/$ApiResponse_RepoMember';
export { $ApiResponse_RepoRelease } from './schemas/$ApiResponse_RepoRelease';
export { $ApiResponse_RepoStar } from './schemas/$ApiResponse_RepoStar';
export { $ApiResponse_RepoStats } from './schemas/$ApiResponse_RepoStats';
export { $ApiResponse_RepoTag } from './schemas/$ApiResponse_RepoTag';
export { $ApiResponse_RepoWatch } from './schemas/$ApiResponse_RepoWatch';
export { $ApiResponse_RepoWebhook } from './schemas/$ApiResponse_RepoWebhook';
export { $ApiResponse_RsaResponse } from './schemas/$ApiResponse_RsaResponse';
export { $ApiResponse_String } from './schemas/$ApiResponse_String';
export { $ApiResponse_User } from './schemas/$ApiResponse_User';
export { $ApiResponse_UserAppearance } from './schemas/$ApiResponse_UserAppearance';
export { $ApiResponse_UserAvatarResponse } from './schemas/$ApiResponse_UserAvatarResponse';
export { $ApiResponse_UserDevice } from './schemas/$ApiResponse_UserDevice';
export { $ApiResponse_UserGpgKey } from './schemas/$ApiResponse_UserGpgKey';
export { $ApiResponse_UserNotifySetting } from './schemas/$ApiResponse_UserNotifySetting';
export { $ApiResponse_UserOAuthInfo } from './schemas/$ApiResponse_UserOAuthInfo';
export { $ApiResponse_UserPersonalAccessTokenInfo } from './schemas/$ApiResponse_UserPersonalAccessTokenInfo';
export { $ApiResponse_UserProfile } from './schemas/$ApiResponse_UserProfile';
export { $ApiResponse_UserSecurityLog } from './schemas/$ApiResponse_UserSecurityLog';
export { $ApiResponse_UserSessionInfo } from './schemas/$ApiResponse_UserSessionInfo';
export { $ApiResponse_UserSshKey } from './schemas/$ApiResponse_UserSshKey';
export { $ApiResponse_Vec_BranchProtectionRule } from './schemas/$ApiResponse_Vec_BranchProtectionRule';
export { $ApiResponse_Vec_Issue } from './schemas/$ApiResponse_Vec_Issue';
export { $ApiResponse_Vec_IssueAssignee } from './schemas/$ApiResponse_Vec_IssueAssignee';
export { $ApiResponse_Vec_IssueComment } from './schemas/$ApiResponse_Vec_IssueComment';
export { $ApiResponse_Vec_IssueEvent } from './schemas/$ApiResponse_Vec_IssueEvent';
export { $ApiResponse_Vec_IssueLabel } from './schemas/$ApiResponse_Vec_IssueLabel';
export { $ApiResponse_Vec_IssueLabelRelation } from './schemas/$ApiResponse_Vec_IssueLabelRelation';
export { $ApiResponse_Vec_IssueMilestone } from './schemas/$ApiResponse_Vec_IssueMilestone';
export { $ApiResponse_Vec_IssuePrRelation } from './schemas/$ApiResponse_Vec_IssuePrRelation';
export { $ApiResponse_Vec_IssueReaction } from './schemas/$ApiResponse_Vec_IssueReaction';
export { $ApiResponse_Vec_IssueRepoRelation } from './schemas/$ApiResponse_Vec_IssueRepoRelation';
export { $ApiResponse_Vec_IssueSubscriber } from './schemas/$ApiResponse_Vec_IssueSubscriber';
export { $ApiResponse_Vec_IssueTemplate } from './schemas/$ApiResponse_Vec_IssueTemplate';
export { $ApiResponse_Vec_PrAssignee } from './schemas/$ApiResponse_Vec_PrAssignee';
export { $ApiResponse_Vec_PrCheckRun } from './schemas/$ApiResponse_Vec_PrCheckRun';
export { $ApiResponse_Vec_PrCommit } from './schemas/$ApiResponse_Vec_PrCommit';
export { $ApiResponse_Vec_PrEvent } from './schemas/$ApiResponse_Vec_PrEvent';
export { $ApiResponse_Vec_PrFile } from './schemas/$ApiResponse_Vec_PrFile';
export { $ApiResponse_Vec_PrLabel } from './schemas/$ApiResponse_Vec_PrLabel';
export { $ApiResponse_Vec_PrLabelRelation } from './schemas/$ApiResponse_Vec_PrLabelRelation';
export { $ApiResponse_Vec_PrReaction } from './schemas/$ApiResponse_Vec_PrReaction';
export { $ApiResponse_Vec_PrReview } from './schemas/$ApiResponse_Vec_PrReview';
export { $ApiResponse_Vec_PrReviewComment } from './schemas/$ApiResponse_Vec_PrReviewComment';
export { $ApiResponse_Vec_PrSubscription } from './schemas/$ApiResponse_Vec_PrSubscription';
export { $ApiResponse_Vec_PullRequest } from './schemas/$ApiResponse_Vec_PullRequest';
export { $ApiResponse_Vec_Repo } from './schemas/$ApiResponse_Vec_Repo';
export { $ApiResponse_Vec_RepoBranch } from './schemas/$ApiResponse_Vec_RepoBranch';
export { $ApiResponse_Vec_RepoCommitComment } from './schemas/$ApiResponse_Vec_RepoCommitComment';
export { $ApiResponse_Vec_RepoCommitStatus } from './schemas/$ApiResponse_Vec_RepoCommitStatus';
export { $ApiResponse_Vec_RepoDeployKey } from './schemas/$ApiResponse_Vec_RepoDeployKey';
export { $ApiResponse_Vec_RepoFork } from './schemas/$ApiResponse_Vec_RepoFork';
export { $ApiResponse_Vec_RepoInvitation } from './schemas/$ApiResponse_Vec_RepoInvitation';
export { $ApiResponse_Vec_RepoMember } from './schemas/$ApiResponse_Vec_RepoMember';
export { $ApiResponse_Vec_RepoRelease } from './schemas/$ApiResponse_Vec_RepoRelease';
export { $ApiResponse_Vec_RepoStar } from './schemas/$ApiResponse_Vec_RepoStar';
export { $ApiResponse_Vec_RepoTag } from './schemas/$ApiResponse_Vec_RepoTag';
export { $ApiResponse_Vec_RepoWatch } from './schemas/$ApiResponse_Vec_RepoWatch';
export { $ApiResponse_Vec_RepoWebhook } from './schemas/$ApiResponse_Vec_RepoWebhook';
export { $ApiResponse_Vec_UserDevice } from './schemas/$ApiResponse_Vec_UserDevice';
export { $ApiResponse_Vec_UserGpgKey } from './schemas/$ApiResponse_Vec_UserGpgKey';
export { $ApiResponse_Vec_UserOAuthInfo } from './schemas/$ApiResponse_Vec_UserOAuthInfo';
export { $ApiResponse_Vec_UserPersonalAccessTokenInfo } from './schemas/$ApiResponse_Vec_UserPersonalAccessTokenInfo';
export { $ApiResponse_Vec_UserSecurityLog } from './schemas/$ApiResponse_Vec_UserSecurityLog';
export { $ApiResponse_Vec_UserSessionInfo } from './schemas/$ApiResponse_Vec_UserSessionInfo';
export { $ApiResponse_Vec_UserSshKey } from './schemas/$ApiResponse_Vec_UserSshKey';
export { $ApiResponse_Vec_WikiPage } from './schemas/$ApiResponse_Vec_WikiPage';
export { $ApiResponse_Vec_WikiPageRevision } from './schemas/$ApiResponse_Vec_WikiPageRevision';
export { $ApiResponse_Vec_Workspace } from './schemas/$ApiResponse_Vec_Workspace';
export { $ApiResponse_Vec_WorkspaceAuditLog } from './schemas/$ApiResponse_Vec_WorkspaceAuditLog';
export { $ApiResponse_Vec_WorkspaceDomain } from './schemas/$ApiResponse_Vec_WorkspaceDomain';
export { $ApiResponse_Vec_WorkspaceIntegration } from './schemas/$ApiResponse_Vec_WorkspaceIntegration';
export { $ApiResponse_Vec_WorkspaceInvitation } from './schemas/$ApiResponse_Vec_WorkspaceInvitation';
export { $ApiResponse_Vec_WorkspaceMember } from './schemas/$ApiResponse_Vec_WorkspaceMember';
export { $ApiResponse_Vec_WorkspacePendingApproval } from './schemas/$ApiResponse_Vec_WorkspacePendingApproval';
export { $ApiResponse_Vec_WorkspaceWebhook } from './schemas/$ApiResponse_Vec_WorkspaceWebhook';
export { $ApiResponse_WikiCompareResult } from './schemas/$ApiResponse_WikiCompareResult';
export { $ApiResponse_WikiPage } from './schemas/$ApiResponse_WikiPage';
export { $ApiResponse_WikiPageRevision } from './schemas/$ApiResponse_WikiPageRevision';
export { $ApiResponse_Workspace } from './schemas/$ApiResponse_Workspace';
export { $ApiResponse_WorkspaceBilling } from './schemas/$ApiResponse_WorkspaceBilling';
export { $ApiResponse_WorkspaceCustomBranding } from './schemas/$ApiResponse_WorkspaceCustomBranding';
export { $ApiResponse_WorkspaceDomain } from './schemas/$ApiResponse_WorkspaceDomain';
export { $ApiResponse_WorkspaceIntegration } from './schemas/$ApiResponse_WorkspaceIntegration';
export { $ApiResponse_WorkspaceInvitation } from './schemas/$ApiResponse_WorkspaceInvitation';
export { $ApiResponse_WorkspaceMember } from './schemas/$ApiResponse_WorkspaceMember';
export { $ApiResponse_WorkspacePendingApproval } from './schemas/$ApiResponse_WorkspacePendingApproval';
export { $ApiResponse_WorkspaceSettings } from './schemas/$ApiResponse_WorkspaceSettings';
export { $ApiResponse_WorkspaceStats } from './schemas/$ApiResponse_WorkspaceStats';
export { $ApiResponse_WorkspaceWebhook } from './schemas/$ApiResponse_WorkspaceWebhook';
export { $BranchMergeCheck } from './schemas/$BranchMergeCheck';
export { $BranchProtectionRule } from './schemas/$BranchProtectionRule';
export { $CaptchaQuery } from './schemas/$CaptchaQuery';
export { $CaptchaResponse } from './schemas/$CaptchaResponse';
export { $ColorScheme } from './schemas/$ColorScheme';
export { $ContextMe } from './schemas/$ContextMe';
export { $CreateBranchParams } from './schemas/$CreateBranchParams';
export { $CreateCheckRunParams } from './schemas/$CreateCheckRunParams';
export { $CreateCommentParams } from './schemas/$CreateCommentParams';
export { $CreateCommitCommentParams } from './schemas/$CreateCommitCommentParams';
export { $CreateCommitStatusParams } from './schemas/$CreateCommitStatusParams';
export { $CreateIntegrationParams } from './schemas/$CreateIntegrationParams';
export { $CreateInvitationParams } from './schemas/$CreateInvitationParams';
export { $CreateInvitationResponse } from './schemas/$CreateInvitationResponse';
export { $CreateIssueParams } from './schemas/$CreateIssueParams';
export { $CreateIssueReactionParams } from './schemas/$CreateIssueReactionParams';
export { $CreateLabelParams } from './schemas/$CreateLabelParams';
export { $CreateMilestoneParams } from './schemas/$CreateMilestoneParams';
export { $CreatePrLabelParams } from './schemas/$CreatePrLabelParams';
export { $CreateProtectionRuleParams } from './schemas/$CreateProtectionRuleParams';
export { $CreatePrParams } from './schemas/$CreatePrParams';
export { $CreateReactionParams } from './schemas/$CreateReactionParams';
export { $CreateReleaseParams } from './schemas/$CreateReleaseParams';
export { $CreateRepoInvitationParams } from './schemas/$CreateRepoInvitationParams';
export { $CreateRepoParams } from './schemas/$CreateRepoParams';
export { $CreateReviewParams } from './schemas/$CreateReviewParams';
export { $CreateTagParams } from './schemas/$CreateTagParams';
export { $CreateTemplateParams } from './schemas/$CreateTemplateParams';
export { $CreateWebhookParams } from './schemas/$CreateWebhookParams';
export { $CreateWikiPageParams } from './schemas/$CreateWikiPageParams';
export { $CreateWorkspaceParams } from './schemas/$CreateWorkspaceParams';
export { $Density } from './schemas/$Density';
export { $DeviceType } from './schemas/$DeviceType';
export { $DigestFrequency } from './schemas/$DigestFrequency';
export { $Disable2FAParams } from './schemas/$Disable2FAParams';
export { $DismissReviewParams } from './schemas/$DismissReviewParams';
export { $EmailChangeRequest } from './schemas/$EmailChangeRequest';
export { $EmailResponse } from './schemas/$EmailResponse';
export { $EmailVerifyRequest } from './schemas/$EmailVerifyRequest';
export { $Enable2FAResponse } from './schemas/$Enable2FAResponse';
export { $EventType } from './schemas/$EventType';
export { $FontSize } from './schemas/$FontSize';
export { $ForkRepoParams } from './schemas/$ForkRepoParams';
export { $Get2FAStatusResponse } from './schemas/$Get2FAStatusResponse';
export { $GitService } from './schemas/$GitService';
export { $Issue } from './schemas/$Issue';
export { $IssueAssignee } from './schemas/$IssueAssignee';
export { $IssueComment } from './schemas/$IssueComment';
export { $IssueEvent } from './schemas/$IssueEvent';
export { $IssueLabel } from './schemas/$IssueLabel';
export { $IssueLabelRelation } from './schemas/$IssueLabelRelation';
export { $IssueListFilters } from './schemas/$IssueListFilters';
export { $IssueMilestone } from './schemas/$IssueMilestone';
export { $IssuePrRelation } from './schemas/$IssuePrRelation';
export { $IssueReaction } from './schemas/$IssueReaction';
export { $IssueRepoRelation } from './schemas/$IssueRepoRelation';
export { $IssueSubscriber } from './schemas/$IssueSubscriber';
export { $IssueTemplate } from './schemas/$IssueTemplate';
export { $KeyType } from './schemas/$KeyType';
export { $LinkPrParams } from './schemas/$LinkPrParams';
export { $LinkRepoParams } from './schemas/$LinkRepoParams';
export { $LockIssueParams } from './schemas/$LockIssueParams';
export { $LockPrParams } from './schemas/$LockPrParams';
export { $LoginParams } from './schemas/$LoginParams';
export { $MergePrParams } from './schemas/$MergePrParams';
export { $MergeStrategyKind } from './schemas/$MergeStrategyKind';
export { $MuteIssueParams } from './schemas/$MuteIssueParams';
export { $MutePrParams } from './schemas/$MutePrParams';
export { $Permission } from './schemas/$Permission';
export { $PrAssignee } from './schemas/$PrAssignee';
export { $PrCheckRun } from './schemas/$PrCheckRun';
export { $PrCommit } from './schemas/$PrCommit';
export { $PrEvent } from './schemas/$PrEvent';
export { $PrFile } from './schemas/$PrFile';
export { $Priority } from './schemas/$Priority';
export { $PrLabel } from './schemas/$PrLabel';
export { $PrLabelRelation } from './schemas/$PrLabelRelation';
export { $PrListFilters } from './schemas/$PrListFilters';
export { $PrMergeStrategy } from './schemas/$PrMergeStrategy';
export { $Provider } from './schemas/$Provider';
export { $PrReaction } from './schemas/$PrReaction';
export { $PrReview } from './schemas/$PrReview';
export { $PrReviewComment } from './schemas/$PrReviewComment';
export { $PrStatus } from './schemas/$PrStatus';
export { $PrSubscription } from './schemas/$PrSubscription';
export { $PullRequest } from './schemas/$PullRequest';
export { $Regenerate2FABackupCodesRequest } from './schemas/$Regenerate2FABackupCodesRequest';
export { $Regenerate2FABackupCodesResponse } from './schemas/$Regenerate2FABackupCodesResponse';
export { $RegisterEmailCodeParams } from './schemas/$RegisterEmailCodeParams';
export { $RegisterEmailCodeResponse } from './schemas/$RegisterEmailCodeResponse';
export { $RegisterParams } from './schemas/$RegisterParams';
export { $RegisterResponse } from './schemas/$RegisterResponse';
export { $RelationType } from './schemas/$RelationType';
export { $Repo } from './schemas/$Repo';
export { $RepoBranch } from './schemas/$RepoBranch';
export { $RepoCommitComment } from './schemas/$RepoCommitComment';
export { $RepoCommitStatus } from './schemas/$RepoCommitStatus';
export { $RepoDeployKey } from './schemas/$RepoDeployKey';
export { $RepoFork } from './schemas/$RepoFork';
export { $RepoInvitation } from './schemas/$RepoInvitation';
export { $RepoMember } from './schemas/$RepoMember';
export { $RepoRelease } from './schemas/$RepoRelease';
export { $RepoStar } from './schemas/$RepoStar';
export { $RepoStats } from './schemas/$RepoStats';
export { $RepoTag } from './schemas/$RepoTag';
export { $RepoWatch } from './schemas/$RepoWatch';
export { $RepoWebhook } from './schemas/$RepoWebhook';
export { $RequestApprovalParams } from './schemas/$RequestApprovalParams';
export { $RequestType } from './schemas/$RequestType';
export { $ResetPasswordRequest } from './schemas/$ResetPasswordRequest';
export { $ResetPasswordVerifyParams } from './schemas/$ResetPasswordVerifyParams';
export { $ReviewApprovalRequest } from './schemas/$ReviewApprovalRequest';
export { $ReviewCommentParams } from './schemas/$ReviewCommentParams';
export { $Role } from './schemas/$Role';
export { $RsaResponse } from './schemas/$RsaResponse';
export { $Scope } from './schemas/$Scope';
export { $SetBranchProtectionParams } from './schemas/$SetBranchProtectionParams';
export { $State } from './schemas/$State';
export { $Status } from './schemas/$Status';
export { $SubmitReviewParams } from './schemas/$SubmitReviewParams';
export { $SubscriptionLevel } from './schemas/$SubscriptionLevel';
export { $TargetType } from './schemas/$TargetType';
export { $Theme } from './schemas/$Theme';
export { $TransferIssueParams } from './schemas/$TransferIssueParams';
export { $TransferOwnerParams } from './schemas/$TransferOwnerParams';
export { $TransferOwnerRequest } from './schemas/$TransferOwnerRequest';
export { $UpdateBillingParams } from './schemas/$UpdateBillingParams';
export { $UpdateBrandingParams } from './schemas/$UpdateBrandingParams';
export { $UpdateCheckRunParams } from './schemas/$UpdateCheckRunParams';
export { $UpdateCommentParams } from './schemas/$UpdateCommentParams';
export { $UpdateIntegrationParams } from './schemas/$UpdateIntegrationParams';
export { $UpdateIssueParams } from './schemas/$UpdateIssueParams';
export { $UpdateLabelParams } from './schemas/$UpdateLabelParams';
export { $UpdateMemberRoleParams } from './schemas/$UpdateMemberRoleParams';
export { $UpdateMergeStrategyParams } from './schemas/$UpdateMergeStrategyParams';
export { $UpdateMilestoneParams } from './schemas/$UpdateMilestoneParams';
export { $UpdatePrLabelParams } from './schemas/$UpdatePrLabelParams';
export { $UpdateProtectionRuleParams } from './schemas/$UpdateProtectionRuleParams';
export { $UpdatePrParams } from './schemas/$UpdatePrParams';
export { $UpdateReleaseParams } from './schemas/$UpdateReleaseParams';
export { $UpdateRepoMemberRoleParams } from './schemas/$UpdateRepoMemberRoleParams';
export { $UpdateRepoParams } from './schemas/$UpdateRepoParams';
export { $UpdateTemplateParams } from './schemas/$UpdateTemplateParams';
export { $UpdateUserAccountParams } from './schemas/$UpdateUserAccountParams';
export { $UpdateUserAppearanceParams } from './schemas/$UpdateUserAppearanceParams';
export { $UpdateUserNotifySettingParams } from './schemas/$UpdateUserNotifySettingParams';
export { $UpdateUserProfileParams } from './schemas/$UpdateUserProfileParams';
export { $UpdateWebhookParams } from './schemas/$UpdateWebhookParams';
export { $UpdateWikiPageParams } from './schemas/$UpdateWikiPageParams';
export { $UpdateWorkspaceParams } from './schemas/$UpdateWorkspaceParams';
export { $UpdateWorkspaceSettingsParams } from './schemas/$UpdateWorkspaceSettingsParams';
export { $UploadUserAvatarParams } from './schemas/$UploadUserAvatarParams';
export { $User } from './schemas/$User';
export { $UserAppearance } from './schemas/$UserAppearance';
export { $UserAvatarResponse } from './schemas/$UserAvatarResponse';
export { $UserDevice } from './schemas/$UserDevice';
export { $UserGpgKey } from './schemas/$UserGpgKey';
export { $UserNotifySetting } from './schemas/$UserNotifySetting';
export { $UserOAuthInfo } from './schemas/$UserOAuthInfo';
export { $UserPersonalAccessTokenInfo } from './schemas/$UserPersonalAccessTokenInfo';
export { $UserProfile } from './schemas/$UserProfile';
export { $UserSecurityLog } from './schemas/$UserSecurityLog';
export { $UserSessionInfo } from './schemas/$UserSessionInfo';
export { $UserSshKey } from './schemas/$UserSshKey';
export { $Value } from './schemas/$Value';
export { $Verify2FAParams } from './schemas/$Verify2FAParams';
export { $Visibility } from './schemas/$Visibility';
export { $WatchParams } from './schemas/$WatchParams';
export { $WikiCompareResult } from './schemas/$WikiCompareResult';
export { $WikiPage } from './schemas/$WikiPage';
export { $WikiPageRevision } from './schemas/$WikiPageRevision';
export { $Workspace } from './schemas/$Workspace';
export { $WorkspaceAuditLog } from './schemas/$WorkspaceAuditLog';
export { $WorkspaceBilling } from './schemas/$WorkspaceBilling';
export { $WorkspaceCustomBranding } from './schemas/$WorkspaceCustomBranding';
export { $WorkspaceDomain } from './schemas/$WorkspaceDomain';
export { $WorkspaceIntegration } from './schemas/$WorkspaceIntegration';
export { $WorkspaceIntegrationConfig } from './schemas/$WorkspaceIntegrationConfig';
export { $WorkspaceInvitation } from './schemas/$WorkspaceInvitation';
export { $WorkspaceMember } from './schemas/$WorkspaceMember';
export { $WorkspacePendingApproval } from './schemas/$WorkspacePendingApproval';
export { $WorkspaceSettings } from './schemas/$WorkspaceSettings';
export { $WorkspaceStats } from './schemas/$WorkspaceStats';
export { $WorkspaceWebhook } from './schemas/$WorkspaceWebhook';
export { AuthService } from './services/AuthService';
export { IssuesService } from './services/IssuesService';
export { PullRequestsService } from './services/PullRequestsService';
export { ReposService } from './services/ReposService';
export { UserService } from './services/UserService';
export { WikiService } from './services/WikiService';
export { WorkspacesService } from './services/WorkspacesService';
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type AcceptInvitationParams = {
/**
* Invitation token (received via email)
*/
token: string;
};
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type AcceptInvitationRequest = {
/**
* The plaintext invitation token from the email link.
*/
token: string;
};
+11
View File
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type AddDeployKeyParams = {
key_type: string;
public_key: string;
read_only?: boolean | null;
title: string;
};
+8
View File
@@ -0,0 +1,8 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type AddDomainParams = {
domain: string;
};
+11
View File
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type AddGpgKeyParams = {
expires_at?: string | null;
key_id: string;
primary_email?: string | null;
public_key: string;
};
+9
View File
@@ -0,0 +1,9 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type AddMemberParams = {
role?: string | null;
user_id: string;
};
+8
View File
@@ -0,0 +1,8 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type AddReplyParams = {
body: string;
};
+9
View File
@@ -0,0 +1,9 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type AddRepoMemberParams = {
role?: string | null;
user_id: string;
};
+11
View File
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type AddSshKeyParams = {
expires_at?: string | null;
key_type: string;
public_key: string;
title: string;
};
+11
View File
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiEmptyResponse = {
/**
* Human-readable success message.
*/
message: string;
};
+11
View File
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiErrorResponse = {
/**
* Stable, client-safe error message.
*/
error: string;
};
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_BranchMergeCheck = {
data: {
allowed: boolean;
reasons: Array<string>;
};
};
@@ -0,0 +1,29 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_BranchProtectionRule = {
data: {
allow_deletions: boolean;
allow_force_pushes: boolean;
created_at: string;
created_by?: string | null;
dismiss_stale_reviews: boolean;
dismissal_allowances: Array<string>;
id: string;
pattern: string;
push_allowances: Array<string>;
repo_id: string;
require_approvals: number;
require_code_owner_review: boolean;
require_conversation_resolution: boolean;
require_linear_history: boolean;
require_signed_commits: boolean;
require_status_checks: boolean;
required_status_checks: Array<string>;
restrict_pushes: boolean;
restrict_review_dismissal: boolean;
updated_at: string;
};
};
@@ -0,0 +1,14 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { CaptchaQuery } from './CaptchaQuery';
import type { RsaResponse } from './RsaResponse';
export type ApiResponse_CaptchaResponse = {
data: {
base64: string;
req: CaptchaQuery;
rsa?: (null | RsaResponse);
};
};
@@ -0,0 +1,16 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_ContextMe = {
data: {
avatar_url?: string | null;
display_name?: string | null;
has_unread_notifications: number;
id: string;
language: string;
timezone: string;
username: string;
};
};
@@ -0,0 +1,11 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { WorkspaceInvitation } from './WorkspaceInvitation';
export type ApiResponse_CreateInvitationResponse = {
data: {
invitation: WorkspaceInvitation;
};
};
@@ -0,0 +1,10 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_EmailResponse = {
data: {
email?: string | null;
};
};
@@ -0,0 +1,12 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_Enable2FAResponse = {
data: {
backup_codes: Array<string>;
qr_code: string;
secret: string;
};
};
@@ -0,0 +1,12 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_Get2FAStatusResponse = {
data: {
has_backup_codes: boolean;
is_enabled: boolean;
method?: string | null;
};
};
+29
View File
@@ -0,0 +1,29 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { Priority } from './Priority';
import type { State } from './State';
import type { Visibility } from './Visibility';
export type ApiResponse_Issue = {
data: {
author_id: string;
body?: string | null;
closed_at?: string | null;
closed_by?: string | null;
created_at: string;
deleted_at?: string | null;
due_at?: string | null;
id: string;
locked: boolean;
milestone_id?: string | null;
number: number;
priority: Priority;
state: State;
title: string;
updated_at: string;
visibility: Visibility;
workspace_id: string;
};
};
@@ -0,0 +1,14 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_IssueAssignee = {
data: {
assigned_by?: string | null;
assignee_id: string;
created_at: string;
id: string;
issue_id: string;
};
};
@@ -0,0 +1,18 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_IssueComment = {
data: {
author_id: string;
body: string;
created_at: string;
deleted_at?: string | null;
edited_at?: string | null;
id: string;
issue_id: string;
reply_to_comment_id?: string | null;
updated_at: string;
};
};
@@ -0,0 +1,19 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { EventType } from './EventType';
import type { Value } from './Value';
export type ApiResponse_IssueEvent = {
data: {
actor_id?: string | null;
created_at: string;
event_type: EventType;
id: string;
issue_id: string;
metadata?: (null | Value);
new_value?: (null | Value);
old_value?: (null | Value);
};
};
@@ -0,0 +1,17 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_IssueLabel = {
data: {
color: string;
created_at: string;
created_by?: string | null;
description?: string | null;
id: string;
name: string;
repo_id: string;
updated_at: string;
};
};
@@ -0,0 +1,14 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_IssueLabelRelation = {
data: {
created_at: string;
created_by?: string | null;
id: string;
issue_id: string;
label_id: string;
};
};
@@ -0,0 +1,20 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { State } from './State';
export type ApiResponse_IssueMilestone = {
data: {
closed_at?: string | null;
created_at: string;
created_by: string;
description?: string | null;
due_at?: string | null;
id: string;
repo_id: string;
state: State;
title: string;
updated_at: string;
};
};
@@ -0,0 +1,16 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { RelationType } from './RelationType';
export type ApiResponse_IssuePrRelation = {
data: {
created_at: string;
created_by?: string | null;
id: string;
issue_id: string;
pull_request_id: string;
relation_type: RelationType;
};
};
@@ -0,0 +1,17 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { TargetType } from './TargetType';
export type ApiResponse_IssueReaction = {
data: {
content: string;
created_at: string;
id: string;
issue_id: string;
target_id?: string | null;
target_type: TargetType;
user_id: string;
};
};
@@ -0,0 +1,16 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { RelationType } from './RelationType';
export type ApiResponse_IssueRepoRelation = {
data: {
created_at: string;
created_by?: string | null;
id: string;
issue_id: string;
relation_type: RelationType;
repo_id: string;
};
};
@@ -0,0 +1,16 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_IssueSubscriber = {
data: {
created_at: string;
id: string;
issue_id: string;
muted: boolean;
reason: string;
updated_at: string;
user_id: string;
};
};
@@ -0,0 +1,20 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_IssueTemplate = {
data: {
active: boolean;
body_template: string;
created_at: string;
created_by: string;
description?: string | null;
id: string;
labels: Array<string>;
name: string;
repo_id: string;
title_template?: string | null;
updated_at: string;
};
};
@@ -0,0 +1,29 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_Option_BranchProtectionRule = {
data: (null | {
allow_deletions: boolean;
allow_force_pushes: boolean;
created_at: string;
created_by?: string | null;
dismiss_stale_reviews: boolean;
dismissal_allowances: Array<string>;
id: string;
pattern: string;
push_allowances: Array<string>;
repo_id: string;
require_approvals: number;
require_code_owner_review: boolean;
require_conversation_resolution: boolean;
require_linear_history: boolean;
require_signed_commits: boolean;
require_status_checks: boolean;
required_status_checks: Array<string>;
restrict_pushes: boolean;
restrict_review_dismissal: boolean;
updated_at: string;
});
};
@@ -0,0 +1,14 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_PrAssignee = {
data: {
assigned_by?: string | null;
assignee_id: string;
created_at: string;
id: string;
pull_request_id: string;
};
};
@@ -0,0 +1,22 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { Status } from './Status';
export type ApiResponse_PrCheckRun = {
data: {
commit_sha: string;
completed_at?: string | null;
conclusion?: (null | Status);
created_at: string;
details_url?: string | null;
external_id?: string | null;
id: string;
name: string;
pull_request_id: string;
started_at?: string | null;
status: Status;
updated_at: string;
};
};
+17
View File
@@ -0,0 +1,17 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_PrCommit = {
data: {
authored_at?: string | null;
commit_sha: string;
committed_at?: string | null;
created_at: string;
id: string;
position: number;
pull_request_id: string;
repo_id: string;
};
};
+19
View File
@@ -0,0 +1,19 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { EventType } from './EventType';
import type { Value } from './Value';
export type ApiResponse_PrEvent = {
data: {
actor_id?: string | null;
created_at: string;
event_type: EventType;
id: string;
metadata?: (null | Value);
new_value?: (null | Value);
old_value?: (null | Value);
pull_request_id: string;
};
};
+21
View File
@@ -0,0 +1,21 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { Status } from './Status';
export type ApiResponse_PrFile = {
data: {
additions: number;
changes: number;
created_at: string;
deletions: number;
id: string;
old_path?: string | null;
patch?: string | null;
path: string;
pull_request_id: string;
status: Status;
updated_at: string;
};
};
+17
View File
@@ -0,0 +1,17 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_PrLabel = {
data: {
color: string;
created_at: string;
created_by?: string | null;
description?: string | null;
id: string;
name: string;
repo_id: string;
updated_at: string;
};
};
@@ -0,0 +1,14 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_PrLabelRelation = {
data: {
created_at: string;
created_by?: string | null;
id: string;
label_id: string;
pull_request_id: string;
};
};
@@ -0,0 +1,20 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { MergeStrategyKind } from './MergeStrategyKind';
export type ApiResponse_PrMergeStrategy = {
data: {
auto_merge: boolean;
created_at: string;
delete_source_branch: boolean;
merge_when_checks_pass: boolean;
pull_request_id: string;
selected_by?: string | null;
squash_message?: string | null;
squash_title?: string | null;
strategy: MergeStrategyKind;
updated_at: string;
};
};
@@ -0,0 +1,17 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { TargetType } from './TargetType';
export type ApiResponse_PrReaction = {
data: {
content: string;
created_at: string;
id: string;
pull_request_id: string;
target_id?: string | null;
target_type: TargetType;
user_id: string;
};
};
+21
View File
@@ -0,0 +1,21 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_PrReview = {
data: {
author_id: string;
body?: string | null;
commit_sha?: string | null;
created_at: string;
dismiss_reason?: string | null;
dismissed_at?: string | null;
dismissed_by?: string | null;
id: string;
pull_request_id: string;
state: string;
submitted_at?: string | null;
updated_at: string;
};
};
@@ -0,0 +1,24 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_PrReviewComment = {
data: {
author_id: string;
body: string;
created_at: string;
diff_hunk?: string | null;
edited_at?: string | null;
id: string;
in_reply_to_id?: string | null;
line?: number | null;
original_line?: number | null;
original_start_line?: number | null;
path: string;
pull_request_id: string;
review_id: string;
start_line?: number | null;
updated_at: string;
};
};
+21
View File
@@ -0,0 +1,21 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { State } from './State';
export type ApiResponse_PrStatus = {
data: {
additions_count: number;
approvals_count: number;
changed_files_count: number;
checks_state: State;
conflicts: boolean;
deletions_count: number;
head_commit_sha: string;
mergeable_state: State;
pull_request_id: string;
requested_reviews_count: number;
updated_at: string;
};
};
@@ -0,0 +1,16 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_PrSubscription = {
data: {
created_at: string;
id: string;
muted: boolean;
pull_request_id: string;
reason: string;
updated_at: string;
user_id: string;
};
};
@@ -0,0 +1,33 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { State } from './State';
export type ApiResponse_PullRequest = {
data: {
author_id: string;
base_commit_sha?: string | null;
body?: string | null;
closed_at?: string | null;
closed_by?: string | null;
created_at: string;
deleted_at?: string | null;
draft: boolean;
head_commit_sha: string;
id: string;
locked: boolean;
merge_commit_sha?: string | null;
merged_at?: string | null;
merged_by?: string | null;
number: number;
repo_id: string;
source_branch: string;
source_repo_id: string;
state: State;
target_branch: string;
target_repo_id: string;
title: string;
updated_at: string;
};
};
@@ -0,0 +1,13 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_Regenerate2FABackupCodesResponse = {
data: {
/**
* Newly generated one-time backup codes. Old backup codes become invalid.
*/
backup_codes: Array<string>;
};
};
@@ -0,0 +1,10 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RegisterEmailCodeResponse = {
data: {
expires_in_secs: number;
};
};
@@ -0,0 +1,25 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RegisterResponse = {
data: {
/**
* Avatar URL; usually absent right after registration.
*/
avatar_url?: string | null;
/**
* Display name initialized from username.
*/
display_name?: string | null;
/**
* Newly created user id.
*/
id: string;
/**
* Unique username used for login and profile URL.
*/
username: string;
};
};
+30
View File
@@ -0,0 +1,30 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { GitService } from './GitService';
import type { Status } from './Status';
import type { Visibility } from './Visibility';
export type ApiResponse_Repo = {
data: {
archived_at?: string | null;
created_at: string;
default_branch: string;
deleted_at?: string | null;
description?: string | null;
forked_from_repo_id?: string | null;
git_service: GitService;
id: string;
is_fork: boolean;
name: string;
owner_id: string;
primary_storage_node_id: string;
status: Status;
storage_node_ids: Array<string>;
storage_path: string;
updated_at: string;
visibility: Visibility;
workspace_id: string;
};
};
@@ -0,0 +1,20 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RepoBranch = {
data: {
commit_sha: string;
created_at: string;
created_by?: string | null;
default_branch: boolean;
id: string;
last_push_at?: string | null;
last_push_id?: string | null;
name: string;
protected: boolean;
repo_id: string;
updated_at: string;
};
};
@@ -0,0 +1,23 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RepoCommitComment = {
data: {
author_id: string;
body: string;
commit_sha: string;
created_at: string;
deleted_at?: string | null;
id: string;
line?: number | null;
path?: string | null;
push_commit_id: string;
repo_id: string;
resolved: boolean;
resolved_at?: string | null;
resolved_by?: string | null;
updated_at: string;
};
};
@@ -0,0 +1,22 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { State } from './State';
export type ApiResponse_RepoCommitStatus = {
data: {
context: string;
created_at: string;
description?: string | null;
id: string;
latest_commit_sha: string;
push_commit_id: string;
repo_id: string;
reported_at: string;
reported_by?: string | null;
state: State;
target_url?: string | null;
updated_at: string;
};
};
@@ -0,0 +1,23 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { KeyType } from './KeyType';
export type ApiResponse_RepoDeployKey = {
data: {
created_at: string;
created_by: string;
expires_at?: string | null;
fingerprint_sha256: string;
id: string;
key_type: KeyType;
last_used_at?: string | null;
public_key: string;
read_only: boolean;
repo_id: string;
revoked_at?: string | null;
title: string;
updated_at: string;
};
};
+14
View File
@@ -0,0 +1,14 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RepoFork = {
data: {
created_at: string;
fork_repo_id: string;
forked_by: string;
id: string;
parent_repo_id: string;
};
};
@@ -0,0 +1,21 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { Role } from './Role';
export type ApiResponse_RepoInvitation = {
data: {
accepted_at?: string | null;
accepted_by?: string | null;
created_at: string;
email: string;
expires_at: string;
id: string;
invited_by: string;
repo_id: string;
revoked_at?: string | null;
role: Role;
token_hash: string;
};
};
@@ -0,0 +1,21 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { Role } from './Role';
import type { Status } from './Status';
export type ApiResponse_RepoMember = {
data: {
created_at: string;
id: string;
invited_by?: string | null;
joined_at?: string | null;
last_active_at?: string | null;
repo_id: string;
role: Role;
status: Status;
updated_at: string;
user_id: string;
};
};
@@ -0,0 +1,22 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RepoRelease = {
data: {
author_id: string;
body?: string | null;
created_at: string;
deleted_at?: string | null;
draft: boolean;
id: string;
prerelease: boolean;
published_at?: string | null;
repo_id: string;
tag_id?: string | null;
tag_name: string;
title: string;
updated_at: string;
};
};
+13
View File
@@ -0,0 +1,13 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RepoStar = {
data: {
created_at: string;
id: string;
repo_id: string;
user_id: string;
};
};
@@ -0,0 +1,22 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RepoStats = {
data: {
branches_count: number;
commits_count: number;
forks_count: number;
last_push_at?: string | null;
open_issues_count: number;
open_pull_requests_count: number;
releases_count: number;
repo_id: string;
size_bytes: number;
stars_count: number;
tags_count: number;
updated_at: string;
watchers_count: number;
};
};
+17
View File
@@ -0,0 +1,17 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RepoTag = {
data: {
created_at: string;
id: string;
message?: string | null;
name: string;
repo_id: string;
signed: boolean;
tagger_id?: string | null;
target_commit_sha: string;
};
};
@@ -0,0 +1,16 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { SubscriptionLevel } from './SubscriptionLevel';
export type ApiResponse_RepoWatch = {
data: {
created_at: string;
id: string;
level: SubscriptionLevel;
repo_id: string;
updated_at: string;
user_id: string;
};
};
@@ -0,0 +1,21 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { EventType } from './EventType';
export type ApiResponse_RepoWebhook = {
data: {
active: boolean;
created_at: string;
created_by: string;
events: Array<EventType>;
id: string;
last_delivery_at?: string | null;
last_delivery_status?: string | null;
repo_id: string;
secret_ciphertext?: string | null;
updated_at: string;
url: string;
};
};
@@ -0,0 +1,10 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_RsaResponse = {
data: {
public_key: string;
};
};
+8
View File
@@ -0,0 +1,8 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ApiResponse_String = {
data: string;
};
+26
View File
@@ -0,0 +1,26 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { Role } from './Role';
import type { Status } from './Status';
import type { Visibility } from './Visibility';
export type ApiResponse_User = {
data: {
avatar_url?: string | null;
bio?: string | null;
created_at: string;
deleted_at?: string | null;
display_name?: string | null;
id: string;
is_active: boolean;
is_bot: boolean;
last_login_at?: string | null;
role: Role;
status: Status;
updated_at: string;
username: string;
visibility: Visibility;
};
};
@@ -0,0 +1,23 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { ColorScheme } from './ColorScheme';
import type { Density } from './Density';
import type { FontSize } from './FontSize';
import type { Theme } from './Theme';
export type ApiResponse_UserAppearance = {
data: {
color_scheme: ColorScheme;
created_at: string;
density: Density;
editor_theme?: string | null;
font_size: FontSize;
markdown_preview: boolean;
reduced_motion: boolean;
theme: Theme;
updated_at: string;
user_id: string;
};
};

Some files were not shown because too many files have changed in this diff Show More