From 5215f35fce245040c64ef9fca4455e528633f4ac Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Tue, 24 Feb 2026 22:52:42 -0800 Subject: [PATCH 1/7] init: biome --- .github/workflows/test.yml | 20 + .prettierignore | 6 - .prettierrc | 7 - .vscode/settings.json | 23 +- README.md | 8 +- biome.json | 29 + bun.lock | 625 +- eslint.config.mjs | 20 - package.json | 17 +- src/__test__/integration/auth.test.ts | 1 - .../integration/inspect-sandbox.test.ts | 1 - src/__test__/unit/formatting.test.ts | 2 +- src/app/(auth)/confirm/page.tsx | 4 +- src/app/(auth)/forgot-password/page.tsx | 2 +- src/app/(auth)/sign-up/page.tsx | 2 +- .../inspect/sandbox/[sandboxId]/route.ts | 41 +- src/configs/flags.ts | 3 +- src/configs/sidebar.ts | 1 - src/features/auth/oauth-provider-buttons.tsx | 8 +- .../dashboard/account/name-settings.tsx | 5 +- .../dashboard/billing/select-plan.tsx | 6 +- src/features/dashboard/build/header-cells.tsx | 10 +- src/features/dashboard/build/logs.tsx | 2 +- .../dashboard/build/use-build-logs.ts | 2 +- .../dashboard/build/use-log-filters.ts | 2 +- src/features/dashboard/common/empty-frame.tsx | 9 +- src/features/dashboard/context.tsx | 2 +- src/features/dashboard/layouts/header.tsx | 6 +- src/features/dashboard/layouts/layout.tsx | 5 +- src/features/dashboard/sandbox/context.tsx | 2 +- .../dashboard/sandbox/inspect/context.tsx | 4 +- .../sandbox/inspect/parent-dir-item.tsx | 2 +- .../sandbox/inspect/sandbox-manager.ts | 4 +- .../sandbox/inspect/stopped-banner.tsx | 2 +- .../dashboard/sandbox/inspect/viewer.tsx | 1 - .../dashboard/sandboxes/list/header.tsx | 14 +- .../list/hooks/use-sandboxes-metrics.tsx | 22 +- .../sandboxes/list/stores/table-store.ts | 9 +- .../dashboard/sandboxes/list/table-body.tsx | 4 +- .../dashboard/sandboxes/list/table-cells.tsx | 8 +- .../dashboard/sandboxes/list/table-row.tsx | 2 +- .../dashboard/sandboxes/list/table.tsx | 13 +- .../sandboxes/monitoring/charts-context.tsx | 2 +- .../charts/team-metrics-chart/index.tsx | 78 +- .../sandboxes/monitoring/header.client.tsx | 2 +- .../monitoring/time-picker/time-panel.tsx | 2 +- .../webhooks/add-edit-dialog-steps.tsx | 6 +- src/features/dashboard/sidebar/footer.tsx | 5 +- .../dashboard/templates/list/header.tsx | 8 +- .../dashboard/templates/list/table-body.tsx | 2 +- .../dashboard/templates/list/table-config.tsx | 2 +- .../dashboard/templates/list/table.tsx | 8 +- .../usage/compute-usage-chart/index.tsx | 54 +- .../dashboard/usage/usage-charts-context.tsx | 2 +- .../usage/usage-time-range-controls.tsx | 2 +- src/lib/clients/action.ts | 2 +- src/lib/hooks/use-virtual-rows.ts | 2 +- src/lib/utils/formatting.ts | 21 +- src/lib/utils/index.ts | 1 - src/lib/utils/rewrites.ts | 2 +- src/lib/utils/ui.ts | 10 +- src/proxy.ts | 2 +- src/server/api/init.ts | 2 +- src/server/api/middlewares/auth.ts | 2 +- src/server/api/middlewares/telemetry.ts | 2 +- src/server/api/procedures.ts | 2 +- .../api/repositories/builds.repository.ts | 4 +- src/server/api/routers/sandboxes.ts | 2 +- src/server/sandboxes/get-team-metrics-core.ts | 2 +- src/styles/animations.css | 10 +- src/styles/docs.css | 2 +- src/styles/globals.css | 2 +- src/styles/theme.css | 130 +- src/trpc/query-client.ts | 2 +- src/trpc/server.tsx | 8 +- src/types/argus-api.types.ts | 936 +-- src/types/infra-api.types.ts | 5553 +++++++++-------- src/ui/chart-placeholder.tsx | 2 +- src/ui/dashboard-tabs.tsx | 2 +- src/ui/data-table.tsx | 19 +- src/ui/docs-tabs.tsx | 8 +- src/ui/primitives/alert.tsx | 2 +- src/ui/primitives/badge.tsx | 2 +- src/ui/primitives/button.tsx | 2 +- src/ui/primitives/card.tsx | 8 +- src/ui/primitives/command.tsx | 2 +- src/ui/primitives/sheet.tsx | 2 +- src/ui/primitives/toast.tsx | 2 +- src/ui/survey.tsx | 8 +- src/ui/time-input.tsx | 152 +- 90 files changed, 3796 insertions(+), 4243 deletions(-) delete mode 100644 .prettierignore delete mode 100644 .prettierrc create mode 100644 biome.json delete mode 100644 eslint.config.mjs diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d822b0001..1a2674020 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,9 +7,29 @@ on: branches: [main] jobs: + quality: + name: Code Quality + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: 1.2.20 + + - name: Install dependencies + run: bun install + + - name: Run Biome checks + run: bun run check + unit-tests: name: Unit Tests runs-on: ubuntu-latest + needs: quality # unit tests don't need environment variables - they test pure functions diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 48c2d9ace..000000000 --- a/.prettierignore +++ /dev/null @@ -1,6 +0,0 @@ -**/*.mdx -**/*.md - -/.next/ - -package.json \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index f2d9b3020..000000000 --- a/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "tabWidth": 2, - "singleQuote": true, - "semi": false, - "trailingComma": "es5", - "plugins": ["prettier-plugin-tailwindcss", "prettier-plugin-organize-imports"] -} diff --git a/.vscode/settings.json b/.vscode/settings.json index 25fa6215f..de9fcb185 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,24 @@ { - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "editor.formatOnSave": true, + "editor.defaultFormatter": "biomejs.biome", + "editor.codeActionsOnSave": { + "source.fixAll.biome": "explicit", + "source.organizeImports.biome": "explicit" + }, + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[json]": { + "editor.defaultFormatter": "biomejs.biome" + } } diff --git a/README.md b/README.md index 03909eca2..85690080d 100644 --- a/README.md +++ b/README.md @@ -134,8 +134,10 @@ bun run dev # Start development server bun run build # Create production build bun run start # Start production server bun run preview # Build and preview production -bun run lint # Run ESLint -bun run lint:fix # Auto-fix ESLint issues +bun run lint # Run Biome linter +bun run lint:fix # Auto-fix Biome lint issues +bun run format # Format with Biome +bun run check # Run full Biome check (lint + format + imports) SUPABASE_PROJECT_ID=your-project-id bun run db:types # Generate DB types bun run db:migration # Create migration @@ -186,4 +188,4 @@ If you need help or have questions: ## License This project is licensed under the Apache License, Version 2.0 - see the [LICENSE](LICENSE) file for details. -Copyright 2025 FoundryLabs, Inc. \ No newline at end of file +Copyright 2025 FoundryLabs, Inc. diff --git a/biome.json b/biome.json new file mode 100644 index 000000000..c89959a61 --- /dev/null +++ b/biome.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": false + } + }, + "organizeImports": { + "enabled": true + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "semicolons": "asNeeded", + "trailingCommas": "es5" + } + } +} diff --git a/bun.lock b/bun.lock index d40af47da..a8eb7ac18 100644 --- a/bun.lock +++ b/bun.lock @@ -118,11 +118,11 @@ "zustand-computed": "^2.0.2", }, "devDependencies": { + "@biomejs/biome": "^1.9.4", "@bufbuild/buf": "^1.54.0", "@bufbuild/protobuf": "^2.5.2", "@bufbuild/protoc-gen-es": "^2.5.2", "@connectrpc/protoc-gen-connect-es": "^1.6.1", - "@next/eslint-plugin-next": "^15.1.6", "@tailwindcss/postcss": "^4.0.15", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", @@ -137,18 +137,11 @@ "autoprefixer": "^10.4.20", "babel-plugin-react-compiler": "^19.1.0-rc.2", "drizzle-kit": "^0.30.3", - "eslint": "^9.19.0", - "eslint-config-next": "^15.1.6", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-prettier": "^5.2.3", "node-loader": "^2.1.0", "openapi-typescript": "^7.8.0", "pino-pretty": "^13.1.1", "postcss": "8.5.1", "postcss-import": "^16.1.0", - "prettier": "^3.4.2", - "prettier-plugin-organize-imports": "^4.1.0", - "prettier-plugin-tailwindcss": "^0.6.11", "react-scan": "^0.4.3", "server-cli-only": "^0.3.2", "tailwindcss": "^4.0.15", @@ -214,6 +207,24 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], + "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], + "@borewit/text-codec": ["@borewit/text-codec@0.2.1", "", {}, "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw=="], "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.1", "", {}, "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw=="], @@ -264,12 +275,8 @@ "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], - "@emnapi/core": ["@emnapi/core@1.7.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw=="], - "@emnapi/runtime": ["@emnapi/runtime@1.7.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], - "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.2.2", "", { "dependencies": { "@emotion/memoize": "^0.8.1" } }, "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw=="], "@emotion/memoize": ["@emotion/memoize@0.8.1", "", {}, "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="], @@ -332,24 +339,6 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - - "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], - - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - - "@eslint/js": ["@eslint/js@9.39.1", "", {}, "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], - "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], @@ -374,14 +363,6 @@ "@hookform/resolvers": ["@hookform/resolvers@5.2.2", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA=="], - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], - - "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], - - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], "@iconify/utils": ["@iconify/utils@3.0.2", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@antfu/utils": "^9.2.0", "@iconify/types": "^2.0.0", "debug": "^4.4.1", "globals": "^15.15.0", "kolorist": "^1.8.0", "local-pkg": "^1.1.1", "mlly": "^1.7.4" } }, "sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ=="], @@ -466,14 +447,10 @@ "@mermaid-js/parser": ["@mermaid-js/parser@0.6.3", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], - "@next-safe-action/adapter-react-hook-form": ["@next-safe-action/adapter-react-hook-form@2.0.0", "", { "peerDependencies": { "@hookform/resolvers": ">= 5.0.0", "next": ">= 14.0.0", "next-safe-action": ">= 8.0.0", "react": ">= 18.2.0", "react-dom": ">= 18.2.0", "react-hook-form": ">= 7.0.0" } }, "sha512-vp3KAd5NKnBBCF/3b8kDxEYj0+BUYVjlSZOWHikz/Y2O+yLheRmtj8Vcm379itlqGUKcLV5O2o/dwKHvH8pYog=="], "@next/env": ["@next/env@16.1.5", "", {}, "sha512-CRSCPJiSZoi4Pn69RYBDI9R7YK2g59vLexPQFXY0eyw+ILevIenCywzg+DqmlBik9zszEnw2HLFOUlLAcJbL7g=="], - "@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.5.6", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-YxDvsT2fwy1j5gMqk3ppXlsgDopHnkM4BoxSVASbvvgh5zgsK8lvWerDzPip8k3WVzsTZ1O7A7si1KNfN4OZfQ=="], - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.1.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eK7Wdm3Hjy/SCL7TevlH0C9chrpeOYWx2iR7guJDaz4zEQKWcS1IMVfMb9UKBFMg1XgzcPTYPIp1Vcpukkjg6Q=="], "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.1.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-foQscSHD1dCuxBmGkbIr6ScAUF6pRoDZP6czajyvmXPAOFNnQUJu2Os1SGELODjKp/ULa4fulnBWoHV3XdPLfA=="], @@ -490,14 +467,6 @@ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.1.5", "", { "os": "win32", "cpu": "x64" }, "sha512-7is37HJTNQGhjPpQbkKjKEboHYQnCgpVt/4rBrrln0D9nderNxZ8ZWs8w1fAtzUx7wEyYjQ+/13myFgFj6K2Ng=="], - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - - "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], - "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.203.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ=="], @@ -658,8 +627,6 @@ "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], - "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], "@posthog/core": ["@posthog/core@1.5.1", "", { "dependencies": { "cross-spawn": "^7.0.6" } }, "sha512-8fdEzfvdStr45iIncTD+gnqp45UBTUpRK/bwB4shP5usCKytnPIeilU8rIpNBOVjJPwfW+2N8yWhQ0l14x191Q=="], @@ -864,10 +831,6 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg=="], - "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], - - "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.14.1", "", {}, "sha512-jGTk8UD/RdjsNZW8qq10r0RBvxL8OWtoT+kImlzPDFilmozzM+9QmIJsmze9UiSBrFU45ZxhTYBypn9q9z/VfQ=="], - "@rvf/set-get": ["@rvf/set-get@7.0.1", "", {}, "sha512-GkTSn9K1GrTYoTUqlUs36k6nJnzjQaFBTTEIqUYmzBcsGsoJM8xG7EAx2WLHWAA4QzFjcwWUSHQ3vM3Fbw50Tg=="], "@shikijs/core": ["@shikijs/core@2.3.2", "", { "dependencies": { "@shikijs/engine-javascript": "2.3.2", "@shikijs/engine-oniguruma": "2.3.2", "@shikijs/types": "2.3.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A=="], @@ -988,8 +951,6 @@ "@trpc/tanstack-react-query": ["@trpc/tanstack-react-query@11.7.1", "", { "peerDependencies": { "@tanstack/react-query": "^5.80.3", "@trpc/client": "11.7.1", "@trpc/server": "11.7.1", "react": ">=18.2.0", "react-dom": ">=18.2.0", "typescript": ">=5.7.2" } }, "sha512-qc7kz4NY7CCvCxLy5HGptfKd3e3yJnWmTd6/Gkr4IY8B73PNFmcHKvLWE4kzU7r+R72MfT57TXrCEJ7ErLSMtw=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], - "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], "@types/aws-lambda": ["@types/aws-lambda@8.10.152", "", {}, "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw=="], @@ -1094,8 +1055,6 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], - "@types/katex": ["@types/katex@0.16.7", "", {}, "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="], "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], @@ -1150,68 +1109,10 @@ "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.46.3", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/type-utils": "8.46.3", "@typescript-eslint/utils": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.46.3", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw=="], - - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.46.3", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg=="], - - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.46.3", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.46.3", "@typescript-eslint/types": "^8.46.3", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ=="], - - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3" } }, "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg=="], - - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.46.3", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA=="], - - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3", "@typescript-eslint/utils": "8.46.3", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw=="], - - "@typescript-eslint/types": ["@typescript-eslint/types@8.46.3", "", {}, "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA=="], - - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.3", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.3", "@typescript-eslint/tsconfig-utils": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA=="], - - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g=="], - - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "eslint-visitor-keys": "^4.2.1" } }, "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg=="], - "@typescript/vfs": ["@typescript/vfs@1.6.2", "", { "dependencies": { "debug": "^4.1.1" }, "peerDependencies": { "typescript": "*" } }, "sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], - - "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="], - - "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="], - - "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="], - - "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="], - - "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="], - - "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="], - - "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="], - - "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="], - - "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="], - - "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="], - - "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="], - - "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="], - - "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="], - - "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="], - - "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="], - - "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="], - - "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="], - - "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], - "@upstash/redis": ["@upstash/redis@1.35.6", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-aSEIGJgJ7XUfTYvhQcQbq835re7e/BXjs8Janq6Pvr6LlmTZnyqwT97RziZLO/8AVUL037RLXqqiQC6kCt+5pA=="], "@vercel/analytics": ["@vercel/analytics@1.5.0", "", { "peerDependencies": { "@remix-run/react": "^2", "@sveltejs/kit": "^1 || ^2", "next": ">= 13", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", "vue-router": "^4" }, "optionalPeers": ["@remix-run/react", "@sveltejs/kit", "next", "react", "svelte", "vue", "vue-router"] }, "sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g=="], @@ -1282,11 +1183,9 @@ "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], @@ -1296,7 +1195,7 @@ "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], "ansis": ["ansis@3.17.0", "", {}, "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg=="], @@ -1306,32 +1205,12 @@ "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], - - "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], - - "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], - - "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], - - "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], - - "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], - - "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], - - "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], - "arrify": ["arrify@2.0.1", "", {}, "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="], "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], - "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], - "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.8", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ=="], - "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], - "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="], @@ -1342,12 +1221,6 @@ "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], - "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - - "axe-core": ["axe-core@4.11.0", "", {}, "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ=="], - - "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - "babel-plugin-react-compiler": ["babel-plugin-react-compiler@19.1.0-rc.1-rc-af1b7da-20250421", "", { "dependencies": { "@babel/types": "^7.26.0" } }, "sha512-E3kaokBhWDLf7ZD8fuYjYn0ZJHYZ+3EHtAWCdX2hl4lpu1z9S/Xr99sxhx2bTCVB41oIesz9FtM8f4INsrZaOw=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], @@ -1366,7 +1239,7 @@ "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], @@ -1382,14 +1255,8 @@ "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "camelize": ["camelize@1.0.1", "", {}, "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="], "caniuse-lite": ["caniuse-lite@1.0.30001753", "", {}, "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw=="], @@ -1398,7 +1265,7 @@ "chai": ["chai@5.3.3", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="], - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], @@ -1440,9 +1307,9 @@ "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="], - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], @@ -1560,14 +1427,6 @@ "dagre-d3-es": ["dagre-d3-es@7.0.13", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q=="], - "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], - - "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], - - "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], - - "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], - "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], "date-fns-jalali": ["date-fns-jalali@4.1.0-0", "", {}, "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg=="], @@ -1586,14 +1445,8 @@ "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], - "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], - - "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], - "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], @@ -1610,8 +1463,6 @@ "dockerfile-ast": ["dockerfile-ast@0.7.1", "", { "dependencies": { "vscode-languageserver-textdocument": "^1.0.8", "vscode-languageserver-types": "^3.17.3" } }, "sha512-oX/A4I0EhSkGqrFv0YuvPkBUSYp1XiY8O8zAKc8Djglx8ocz+JfOr8gP0ryRMC2myqvDLagmnZaU9ot1vG2ijw=="], - "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], - "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], "dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="], @@ -1660,24 +1511,16 @@ "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], - "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], - "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "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=="], - "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], - - "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], - "es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="], "es6-promisify": ["es6-promisify@5.0.0", "", { "dependencies": { "es6-promise": "^4.0.3" } }, "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ=="], @@ -1688,46 +1531,16 @@ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - - "eslint": ["eslint@9.39.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.1", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g=="], - - "eslint-config-next": ["eslint-config-next@15.5.6", "", { "dependencies": { "@next/eslint-plugin-next": "15.5.6", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-cGr3VQlPsZBEv8rtYp4BpG1KNXDqGvPo9VC1iaCgIA11OfziC/vczng+TnAS3WpRIR3Q5ye/6yl+CRUuZ1fPGg=="], - - "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], - - "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], - - "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], - - "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], - - "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="], - - "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.4", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg=="], - - "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], - - "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], - - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], - - "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], - - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], @@ -1748,44 +1561,26 @@ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], - "fast-equals": ["fast-equals@5.3.2", "", {}, "sha512-6rxyATwPCkaFIL3JLqw8qXqMpIZ942pTX/tbQFkRsDGblS8tNGtlUauA/+mt6RUfqn/4MoEr+WDkYoIQbibWuQ=="], - "fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], - - "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], - - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], "fast-xml-parser": ["fast-xml-parser@5.3.5", "", { "dependencies": { "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-JeaA2Vm9ffQKp9VjvfzObuMCjUYAp5WDYhRYL5LrBPY/jUDlUtOvDfot0vKSkB9tuX885BDHjtw4fZadD95wnA=="], - "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], - "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], - "file-type": ["file-type@21.3.0", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], "form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], @@ -1804,10 +1599,6 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], - - "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], - "gaxios": ["gaxios@6.7.1", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9", "uuid": "^9.0.1" } }, "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ=="], "gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="], @@ -1816,8 +1607,6 @@ "gel": ["gel@2.1.1", "", { "dependencies": { "@petamoriken/float16": "^3.8.7", "debug": "^4.3.4", "env-paths": "^3.0.0", "semver": "^7.6.2", "shell-quote": "^1.8.1", "which": "^4.0.0" }, "bin": { "gel": "dist/cli.mjs" } }, "sha512-Newg9X7mRYskoBjSw70l1YnJ/ZGbq64VPyR821H5WVkTGpHG2O0mQILxCeUhxdYERLFY9B4tUyKLyf3uMTjtKw=="], - "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], @@ -1828,19 +1617,13 @@ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], "glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="], - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], "google-auth-library": ["google-auth-library@9.15.1", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^6.1.1", "gcp-metadata": "^6.1.0", "gtoken": "^7.0.0", "jws": "^4.0.0" } }, "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng=="], @@ -1850,22 +1633,14 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - "graphql": ["graphql@16.12.0", "", {}, "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ=="], "gtoken": ["gtoken@7.1.0", "", { "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" } }, "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw=="], "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], - "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], - - "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], @@ -1916,16 +1691,10 @@ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "import-in-the-middle": ["import-in-the-middle@1.15.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], "index-to-position": ["index-to-position@1.2.0", "", {}, "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw=="], @@ -1936,71 +1705,21 @@ "inline-style-parser": ["inline-style-parser@0.2.6", "", {}, "sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg=="], - "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], - "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], - "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], - - "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], - - "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], - - "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], - - "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], - - "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], - - "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], - - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - - "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], - - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - - "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], - - "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], - "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], - "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], - - "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], - - "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], - "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], - - "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], - - "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], - - "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], - - "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], - - "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], - "is-what": ["is-what@5.5.0", "", {}, "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw=="], - "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], @@ -2012,8 +1731,6 @@ "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="], - "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], - "jackspeak": ["jackspeak@4.1.1", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" } }, "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ=="], "jest-diff": ["jest-diff@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw=="], @@ -2042,28 +1759,20 @@ "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], - "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], - "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], "jws": ["jws@4.0.0", "", { "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg=="], "katex": ["katex@0.16.25", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q=="], - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], @@ -2072,14 +1781,8 @@ "langium": ["langium@3.3.1", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w=="], - "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], - - "language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="], - "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - "lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="], "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="], @@ -2110,8 +1813,6 @@ "local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], @@ -2122,8 +1823,6 @@ "lodash.get": ["lodash.get@4.4.2", "", {}, "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -2162,8 +1861,6 @@ "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - "mermaid": ["mermaid@11.12.1", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.1", "@mermaid-js/parser": "^0.6.3", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.13", "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g=="], "mermaid.cli": ["mermaid.cli@0.3.6", "", { "dependencies": { "chalk": "^2.3.0", "commander": "^2.13.0", "puppeteer": "^1.0.0" }, "bin": { "mmdc": "./index.bundle.js" } }, "sha512-zjaKY+cxmHPJpNU85BU5/UBgIVveucFyjIODfNSox7BUkyAbxt2tZqFPi5AlkKuEI3p2uO1AmQvS6wPfNhAq7w=="], @@ -2222,7 +1919,7 @@ "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -2250,10 +1947,6 @@ "nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="], - "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], - - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], "next": ["next@16.1.5", "", { "dependencies": { "@next/env": "16.1.5", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.5", "@next/swc-darwin-x64": "16.1.5", "@next/swc-linux-arm64-gnu": "16.1.5", "@next/swc-linux-arm64-musl": "16.1.5", "@next/swc-linux-x64-gnu": "16.1.5", "@next/swc-linux-x64-musl": "16.1.5", "@next/swc-win32-arm64-msvc": "16.1.5", "@next/swc-win32-x64-msvc": "16.1.5", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-f+wE+NSbiQgh3DSAlTaw2FwY5yGdVViAtp8TotNQj4kk4Q8Bh1sC/aL9aH+Rg1YAVn18OYXsRDT7U/079jgP7w=="], @@ -2280,20 +1973,6 @@ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - - "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], - - "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], - - "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], - - "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], - - "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], - - "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], @@ -2306,20 +1985,12 @@ "openapi-typescript-helpers": ["openapi-typescript-helpers@0.0.15", "", {}, "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw=="], - "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - - "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "package-manager-detector": ["package-manager-detector@1.5.0", "", {}, "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], @@ -2330,8 +2001,6 @@ "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], - "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], - "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -2380,8 +2049,6 @@ "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], - "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], "postcss-import": ["postcss-import@16.1.1", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ=="], @@ -2402,16 +2069,6 @@ "preact": ["preact@10.27.2", "", {}, "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg=="], - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - - "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], - - "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], - - "prettier-plugin-organize-imports": ["prettier-plugin-organize-imports@4.3.0", "", { "peerDependencies": { "prettier": ">=2.0", "typescript": ">=2.9", "vue-tsc": "^2.1.0 || 3" }, "optionalPeers": ["vue-tsc"] }, "sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw=="], - - "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.14", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg=="], - "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], @@ -2436,8 +2093,6 @@ "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], "radix-ui": ["radix-ui@1.4.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-accessible-icon": "1.1.7", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-aspect-ratio": "1.1.7", "@radix-ui/react-avatar": "1.1.10", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.16", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-form": "0.1.8", "@radix-ui/react-hover-card": "1.1.15", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-menubar": "1.1.16", "@radix-ui/react-navigation-menu": "1.2.14", "@radix-ui/react-one-time-password-field": "0.1.8", "@radix-ui/react-password-toggle-field": "0.1.3", "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-progress": "1.1.7", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-scroll-area": "1.2.10", "@radix-ui/react-select": "2.2.6", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2.15", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-toggle-group": "1.1.11", "@radix-ui/react-toolbar": "1.1.11", "@radix-ui/react-tooltip": "1.2.8", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA=="], @@ -2488,16 +2143,12 @@ "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], - "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], - "regex": ["regex@6.0.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="], "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], - "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - "rehype-katex": ["rehype-katex@7.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/katex": "^0.16.0", "hast-util-from-html-isomorphic": "^2.0.0", "hast-util-to-text": "^4.0.0", "katex": "^0.16.0", "unist-util-visit-parents": "^6.0.0", "vfile": "^6.0.0" } }, "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA=="], "remark-math": ["remark-math@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-math": "^3.0.0", "micromark-extension-math": "^3.0.0", "unified": "^11.0.0" } }, "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA=="], @@ -2514,16 +2165,12 @@ "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], "retry-request": ["retry-request@7.0.2", "", { "dependencies": { "@types/request": "^2.48.8", "extend": "^3.0.2", "teeny-request": "^9.0.0" } }, "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w=="], - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], @@ -2532,18 +2179,10 @@ "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], - "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], - - "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], - "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], @@ -2562,12 +2201,6 @@ "server-cli-only": ["server-cli-only@0.3.2", "", {}, "sha512-t8cH7ZPomACZ+T+yb5s9TjVjjMe62DLgT5VXkN71Ix7nuPQfR6HQMM/XG1k4MesiHiRKw5mpwwZC7A+bzuZRfw=="], - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], - - "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], - - "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], - "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], "sharp": ["sharp@0.34.4", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.0", "semver": "^7.7.2" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.4", "@img/sharp-darwin-x64": "0.34.4", "@img/sharp-libvips-darwin-arm64": "1.2.3", "@img/sharp-libvips-darwin-x64": "1.2.3", "@img/sharp-libvips-linux-arm": "1.2.3", "@img/sharp-libvips-linux-arm64": "1.2.3", "@img/sharp-libvips-linux-ppc64": "1.2.3", "@img/sharp-libvips-linux-s390x": "1.2.3", "@img/sharp-libvips-linux-x64": "1.2.3", "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", "@img/sharp-libvips-linuxmusl-x64": "1.2.3", "@img/sharp-linux-arm": "0.34.4", "@img/sharp-linux-arm64": "0.34.4", "@img/sharp-linux-ppc64": "0.34.4", "@img/sharp-linux-s390x": "0.34.4", "@img/sharp-linux-x64": "0.34.4", "@img/sharp-linuxmusl-arm64": "0.34.4", "@img/sharp-linuxmusl-x64": "0.34.4", "@img/sharp-wasm32": "0.34.4", "@img/sharp-win32-arm64": "0.34.4", "@img/sharp-win32-ia32": "0.34.4", "@img/sharp-win32-x64": "0.34.4" } }, "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA=="], @@ -2580,14 +2213,6 @@ "shiki": ["shiki@2.3.2", "", { "dependencies": { "@shikijs/core": "2.3.2", "@shikijs/engine-javascript": "2.3.2", "@shikijs/engine-oniguruma": "2.3.2", "@shikijs/langs": "2.3.2", "@shikijs/themes": "2.3.2", "@shikijs/types": "2.3.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw=="], - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], - - "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], - - "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], - - "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], @@ -2614,16 +2239,12 @@ "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], - "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], - "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], - "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], - "stream-events": ["stream-events@1.0.5", "", { "dependencies": { "stubs": "^3.0.0" } }, "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg=="], "stream-shift": ["stream-shift@1.0.3", "", {}, "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="], @@ -2632,18 +2253,6 @@ "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="], - - "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], - - "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], - - "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], - - "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], - - "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], @@ -2652,8 +2261,6 @@ "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], - "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], @@ -2684,8 +2291,6 @@ "swr": ["swr@2.3.6", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw=="], - "synckit": ["synckit@0.11.11", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="], - "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], "tailwindcss": ["tailwindcss@4.1.16", "", {}, "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA=="], @@ -2732,12 +2337,8 @@ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], - "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], - "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], - "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "tslib": ["tslib@2.3.0", "", {}, "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="], "tsx": ["tsx@4.20.6", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg=="], @@ -2748,18 +2349,8 @@ "twoslash-protocol": ["twoslash-protocol@0.3.4", "", {}, "sha512-HHd7lzZNLUvjPzG/IE6js502gEzLC1x7HaO1up/f72d8G8ScWAs9Yfa97igelQRDl5h9tGcdFsRp+lNVre1EeQ=="], - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], - - "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], - - "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], - - "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], - "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], @@ -2768,8 +2359,6 @@ "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], - "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], - "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], "undici": ["undici@7.16.0", "", {}, "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g=="], @@ -2796,12 +2385,8 @@ "unplugin": ["unplugin@2.1.0", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ=="], - "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], - "update-browserslist-db": ["update-browserslist-db@1.1.4", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A=="], - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - "uri-js-replace": ["uri-js-replace@1.0.1", "", {}, "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g=="], "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], @@ -2866,18 +2451,8 @@ "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], - "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], - - "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], - - "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], - - "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], - "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -2928,21 +2503,13 @@ "@connectrpc/protoc-gen-connect-es/@bufbuild/protoplugin": ["@bufbuild/protoplugin@1.10.1", "", { "dependencies": { "@bufbuild/protobuf": "1.10.1", "@typescript/vfs": "^1.4.0", "typescript": "4.5.2" } }, "sha512-LaSbfwabAFIvbVnbn8jWwElRoffCIxhVraO8arliVwWupWezHLXgqPHEYLXZY/SsAR+/YsFBQJa8tAGtNPJyaQ=="], - "@emnapi/core/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@emnapi/runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@emnapi/wasi-threads/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], - "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "@google-cloud/storage/fast-xml-parser": ["fast-xml-parser@4.5.3", "", { "dependencies": { "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig=="], - "@iconify/utils/globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + "@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "@opentelemetry/exporter-logs-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.0.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw=="], @@ -3176,8 +2743,6 @@ "@radix-ui/react-visually-hidden/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - "@redocly/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "@redocly/openapi-core/colorette": ["colorette@1.4.0", "", {}, "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="], "@redocly/openapi-core/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], @@ -3214,24 +2779,14 @@ "@tanem/svg-injector/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@team-plain/typescript-sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "@team-plain/typescript-sdk/zod": ["zod@3.22.4", "", {}, "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg=="], "@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], - "@tybys/wasm-util/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@types/jest/pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - - "@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@vercel/otel/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], "@vitest/expect/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], @@ -3240,14 +2795,8 @@ "@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@3.0.7", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg=="], - "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "ajv-keywords/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "aria-hidden/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -3266,24 +2815,10 @@ "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], - "e2b/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], - - "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], - - "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], "extract-zip/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "framer-motion/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "gaxios/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], @@ -3296,12 +2831,20 @@ "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "jest-diff/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "jest-diff/pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + "jest-matcher-utils/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "jest-matcher-utils/pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + "jest-message-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "jest-message-util/pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + "jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], @@ -3342,8 +2885,6 @@ "posthog-js/fflate": ["fflate@0.4.8", "", {}, "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="], - "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - "pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], @@ -3380,8 +2921,6 @@ "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -3402,10 +2941,6 @@ "test-exclude/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], - "test-exclude/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - "tsx/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], "use-callback-ref/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -3418,10 +2953,10 @@ "vitest/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], - "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -3476,6 +3011,10 @@ "@google-cloud/storage/fast-xml-parser/strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], + "@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/types/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-node/@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.0.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw=="], "@radix-ui/react-accordion/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], @@ -3536,23 +3075,9 @@ "@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - "@redocly/openapi-core/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@team-plain/typescript-sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "@types/jest/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "concat-stream/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "concat-stream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], @@ -3568,15 +3093,23 @@ "extract-zip/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "jest-diff/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + "jest-diff/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "jest-matcher-utils/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + "jest-diff/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "jest-message-util/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + "jest-matcher-utils/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "mermaid.cli/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + "jest-matcher-utils/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-message-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "mermaid.cli/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "jest-message-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "mermaid.cli/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], "mermaid.cli/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], @@ -3642,7 +3175,7 @@ "remark-mermaid/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@2.1.2", "", { "dependencies": { "unist-util-is": "^3.0.0" } }, "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g=="], - "schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "styled-components/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], @@ -3652,8 +3185,6 @@ "test-exclude/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "test-exclude/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], @@ -3748,7 +3279,7 @@ "vite/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + "wrap-ansi-cjs/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -3756,14 +3287,38 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "mermaid.cli/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + "@jest/types/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-diff/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-matcher-utils/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-message-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "jest-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "mermaid.cli/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], "remark-mermaid/unist-util-visit/unist-util-visit-parents/unist-util-is": ["unist-util-is@3.0.0", "", {}, "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A=="], + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "test-exclude/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - "mermaid.cli/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + "wrap-ansi-cjs/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "@jest/types/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "cliui/wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-diff/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-matcher-utils/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-message-util/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "jest-util/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], } } diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 063fdd975..000000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,20 +0,0 @@ -import { FlatCompat } from '@eslint/eslintrc' - -const compat = new FlatCompat({ - baseDirectory: import.meta.dirname, -}) - -const eslintConfig = [ - ...compat.config({ - extends: ['next/core-web-vitals', 'next/typescript'], - plugins: ['eslint-plugin-prettier'], - rules: { - 'react/no-unescaped-entities': 'off', - 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-empty-object-type': 'off', - }, - }), -] - -export default eslintConfig diff --git a/package.json b/package.json index 19e81610e..79e586d1e 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,11 @@ "build": "next build --turbopack", "start": "next start | pino-pretty --colorize", "preview": "next build --turbopack && next start | pino-pretty --colorize", - "lint": "next lint", - "lint:fix": "next lint --fix", - "format": "prettier --write .", + "lint": "biome lint .", + "lint:fix": "biome lint --write .", + "format": "biome format --write .", + "format:check": "biome format .", + "check": "biome check .", "prebuild": "bun scripts:check-app-env", "<<<<<<< Development Tools": "", "scan:local": "bunx react-scan@latest localhost:3000", @@ -155,11 +157,11 @@ "zustand-computed": "^2.0.2" }, "devDependencies": { + "@biomejs/biome": "^1.9.4", "@bufbuild/buf": "^1.54.0", "@bufbuild/protobuf": "^2.5.2", "@bufbuild/protoc-gen-es": "^2.5.2", "@connectrpc/protoc-gen-connect-es": "^1.6.1", - "@next/eslint-plugin-next": "^15.1.6", "@tailwindcss/postcss": "^4.0.15", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", @@ -174,18 +176,11 @@ "autoprefixer": "^10.4.20", "babel-plugin-react-compiler": "^19.1.0-rc.2", "drizzle-kit": "^0.30.3", - "eslint": "^9.19.0", - "eslint-config-next": "^15.1.6", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-prettier": "^5.2.3", "node-loader": "^2.1.0", "openapi-typescript": "^7.8.0", "pino-pretty": "^13.1.1", "postcss": "8.5.1", "postcss-import": "^16.1.0", - "prettier": "^3.4.2", - "prettier-plugin-organize-imports": "^4.1.0", - "prettier-plugin-tailwindcss": "^0.6.11", "react-scan": "^0.4.3", "server-cli-only": "^0.3.2", "tailwindcss": "^4.0.15", diff --git a/src/__test__/integration/auth.test.ts b/src/__test__/integration/auth.test.ts index 5e3c6aaed..c2b4f1517 100644 --- a/src/__test__/integration/auth.test.ts +++ b/src/__test__/integration/auth.test.ts @@ -150,7 +150,6 @@ describe('Auth Actions - Integration Tests', () => { expect(result?.validationErrors?.fieldErrors.returnTo).toBeDefined() }) - it('should throw validation error if returnTo is a malicious URL', async () => { mockSupabaseClient.auth.signInWithPassword.mockResolvedValue({ data: { user: { id: 'user-123' } }, diff --git a/src/__test__/integration/inspect-sandbox.test.ts b/src/__test__/integration/inspect-sandbox.test.ts index 0d052bcd1..5e0394d83 100644 --- a/src/__test__/integration/inspect-sandbox.test.ts +++ b/src/__test__/integration/inspect-sandbox.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' diff --git a/src/__test__/unit/formatting.test.ts b/src/__test__/unit/formatting.test.ts index b950d4516..a6f8cf9fa 100644 --- a/src/__test__/unit/formatting.test.ts +++ b/src/__test__/unit/formatting.test.ts @@ -1,9 +1,9 @@ import { formatAveragingPeriod, + formatCPUCores, formatChartTimestampLocal, formatChartTimestampUTC, formatCompactDate, - formatCPUCores, formatDecimal, formatDuration, formatMemory, diff --git a/src/app/(auth)/confirm/page.tsx b/src/app/(auth)/confirm/page.tsx index 96217353e..781a05939 100644 --- a/src/app/(auth)/confirm/page.tsx +++ b/src/app/(auth)/confirm/page.tsx @@ -3,10 +3,10 @@ import { AUTH_URLS } from '@/configs/urls' import { AuthFormMessage } from '@/features/auth/form-message' import { - ConfirmEmailInputSchema, - OtpTypeSchema, type ConfirmEmailInput, + ConfirmEmailInputSchema, type OtpType, + OtpTypeSchema, } from '@/server/api/models/auth.models' import { Button } from '@/ui/primitives/button' import { useMutation } from '@tanstack/react-query' diff --git a/src/app/(auth)/forgot-password/page.tsx b/src/app/(auth)/forgot-password/page.tsx index 0d66ea40d..30ec9312d 100644 --- a/src/app/(auth)/forgot-password/page.tsx +++ b/src/app/(auth)/forgot-password/page.tsx @@ -2,8 +2,8 @@ import { AUTH_URLS } from '@/configs/urls' import { - getTimeoutMsFromUserMessage, USER_MESSAGES, + getTimeoutMsFromUserMessage, } from '@/configs/user-messages' import { AuthFormMessage, AuthMessage } from '@/features/auth/form-message' import { forgotPasswordAction } from '@/server/auth/auth-actions' diff --git a/src/app/(auth)/sign-up/page.tsx b/src/app/(auth)/sign-up/page.tsx index 626f76ff7..fc28c634c 100644 --- a/src/app/(auth)/sign-up/page.tsx +++ b/src/app/(auth)/sign-up/page.tsx @@ -3,8 +3,8 @@ import { CAPTCHA_REQUIRED_CLIENT } from '@/configs/flags' import { AUTH_URLS } from '@/configs/urls' import { - getTimeoutMsFromUserMessage, USER_MESSAGES, + getTimeoutMsFromUserMessage, } from '@/configs/user-messages' import { AuthFormMessage, AuthMessage } from '@/features/auth/form-message' import { OAuthProviders } from '@/features/auth/oauth-provider-buttons' diff --git a/src/app/dashboard/(resolvers)/inspect/sandbox/[sandboxId]/route.ts b/src/app/dashboard/(resolvers)/inspect/sandbox/[sandboxId]/route.ts index 3a305029c..045b35d9c 100644 --- a/src/app/dashboard/(resolvers)/inspect/sandbox/[sandboxId]/route.ts +++ b/src/app/dashboard/(resolvers)/inspect/sandbox/[sandboxId]/route.ts @@ -120,15 +120,20 @@ export async function GET( const parsedSandboxId = SandboxIdSchema.safeParse(requestedSandboxId) if (!parsedSandboxId.success) { - return redirectToDashboardWithWarning(request, 'inspect_sandbox:invalid_id', { - sandbox_id: requestedSandboxId, - validation_errors: parsedSandboxId.error.flatten(), - }) + return redirectToDashboardWithWarning( + request, + 'inspect_sandbox:invalid_id', + { + sandbox_id: requestedSandboxId, + validation_errors: parsedSandboxId.error.flatten(), + } + ) } const sandboxId = parsedSandboxId.data const supabase = await createClient() - const { data: userResponse, error: userError } = await supabase.auth.getUser() + const { data: userResponse, error: userError } = + await supabase.auth.getUser() if (userError || !userResponse.user) { l.info({ @@ -167,10 +172,14 @@ export async function GET( error: teamQueryError, }) - return redirectToDashboardWithWarning(request, 'inspect_sandbox:no_teams', { - user_id: userId, - sandbox_id: sandboxId, - }) + return redirectToDashboardWithWarning( + request, + 'inspect_sandbox:no_teams', + { + user_id: userId, + sandbox_id: sandboxId, + } + ) } const userTeams: UserTeam[] = userTeamRows.map((row) => ({ @@ -188,11 +197,15 @@ export async function GET( ) if (!selectedTeam) { - return redirectToDashboardWithWarning(request, 'inspect_sandbox:not_found', { - user_id: userId, - sandbox_id: sandboxId, - teams_checked: userTeams.map((team) => team.id), - }) + return redirectToDashboardWithWarning( + request, + 'inspect_sandbox:not_found', + { + user_id: userId, + sandbox_id: sandboxId, + teams_checked: userTeams.map((team) => team.id), + } + ) } const redirectUrl = new URL( diff --git a/src/configs/flags.ts b/src/configs/flags.ts index c3f7b3fc9..4a43193fc 100644 --- a/src/configs/flags.ts +++ b/src/configs/flags.ts @@ -12,7 +12,8 @@ export const INCLUDE_DASHBOARD_FEEDBACK_SURVEY = process.env.NEXT_PUBLIC_POSTHOG_DASHBOARD_FEEDBACK_SURVEY_ID && process.env.NEXT_PUBLIC_POSTHOG_KEY -export const INCLUDE_REPORT_ISSUE = process.env.NEXT_PUBLIC_INCLUDE_REPORT_ISSUE === '1' +export const INCLUDE_REPORT_ISSUE = + process.env.NEXT_PUBLIC_INCLUDE_REPORT_ISSUE === '1' const CAPTCHA_ENABLED = process.env.NEXT_PUBLIC_CAPTCHA_ENABLED === '1' diff --git a/src/configs/sidebar.ts b/src/configs/sidebar.ts index 4ec746f18..fbb8ad5e4 100644 --- a/src/configs/sidebar.ts +++ b/src/configs/sidebar.ts @@ -25,7 +25,6 @@ export type SidebarNavItem = { | ForwardRefExoticComponent< Omit & RefAttributes > - // eslint-disable-next-line @typescript-eslint/no-explicit-any | ((...args: any[]) => JSX.Element) group?: string activeMatch?: string diff --git a/src/features/auth/oauth-provider-buttons.tsx b/src/features/auth/oauth-provider-buttons.tsx index 0d79fe9a9..8b67a129c 100644 --- a/src/features/auth/oauth-provider-buttons.tsx +++ b/src/features/auth/oauth-provider-buttons.tsx @@ -15,7 +15,9 @@ export function OAuthProviders() {
diff --git a/src/features/dashboard/context.tsx b/src/features/dashboard/context.tsx index 266b54330..2281e0435 100644 --- a/src/features/dashboard/context.tsx +++ b/src/features/dashboard/context.tsx @@ -2,7 +2,7 @@ import { ClientTeam } from '@/types/dashboard.types' import { User } from '@supabase/supabase-js' -import { createContext, ReactNode, useContext, useState } from 'react' +import { ReactNode, createContext, useContext, useState } from 'react' interface DashboardContextValue { team: ClientTeam diff --git a/src/features/dashboard/layouts/header.tsx b/src/features/dashboard/layouts/header.tsx index 1dce270a8..595af2e67 100644 --- a/src/features/dashboard/layouts/header.tsx +++ b/src/features/dashboard/layouts/header.tsx @@ -1,6 +1,6 @@ 'use client' -import { getDashboardLayoutConfig, TitleSegment } from '@/configs/layout' +import { TitleSegment, getDashboardLayoutConfig } from '@/configs/layout' import { cn } from '@/lib/utils' import ClientOnly from '@/ui/client-only' import { SidebarTrigger } from '@/ui/primitives/sidebar' @@ -65,7 +65,9 @@ function HeaderTitle({ title }: { title: string | TitleSegment[] }) { {title.map((segment, index) => ( - {index > 0 && /} + {index > 0 && ( + / + )} {segment.href ? ( - + {children} - {/* eslint-disable-next-line @next/next/no-img-element */} {name} state.pollingInterval) + const pollingInterval = useSandboxListTableStore( + (state) => state.pollingInterval + ) const setPollingInterval = useSandboxListTableStore( (state) => state.setPollingInterval ) @@ -53,14 +55,10 @@ export function SandboxesHeader({ {filteredCount} {filteredCount === 1 ? 'result' : 'results'} · - - {totalCount} total - + {totalCount} total ) : ( - - {totalCount} total - + {totalCount} total )} diff --git a/src/features/dashboard/sandboxes/list/hooks/use-sandboxes-metrics.tsx b/src/features/dashboard/sandboxes/list/hooks/use-sandboxes-metrics.tsx index 229a51118..eedb897d4 100644 --- a/src/features/dashboard/sandboxes/list/hooks/use-sandboxes-metrics.tsx +++ b/src/features/dashboard/sandboxes/list/hooks/use-sandboxes-metrics.tsx @@ -51,7 +51,8 @@ export function useSandboxesMetrics({ const setMetrics = useSandboxMetricsStore((s) => s.setMetrics) const shouldEnableMetricsQuery = !isListScrolling && activeSandboxIds.length > 0 - const metricsRefetchInterval = pollingIntervalMs > 0 ? pollingIntervalMs : false + const metricsRefetchInterval = + pollingIntervalMs > 0 ? pollingIntervalMs : false const metricsQueryInput = useMemo( () => ({ @@ -62,17 +63,14 @@ export function useSandboxesMetrics({ ) const { data } = useQuery( - trpc.sandboxes.getSandboxesMetrics.queryOptions( - metricsQueryInput, - { - enabled: shouldEnableMetricsQuery, - refetchInterval: metricsRefetchInterval, - refetchOnWindowFocus: false, - refetchOnMount: false, - refetchOnReconnect: true, - refetchIntervalInBackground: false, - } - ) + trpc.sandboxes.getSandboxesMetrics.queryOptions(metricsQueryInput, { + enabled: shouldEnableMetricsQuery, + refetchInterval: metricsRefetchInterval, + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: true, + refetchIntervalInBackground: false, + }) ) useEffect(() => { diff --git a/src/features/dashboard/sandboxes/list/stores/table-store.ts b/src/features/dashboard/sandboxes/list/stores/table-store.ts index 94f03dfa1..434cda55a 100644 --- a/src/features/dashboard/sandboxes/list/stores/table-store.ts +++ b/src/features/dashboard/sandboxes/list/stores/table-store.ts @@ -26,8 +26,7 @@ export const sandboxListDefaultSorting: SortingState = [ export const getSandboxListEffectiveSorting = ( sorting: SortingState -): SortingState => - sorting.length > 0 ? sorting : sandboxListDefaultSorting +): SortingState => (sorting.length > 0 ? sorting : sandboxListDefaultSorting) type UpdaterInput = T | ((state: T) => T) @@ -120,8 +119,10 @@ export const useSandboxListTableStore = create()( let nextGlobalFilter = '' set((state) => { - const resolvedGlobalFilter = - resolveUpdater(globalFilterUpdater, state.globalFilter) + const resolvedGlobalFilter = resolveUpdater( + globalFilterUpdater, + state.globalFilter + ) if (resolvedGlobalFilter === state.globalFilter) { return state diff --git a/src/features/dashboard/sandboxes/list/table-body.tsx b/src/features/dashboard/sandboxes/list/table-body.tsx index 5bf58fe36..5b7899583 100644 --- a/src/features/dashboard/sandboxes/list/table-body.tsx +++ b/src/features/dashboard/sandboxes/list/table-body.tsx @@ -1,10 +1,10 @@ import { useVirtualRows } from '@/lib/hooks/use-virtual-rows' import { DataTableBody } from '@/ui/data-table' import { Button } from '@/ui/primitives/button' -import { type RefObject } from 'react' import { ExternalLink, X } from 'lucide-react' -import { useSandboxesMetrics } from './hooks/use-sandboxes-metrics' +import { type RefObject } from 'react' import SandboxesListEmpty from './empty' +import { useSandboxesMetrics } from './hooks/use-sandboxes-metrics' import { useSandboxListTableStore } from './stores/table-store' import type { SandboxListRow, SandboxListTable } from './table-config' import { SandboxesTableRow } from './table-row' diff --git a/src/features/dashboard/sandboxes/list/table-cells.tsx b/src/features/dashboard/sandboxes/list/table-cells.tsx index 34029f1e7..31e5e87ac 100644 --- a/src/features/dashboard/sandboxes/list/table-cells.tsx +++ b/src/features/dashboard/sandboxes/list/table-cells.tsx @@ -66,9 +66,7 @@ const DiskUsageCellView = ({ sandboxId, totalDiskGb }: DiskUsageCellProps) => { ) } -export const CpuUsageCell = ({ - row, -}: CellContext) => ( +export const CpuUsageCell = ({ row }: CellContext) => (
) -export const RamUsageCell = ({ - row, -}: CellContext) => ( +export const RamUsageCell = ({ row }: CellContext) => (
, @@ -216,10 +216,7 @@ export default function SandboxesTable() { ))} - +
diff --git a/src/features/dashboard/sandboxes/monitoring/charts-context.tsx b/src/features/dashboard/sandboxes/monitoring/charts-context.tsx index 34784c11a..207cd9174 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts-context.tsx +++ b/src/features/dashboard/sandboxes/monitoring/charts-context.tsx @@ -1,7 +1,7 @@ 'use client' import { TeamMetricsResponse } from '@/app/api/teams/[teamId]/metrics/types' -import { createContext, ReactNode, useContext, useMemo, useState } from 'react' +import { ReactNode, createContext, useContext, useMemo, useState } from 'react' import useSWR from 'swr' import { useDashboard } from '../../context' import { useTimeframe } from './hooks/use-timeframe' diff --git a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/index.tsx b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/index.tsx index 158444682..31b7f8b82 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/index.tsx +++ b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/index.tsx @@ -102,53 +102,45 @@ function TeamMetricsChart({ const bg1 = cssVars['--bg-1'] || '#fff' // tooltip formatter that extracts data and calls onTooltipValueChange - const tooltipFormatter = useCallback( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (params: any) => { - // params is an array when trigger is 'axis' - const paramArray = Array.isArray(params) ? params : [params] - - if (paramArray.length > 0 && paramArray[0]?.value) { - const [timestamp, value] = paramArray[0].value - - if ( - onTooltipValueChangeRef.current && - timestamp !== undefined && - value !== undefined - ) { - onTooltipValueChangeRef.current(timestamp, value) - } + const tooltipFormatter = useCallback((params: any) => { + // params is an array when trigger is 'axis' + const paramArray = Array.isArray(params) ? params : [params] + + if (paramArray.length > 0 && paramArray[0]?.value) { + const [timestamp, value] = paramArray[0].value + + if ( + onTooltipValueChangeRef.current && + timestamp !== undefined && + value !== undefined + ) { + onTooltipValueChangeRef.current(timestamp, value) } + } - return '' - }, - [] - ) + return '' + }, []) + + const handleBrushEnd = useCallback((params: any) => { + const areas = params.areas + if (areas && areas.length > 0) { + const coordRange = areas[0].coordRange + + if (coordRange && coordRange.length === 2 && onZoomEndRef.current) { + const startValue = Math.round(coordRange[0]) + const endValue = Math.round(coordRange[1]) - const handleBrushEnd = useCallback( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (params: any) => { - const areas = params.areas - if (areas && areas.length > 0) { - const coordRange = areas[0].coordRange - - if (coordRange && coordRange.length === 2 && onZoomEndRef.current) { - const startValue = Math.round(coordRange[0]) - const endValue = Math.round(coordRange[1]) - - onZoomEndRef.current(startValue, endValue) - - // clears brush after selection - chartInstanceRef.current?.dispatchAction({ - type: 'brush', - command: 'clear', - areas: [], - }) - } + onZoomEndRef.current(startValue, endValue) + + // clears brush after selection + chartInstanceRef.current?.dispatchAction({ + type: 'brush', + command: 'clear', + areas: [], + }) } - }, - [] - ) + } + }, []) // chart ready handler - stable reference const handleChartReady = useCallback((chart: echarts.ECharts) => { diff --git a/src/features/dashboard/sandboxes/monitoring/header.client.tsx b/src/features/dashboard/sandboxes/monitoring/header.client.tsx index ee5badfd8..f8732771e 100644 --- a/src/features/dashboard/sandboxes/monitoring/header.client.tsx +++ b/src/features/dashboard/sandboxes/monitoring/header.client.tsx @@ -31,7 +31,7 @@ export function ConcurrentSandboxesClient({ value={lastConcurrentSandboxes} className="prose-value-big mt-1" /> - {!!(limit) && ( + {!!limit && ( LIMIT: {formatNumber(limit)} diff --git a/src/features/dashboard/sandboxes/monitoring/time-picker/time-panel.tsx b/src/features/dashboard/sandboxes/monitoring/time-picker/time-panel.tsx index 971fcf7b5..98f9f227f 100644 --- a/src/features/dashboard/sandboxes/monitoring/time-picker/time-panel.tsx +++ b/src/features/dashboard/sandboxes/monitoring/time-picker/time-panel.tsx @@ -33,7 +33,7 @@ import { import { TimeInput } from '@/ui/time-input' import { MAX_DAYS_AGO } from './constants' -import { customTimeFormSchema, type CustomTimeFormValues } from './validation' +import { type CustomTimeFormValues, customTimeFormSchema } from './validation' export interface TimePanelRef { form: UseFormReturn diff --git a/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx b/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx index c20d28609..b70070e42 100644 --- a/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx +++ b/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx @@ -242,9 +242,9 @@ export function WebhookAddEditDialogSteps({

This secret is used to verify webhook authenticity. Each request - includes an e2b-signature{' '} - header generated with HMAC SHA-256. Validate this in your endpoint - to ensure requests are from E2B and untampered. + includes an e2b-signature header + generated with HMAC SHA-256. Validate this in your endpoint to + ensure requests are from E2B and untampered.

· - - {totalCount} total - + {totalCount} total ) : ( - - {totalCount} total - + {totalCount} total )}
diff --git a/src/features/dashboard/templates/list/table-body.tsx b/src/features/dashboard/templates/list/table-body.tsx index 9497f2056..dad253863 100644 --- a/src/features/dashboard/templates/list/table-body.tsx +++ b/src/features/dashboard/templates/list/table-body.tsx @@ -3,7 +3,7 @@ import { Template } from '@/types/api.types' import { DataTableBody, DataTableCell, DataTableRow } from '@/ui/data-table' import Empty from '@/ui/empty' import { Button } from '@/ui/primitives/button' -import { flexRender, Row, Table } from '@tanstack/react-table' +import { Row, Table, flexRender } from '@tanstack/react-table' import { ExternalLink, X } from 'lucide-react' import { type RefObject } from 'react' import { useTemplateTableStore } from './stores/table-store' diff --git a/src/features/dashboard/templates/list/table-config.tsx b/src/features/dashboard/templates/list/table-config.tsx index c9b75da5e..13e17d319 100644 --- a/src/features/dashboard/templates/list/table-config.tsx +++ b/src/features/dashboard/templates/list/table-config.tsx @@ -5,10 +5,10 @@ import { rankItem } from '@tanstack/match-sorter-utils' import { ColumnDef, FilterFn, + TableOptions, getCoreRowModel, getFilteredRowModel, getSortedRowModel, - TableOptions, } from '@tanstack/react-table' import posthog from 'posthog-js' import { useMemo } from 'react' diff --git a/src/features/dashboard/templates/list/table.tsx b/src/features/dashboard/templates/list/table.tsx index 358455995..fad6a5c80 100644 --- a/src/features/dashboard/templates/list/table.tsx +++ b/src/features/dashboard/templates/list/table.tsx @@ -19,8 +19,8 @@ import { useSuspenseQuery } from '@tanstack/react-query' import { ColumnFiltersState, ColumnSizingState, - flexRender, TableOptions, + flexRender, useReactTable, } from '@tanstack/react-table' import { useEffect, useMemo, useRef, useState } from 'react' @@ -111,7 +111,6 @@ export default function TemplatesTable() { } setColumnFilters(newFilters) - // eslint-disable-next-line react-hooks/exhaustive-deps }, [cpuCount, memoryMB, isPublic]) const columns = useColumns([]) @@ -193,9 +192,8 @@ export default function TemplatesTable() { {header.id === 'public' ? ( Public templates can be used by all users to start - Sandboxes, but can only be edited by your team. - - Internal templates can only be used and edited by your team. + Sandboxes, but can only be edited by your team. Internal + templates can only be used and edited by your team. ) : null} diff --git a/src/features/dashboard/usage/compute-usage-chart/index.tsx b/src/features/dashboard/usage/compute-usage-chart/index.tsx index d384dc25a..4626aafc3 100644 --- a/src/features/dashboard/usage/compute-usage-chart/index.tsx +++ b/src/features/dashboard/usage/compute-usage-chart/index.tsx @@ -63,19 +63,15 @@ function ComputeUsageChart({ const bgInverted = cssVars['--bg-inverted'] || '#fff' const fontMono = cssVars['--font-mono'] || 'monospace' - const handleAxisPointer = useCallback( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (params: any) => { - const index = params.seriesData[0].dataIndex + const handleAxisPointer = useCallback((params: any) => { + const index = params.seriesData[0].dataIndex - if (index !== undefined && onHoverRef.current) { - onHoverRef.current(index) - } + if (index !== undefined && onHoverRef.current) { + onHoverRef.current(index) + } - return '' - }, - [] - ) + return '' + }, []) const handleGlobalOut = useCallback(() => { if (onHoverEndRef.current) { @@ -83,30 +79,26 @@ function ComputeUsageChart({ } }, []) - const handleBrushEnd = useCallback( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (params: any) => { - const areas = params.areas - if (areas && areas.length > 0) { - const area = areas[0] - const coordRange = area.coordRange + const handleBrushEnd = useCallback((params: any) => { + const areas = params.areas + if (areas && areas.length > 0) { + const area = areas[0] + const coordRange = area.coordRange - if (coordRange && coordRange.length === 2 && onBrushEndRef.current) { - const startIndex = coordRange[0] - const endIndex = coordRange[1] + if (coordRange && coordRange.length === 2 && onBrushEndRef.current) { + const startIndex = coordRange[0] + const endIndex = coordRange[1] - onBrushEndRef.current(startIndex, endIndex) + onBrushEndRef.current(startIndex, endIndex) - chartInstanceRef.current?.dispatchAction({ - type: 'brush', - command: 'clear', - areas: [], - }) - } + chartInstanceRef.current?.dispatchAction({ + type: 'brush', + command: 'clear', + areas: [], + }) } - }, - [] - ) + } + }, []) const handleChartReady = useCallback((chart: echarts.ECharts) => { chartInstanceRef.current = chart diff --git a/src/features/dashboard/usage/usage-charts-context.tsx b/src/features/dashboard/usage/usage-charts-context.tsx index 079d0639d..788c0bf96 100644 --- a/src/features/dashboard/usage/usage-charts-context.tsx +++ b/src/features/dashboard/usage/usage-charts-context.tsx @@ -4,8 +4,8 @@ import { fillTimeSeriesWithEmptyPoints } from '@/lib/utils/time-series' import { UsageResponse } from '@/types/billing.types' import { parseAsInteger, useQueryStates } from 'nuqs' import { - createContext, ReactNode, + createContext, useCallback, useContext, useMemo, diff --git a/src/features/dashboard/usage/usage-time-range-controls.tsx b/src/features/dashboard/usage/usage-time-range-controls.tsx index 647e09d1b..825d38180 100644 --- a/src/features/dashboard/usage/usage-time-range-controls.tsx +++ b/src/features/dashboard/usage/usage-time-range-controls.tsx @@ -12,7 +12,7 @@ import { } from '@/ui/primitives/popover' import { Separator } from '@/ui/primitives/separator' import { TimeRangePicker, type TimeRangeValues } from '@/ui/time-range-picker' -import { TimeRangePresets, type TimeRangePreset } from '@/ui/time-range-presets' +import { type TimeRangePreset, TimeRangePresets } from '@/ui/time-range-presets' import { ChevronLeft, ChevronRight } from 'lucide-react' import { useCallback, useMemo, useState } from 'react' import { TIME_RANGE_PRESETS } from './constants' diff --git a/src/lib/clients/action.ts b/src/lib/clients/action.ts index 9629b601d..b517bd573 100644 --- a/src/lib/clients/action.ts +++ b/src/lib/clients/action.ts @@ -3,7 +3,7 @@ import { getSessionInsecure } from '@/server/auth/get-session' import getUserByToken from '@/server/auth/get-user-by-token' import { getTeamIdFromSegment } from '@/server/team/get-team-id-from-segment' import { UnauthenticatedError, UnknownError } from '@/types/errors' -import { context, SpanStatusCode, trace } from '@opentelemetry/api' +import { SpanStatusCode, context, trace } from '@opentelemetry/api' import { Session, User } from '@supabase/supabase-js' import { createMiddleware, createSafeActionClient } from 'next-safe-action' import { unauthorized } from 'next/navigation' diff --git a/src/lib/hooks/use-virtual-rows.ts b/src/lib/hooks/use-virtual-rows.ts index 967bc2b6b..27d1b7dfa 100644 --- a/src/lib/hooks/use-virtual-rows.ts +++ b/src/lib/hooks/use-virtual-rows.ts @@ -1,7 +1,7 @@ 'use client' import { Row } from '@tanstack/react-table' -import { useVirtualizer, Virtualizer } from '@tanstack/react-virtual' +import { Virtualizer, useVirtualizer } from '@tanstack/react-virtual' import { RefObject, useMemo } from 'react' interface UseVirtualRowsParams { diff --git a/src/lib/utils/formatting.ts b/src/lib/utils/formatting.ts index 6851fc55f..b065142cd 100644 --- a/src/lib/utils/formatting.ts +++ b/src/lib/utils/formatting.ts @@ -71,23 +71,20 @@ export function formatLocalLogStyleTimestamp( } const timezonePart = - LOCAL_LOG_STYLE_TIMEZONE_FORMATTER - .formatToParts(date) - .find((part) => part.type === 'timeZoneName') - ?.value ?? + LOCAL_LOG_STYLE_TIMEZONE_FORMATTER.formatToParts(date).find( + (part) => part.type === 'timeZoneName' + )?.value ?? Intl.DateTimeFormat().resolvedOptions().timeZone ?? 'Local' return { - datePart: ( - includeYear - ? LOCAL_LOG_STYLE_DATE_WITH_YEAR_FORMATTER - : LOCAL_LOG_STYLE_DATE_FORMATTER + datePart: (includeYear + ? LOCAL_LOG_STYLE_DATE_WITH_YEAR_FORMATTER + : LOCAL_LOG_STYLE_DATE_FORMATTER ).format(date), - timePart: ( - includeSeconds - ? LOCAL_LOG_STYLE_TIME_FORMATTER - : LOCAL_LOG_STYLE_TIME_NO_SECONDS_FORMATTER + timePart: (includeSeconds + ? LOCAL_LOG_STYLE_TIME_FORMATTER + : LOCAL_LOG_STYLE_TIME_NO_SECONDS_FORMATTER ).format(date), timezonePart, iso: date.toISOString(), diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index ec2e197b6..8b6002545 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -29,7 +29,6 @@ export function exponentialSmoothing(speed: number = 10) { } } -// eslint-disable-next-line @typescript-eslint/no-explicit-any export function debounce void>( func: T, wait: number diff --git a/src/lib/utils/rewrites.ts b/src/lib/utils/rewrites.ts index 6781c2ee6..4164a4ae2 100644 --- a/src/lib/utils/rewrites.ts +++ b/src/lib/utils/rewrites.ts @@ -1,7 +1,7 @@ import { MIDDLEWARE_REWRITE_CONFIG, - RewriteConfigType, ROUTE_REWRITE_CONFIG, + RewriteConfigType, } from '@/configs/rewrites' import { RewriteConfig } from '@/types/rewrites.types' import * as cheerio from 'cheerio' diff --git a/src/lib/utils/ui.ts b/src/lib/utils/ui.ts index 0150baaaf..49b6770ce 100644 --- a/src/lib/utils/ui.ts +++ b/src/lib/utils/ui.ts @@ -1,13 +1,13 @@ -import { clsx, type ClassValue } from "clsx"; -import { twMerge } from "tailwind-merge"; +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); + return twMerge(clsx(inputs)) } /** * Animation easing curves * ⚠️ Must be kept in sync with theme.css utilities (anim-ease-appear, anim-ease-transform) */ -export const EASE_APPEAR = [0.23, 1, 0.32, 1] as const; // ease-out-quint -export const EASE_TRANSFORM = [0.79, 0.14, 0.15, 0.86] as const; // ease-in-out-circ +export const EASE_APPEAR = [0.23, 1, 0.32, 1] as const // ease-out-quint +export const EASE_TRANSFORM = [0.79, 0.14, 0.15, 0.86] as const // ease-in-out-circ diff --git a/src/proxy.ts b/src/proxy.ts index 9655b41ad..64bf11665 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -1,5 +1,5 @@ import { createServerClient } from '@supabase/ssr' -import { NextResponse, type NextRequest } from 'next/server' +import { type NextRequest, NextResponse } from 'next/server' import { serializeError } from 'serialize-error' import { ALLOW_SEO_INDEXING } from './configs/flags' import { l } from './lib/clients/logger/logger' diff --git a/src/server/api/init.ts b/src/server/api/init.ts index 44f9523dc..3ed24ebc4 100644 --- a/src/server/api/init.ts +++ b/src/server/api/init.ts @@ -1,6 +1,6 @@ import { initTRPC } from '@trpc/server' import superjson from 'superjson' -import { flattenError, ZodError } from 'zod' +import { ZodError, flattenError } from 'zod' /** * TRPC Context Factory diff --git a/src/server/api/middlewares/auth.ts b/src/server/api/middlewares/auth.ts index 9ba892a83..6d3205387 100644 --- a/src/server/api/middlewares/auth.ts +++ b/src/server/api/middlewares/auth.ts @@ -1,7 +1,7 @@ import { getTracer } from '@/lib/clients/tracer' import { getSessionInsecure } from '@/server/auth/get-session' import getUserByToken from '@/server/auth/get-user-by-token' -import { context, SpanStatusCode, trace } from '@opentelemetry/api' +import { SpanStatusCode, context, trace } from '@opentelemetry/api' import { createServerClient, parseCookieHeader, diff --git a/src/server/api/middlewares/telemetry.ts b/src/server/api/middlewares/telemetry.ts index 572f2bebd..e64b8552d 100644 --- a/src/server/api/middlewares/telemetry.ts +++ b/src/server/api/middlewares/telemetry.ts @@ -4,10 +4,10 @@ import { getTracer } from '@/lib/clients/tracer' import { flattenClientInputValue } from '@/lib/utils/action' import type { Span } from '@opentelemetry/api' import { - context, Counter, Histogram, SpanStatusCode, + context, trace, } from '@opentelemetry/api' import { User } from '@supabase/supabase-js' diff --git a/src/server/api/procedures.ts b/src/server/api/procedures.ts index 2fa56d4a5..f36a9e319 100644 --- a/src/server/api/procedures.ts +++ b/src/server/api/procedures.ts @@ -1,6 +1,6 @@ import { getTracer } from '@/lib/clients/tracer' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' -import { context, SpanStatusCode, trace } from '@opentelemetry/api' +import { SpanStatusCode, context, trace } from '@opentelemetry/api' import z from 'zod' import checkUserTeamAuthCached from '../auth/check-user-team-auth-cached' import { getTeamIdFromSegment } from '../team/get-team-id-from-segment' diff --git a/src/server/api/repositories/builds.repository.ts b/src/server/api/repositories/builds.repository.ts index 25d3d462a..1a7b4687e 100644 --- a/src/server/api/repositories/builds.repository.ts +++ b/src/server/api/repositories/builds.repository.ts @@ -7,11 +7,11 @@ import { TRPCError } from '@trpc/server' import z from 'zod' import { apiError } from '../errors' import { + type BuildStatusDB, ListedBuildDTO, + type RunningBuildStatusDTO, mapDatabaseBuildReasonToListedBuildDTOStatusMessage, mapDatabaseBuildStatusToBuildStatusDTO, - type BuildStatusDB, - type RunningBuildStatusDTO, } from '../models/builds.models' // helpers diff --git a/src/server/api/routers/sandboxes.ts b/src/server/api/routers/sandboxes.ts index ef9c6b828..20299b1dd 100644 --- a/src/server/api/routers/sandboxes.ts +++ b/src/server/api/routers/sandboxes.ts @@ -1,10 +1,10 @@ import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { USE_MOCK_DATA } from '@/configs/flags' import { - calculateTeamMetricsStep, MOCK_SANDBOXES_DATA, MOCK_TEAM_METRICS_DATA, MOCK_TEAM_METRICS_MAX_DATA, + calculateTeamMetricsStep, } from '@/configs/mock-data' import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' diff --git a/src/server/sandboxes/get-team-metrics-core.ts b/src/server/sandboxes/get-team-metrics-core.ts index 1b0a430c1..a49e503cc 100644 --- a/src/server/sandboxes/get-team-metrics-core.ts +++ b/src/server/sandboxes/get-team-metrics-core.ts @@ -3,8 +3,8 @@ import 'server-only' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { USE_MOCK_DATA } from '@/configs/flags' import { - calculateTeamMetricsStep, MOCK_TEAM_METRICS_DATA, + calculateTeamMetricsStep, } from '@/configs/mock-data' import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' diff --git a/src/styles/animations.css b/src/styles/animations.css index 3fd41c9dc..ab53af6c4 100644 --- a/src/styles/animations.css +++ b/src/styles/animations.css @@ -1,19 +1,19 @@ /* Toast */ -.ToastRoot[data-state='open'] { +.ToastRoot[data-state="open"] { animation: slideIn 150ms cubic-bezier(0.16, 1, 0.3, 1) !important; } -.ToastRoot[data-state='closed'] { +.ToastRoot[data-state="closed"] { animation: hide 100ms ease-in !important; } -.ToastRoot[data-swipe='move'] { +.ToastRoot[data-swipe="move"] { transform: translateX(var(--radix-toast-swipe-move-x)) !important; } -.ToastRoot[data-swipe='cancel'] { +.ToastRoot[data-swipe="cancel"] { transform: translateX(0) !important; transition: transform 200ms ease-out !important; } -.ToastRoot[data-swipe='end'] { +.ToastRoot[data-swipe="end"] { animation: swipeOut 100ms ease-out !important; } diff --git a/src/styles/docs.css b/src/styles/docs.css index 6ca9a9e9c..1132a93ea 100644 --- a/src/styles/docs.css +++ b/src/styles/docs.css @@ -9,6 +9,6 @@ } /* Remove margin from alert description */ -[role='alert'] p { +[role="alert"] p { margin: 0; } diff --git a/src/styles/globals.css b/src/styles/globals.css index 61579163e..aa092142d 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -1,4 +1,4 @@ -@import './theme.css'; +@import "./theme.css"; ::-webkit-scrollbar { width: 4px; diff --git a/src/styles/theme.css b/src/styles/theme.css index 75f4c92f2..8de22e67e 100644 --- a/src/styles/theme.css +++ b/src/styles/theme.css @@ -1,5 +1,5 @@ -@import 'tailwindcss'; -@import 'tw-animate-css'; +@import "tailwindcss"; +@import "tw-animate-css"; @custom-variant dark (&:is(.dark *)); @@ -105,12 +105,7 @@ --graph-area-accent-main-from: rgba(229, 111, 0, 0.16); --graph-area-accent-main-to: rgba(250, 250, 250, 0.16); - --graph-area-accent-positive-from: rgba( - 0, - 166, - 112, - 0.16 - ); /* Success/positive area gradient */ + --graph-area-accent-positive-from: rgba(0, 166, 112, 0.16); /* Success/positive area gradient */ --graph-area-accent-positive-to: rgba(250, 250, 250, 0.2); --graph-area-fg-from: rgba(108, 108, 108, 0.2); @@ -125,20 +120,10 @@ --graph-area-3-from: rgba(226, 124, 29, 0.18); /* Dark orange area gradient */ --graph-area-3-to: rgba(250, 250, 250, 0.2); - --graph-area-4-from: rgba( - 192, - 155, - 184, - 0.18 - ); /* Pastel purple-peach area gradient */ + --graph-area-4-from: rgba(192, 155, 184, 0.18); /* Pastel purple-peach area gradient */ --graph-area-4-to: rgba(250, 250, 250, 0.2); - --graph-area-5-from: rgba( - 166, - 127, - 169, - 0.18 - ); /* Pastel purple area gradient */ + --graph-area-5-from: rgba(166, 127, 169, 0.18); /* Pastel purple area gradient */ --graph-area-5-to: rgba(250, 250, 250, 0.2); --graph-area-6-from: rgba(140, 92, 165, 0.18); /* Purple area gradient */ @@ -204,12 +189,7 @@ --graph-area-accent-main-from: rgba(255, 136, 0, 0.22); --graph-area-accent-main-to: rgba(10, 10, 10, 0.2); - --graph-area-accent-positive-from: rgba( - 0, - 217, - 146, - 0.22 - ); /* Success/positive area gradient */ + --graph-area-accent-positive-from: rgba(0, 217, 146, 0.22); /* Success/positive area gradient */ --graph-area-accent-positive-to: rgba(10, 10, 10, 0.2); --graph-area-1-from: rgba(252, 232, 216, 0.35); /* Peachy area gradient */ @@ -224,20 +204,10 @@ --graph-area-fg-from: rgba(108, 108, 108, 0.2); --graph-area-fg-to: rgba(10, 10, 10, 0.2); - --graph-area-4-from: rgba( - 212, - 176, - 204, - 0.25 - ); /* Pastel purple-peach area gradient */ + --graph-area-4-from: rgba(212, 176, 204, 0.25); /* Pastel purple-peach area gradient */ --graph-area-4-to: rgba(10, 10, 10, 0.2); - --graph-area-5-from: rgba( - 186, - 148, - 189, - 0.25 - ); /* Pastel purple area gradient */ + --graph-area-5-from: rgba(186, 148, 189, 0.25); /* Pastel purple area gradient */ --graph-area-5-to: rgba(10, 10, 10, 0.2); --graph-area-6-from: rgba(162, 117, 187, 0.25); /* Purple area gradient */ @@ -319,53 +289,49 @@ --color-chart-5: var(--accent-error-highlight); /* Shadows */ - --shadow-xs: - 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)), + --shadow-xs: 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 1px 1px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --shadow-sm: - 0 1px 3px hsl(from var(--shadow) h s l / var(--shadow-strength)), + --shadow-sm: 0 1px 3px hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --shadow-md: - 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)), + --shadow-md: 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 2px 4px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --shadow-lg: - 0 10px 15px hsl(from var(--shadow) h s l / var(--shadow-strength)), - 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --shadow-xl: - 0 20px 25px hsl(from var(--shadow) h s l / var(--shadow-strength)), - 0 8px 10px hsl(from var(--shadow) h s l / var(--shadow-strength)); + --shadow-lg: 0 10px 15px + hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 4px 6px + hsl(from var(--shadow) h s l / var(--shadow-strength)); + --shadow-xl: 0 20px 25px + hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 8px 10px + hsl(from var(--shadow) h s l / var(--shadow-strength)); --shadow-2xl: 0 25px 50px hsl(from var(--shadow) h s l / var(--shadow-strength)); --shadow-inner: inset 0 2px 4px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-xs: - 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)), - 0 1px 1px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-sm: - 0 1px 3px hsl(from var(--shadow) h s l / var(--shadow-strength)), - 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-md: - 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)), - 0 2px 4px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-lg: - 0 10px 15px hsl(from var(--shadow) h s l / var(--shadow-strength)), - 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-xl: - 0 20px 25px hsl(from var(--shadow) h s l / var(--shadow-strength)), - 0 8px 10px hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-xs: 0 1px 2px + hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 1px 1px + hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-sm: 0 1px 3px + hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 1px 2px + hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-md: 0 4px 6px + hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 2px 4px + hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-lg: 0 10px 15px + hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 4px 6px + hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-xl: 0 20px 25px + hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 8px 10px + hsl(from var(--shadow) h s l / var(--shadow-strength)); --drop-shadow-2xl: 0 25px 50px hsl(from var(--shadow) h s l / var(--shadow-strength)); /* Font Family */ --font-sans: - 'IBM Plex Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', - Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - --font-mono: - 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, - 'Liberation Mono', 'Courier New', monospace; - --font-fira-code: 'Fira Code', monospace; + "IBM Plex Sans", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", + Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, + Consolas, "Liberation Mono", "Courier New", monospace; + --font-fira-code: "Fira Code", monospace; /* Animations */ @keyframes accordion-down { @@ -433,37 +399,37 @@ @keyframes loader-slash { 0% { - content: '|'; + content: "|"; } 25% { - content: '/'; + content: "/"; } 50% { - content: '-'; + content: "-"; } 75% { - content: '\\'; + content: "\\"; } 100% { - content: '|'; + content: "|"; } } @keyframes loader-square { 0% { - content: '◰'; + content: "◰"; } 25% { - content: '◳'; + content: "◳"; } 50% { - content: '◲'; + content: "◲"; } 75% { - content: '◱'; + content: "◱"; } 100% { - content: '◰'; + content: "◰"; } } diff --git a/src/trpc/query-client.ts b/src/trpc/query-client.ts index 9e3a0d65f..f51b4f222 100644 --- a/src/trpc/query-client.ts +++ b/src/trpc/query-client.ts @@ -1,4 +1,4 @@ -import { defaultShouldDehydrateQuery, QueryClient } from '@tanstack/react-query' +import { QueryClient, defaultShouldDehydrateQuery } from '@tanstack/react-query' import SuperJSON from 'superjson' export const createQueryClient = () => diff --git a/src/trpc/server.tsx b/src/trpc/server.tsx index af3fb97a8..3b35ccfc8 100644 --- a/src/trpc/server.tsx +++ b/src/trpc/server.tsx @@ -1,9 +1,9 @@ import 'server-only' -import { dehydrate, HydrationBoundary } from '@tanstack/react-query' +import { HydrationBoundary, dehydrate } from '@tanstack/react-query' import { - createTRPCOptionsProxy, TRPCQueryOptions, + createTRPCOptionsProxy, } from '@trpc/tanstack-react-query' import { headers } from 'next/headers' import { cache } from 'react' @@ -76,13 +76,11 @@ export function HydrateClient(props: { children: React.ReactNode }) { // NOTE - prefetches do not have to be awaited. pending queries will be hydrated and streamed to the client // not awaiting the queries is useful for not blocking route trees -// eslint-disable-next-line @typescript-eslint/no-explicit-any export function prefetch>>( queryOptions: T ) { const queryClient = getQueryClient() if (queryOptions.queryKey[1]?.type === 'infinite') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any void queryClient.prefetchInfiniteQuery(queryOptions as any) } else { void queryClient.prefetchQuery(queryOptions) @@ -90,12 +88,10 @@ export function prefetch>>( } export async function prefetchAsync< - // eslint-disable-next-line @typescript-eslint/no-explicit-any T extends ReturnType>, >(queryOptions: T) { const queryClient = getQueryClient() if (queryOptions.queryKey[1]?.type === 'infinite') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any await queryClient.prefetchInfiniteQuery(queryOptions as any) } else { await queryClient.prefetchQuery(queryOptions) diff --git a/src/types/argus-api.types.ts b/src/types/argus-api.types.ts index fb40ff39f..b9286818e 100644 --- a/src/types/argus-api.types.ts +++ b/src/types/argus-api.types.ts @@ -4,476 +4,476 @@ */ export interface paths { - "/health": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Health check */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Request was successful */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/events/sandboxes/{sandboxID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get sandbox events */ - get: { - parameters: { - query?: { - offset?: number; - limit?: number; - orderAsc?: boolean; - }; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox events */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxEvent"][]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/events/sandboxes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get all sandbox events for the team associated with the API key */ - get: { - parameters: { - query?: { - offset?: number; - limit?: number; - orderAsc?: boolean; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox events */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxEvent"][]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/events/webhooks": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List registered webhooks. */ - get: operations["webhooksList"]; - put?: never; - /** @description Register events webhook. */ - post: operations["webhookCreate"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/events/webhooks/{webhookID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get a registered webhook. */ - get: operations["webhookGet"]; - put?: never; - post?: never; - /** @description Delete a registered webhook. */ - delete: operations["webhookDelete"]; - options?: never; - head?: never; - /** @description Update a registered webhook configuration. */ - patch: operations["webhookUpdate"]; - trace?: never; - }; + '/health': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Health check */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Request was successful */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/events/sandboxes/{sandboxID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get sandbox events */ + get: { + parameters: { + query?: { + offset?: number + limit?: number + orderAsc?: boolean + } + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox events */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxEvent'][] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/events/sandboxes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get all sandbox events for the team associated with the API key */ + get: { + parameters: { + query?: { + offset?: number + limit?: number + orderAsc?: boolean + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox events */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxEvent'][] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/events/webhooks': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List registered webhooks. */ + get: operations['webhooksList'] + put?: never + /** @description Register events webhook. */ + post: operations['webhookCreate'] + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/events/webhooks/{webhookID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get a registered webhook. */ + get: operations['webhookGet'] + put?: never + post?: never + /** @description Delete a registered webhook. */ + delete: operations['webhookDelete'] + options?: never + head?: never + /** @description Update a registered webhook configuration. */ + patch: operations['webhookUpdate'] + trace?: never + } } -export type webhooks = Record; +export type webhooks = Record export interface components { - schemas: { - Error: { - /** - * Format: int32 - * @description Error code - */ - code: number; - /** @description Error */ - message: string; - }; - /** @description Sandbox event */ - SandboxEvent: { - /** - * Format: uuid - * @description Event unique identifier - */ - id: string; - /** @description Event structure version */ - version: string; - /** @description Event name */ - type: string; - /** - * @deprecated - * @description Category of the event (e.g., 'lifecycle', 'process', etc.) - */ - eventCategory?: string; - /** - * @deprecated - * @description Label for the specific event type (e.g., 'sandbox_started', 'process_oom', etc.) - */ - eventLabel?: string; - /** @description Optional JSON data associated with the event */ - eventData?: Record | null; - /** - * Format: date-time - * @description Timestamp of the event - */ - timestamp: string; - /** - * Format: string - * @description Unique identifier for the sandbox - */ - sandboxId: string; - /** - * Format: string - * @description Unique identifier for the sandbox execution - */ - sandboxExecutionId: string; - /** - * Format: string - * @description Unique identifier for the sandbox template - */ - sandboxTemplateId: string; - /** - * Format: string - * @description Unique identifier for the sandbox build - */ - sandboxBuildId: string; - /** - * Format: uuid - * @description Team identifier associated with the sandbox - */ - sandboxTeamId: string; - }; - /** @description Configuration for registering new webhooks */ - WebhookCreate: { - name: string; - /** Format: uri */ - url: string; - events: string[]; - /** @default true */ - enabled: boolean; - /** @description Secret used to sign the webhook payloads */ - signatureSecret: string; - }; - /** @description Webhook creation response */ - WebhookCreation: { - /** @description Webhook unique identifier */ - id: string; - /** @description Webhook user friendly name */ - name: string; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** @description Unique identifier for the team */ - teamId: string; - /** Format: uri */ - url: string; - enabled: boolean; - events: string[]; - }; - /** @description Webhook detail response */ - WebhookDetail: { - /** @description Webhook unique identifier */ - id: string; - /** @description Unique identifier for the team */ - teamId: string; - /** @description Webhook user friendly name */ - name: string; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** Format: uri */ - url: string; - enabled: boolean; - events: string[]; - }; - /** @description Configuration for updating existing webhooks */ - WebhookConfiguration: { - enabled?: boolean; - /** @description Webhook user friendly name */ - name?: string; - /** Format: uri */ - url?: string; - events?: string[]; - /** @description Secret used to sign the webhook payloads */ - signatureSecret?: string; - }; - }; - responses: { - /** @description Bad request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Authentication error */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Conflict */ - 409: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - }; - parameters: { - sandboxID: string; - webhookID: string; - }; - requestBodies: never; - headers: never; - pathItems: never; + schemas: { + Error: { + /** + * Format: int32 + * @description Error code + */ + code: number + /** @description Error */ + message: string + } + /** @description Sandbox event */ + SandboxEvent: { + /** + * Format: uuid + * @description Event unique identifier + */ + id: string + /** @description Event structure version */ + version: string + /** @description Event name */ + type: string + /** + * @deprecated + * @description Category of the event (e.g., 'lifecycle', 'process', etc.) + */ + eventCategory?: string + /** + * @deprecated + * @description Label for the specific event type (e.g., 'sandbox_started', 'process_oom', etc.) + */ + eventLabel?: string + /** @description Optional JSON data associated with the event */ + eventData?: Record | null + /** + * Format: date-time + * @description Timestamp of the event + */ + timestamp: string + /** + * Format: string + * @description Unique identifier for the sandbox + */ + sandboxId: string + /** + * Format: string + * @description Unique identifier for the sandbox execution + */ + sandboxExecutionId: string + /** + * Format: string + * @description Unique identifier for the sandbox template + */ + sandboxTemplateId: string + /** + * Format: string + * @description Unique identifier for the sandbox build + */ + sandboxBuildId: string + /** + * Format: uuid + * @description Team identifier associated with the sandbox + */ + sandboxTeamId: string + } + /** @description Configuration for registering new webhooks */ + WebhookCreate: { + name: string + /** Format: uri */ + url: string + events: string[] + /** @default true */ + enabled: boolean + /** @description Secret used to sign the webhook payloads */ + signatureSecret: string + } + /** @description Webhook creation response */ + WebhookCreation: { + /** @description Webhook unique identifier */ + id: string + /** @description Webhook user friendly name */ + name: string + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** @description Unique identifier for the team */ + teamId: string + /** Format: uri */ + url: string + enabled: boolean + events: string[] + } + /** @description Webhook detail response */ + WebhookDetail: { + /** @description Webhook unique identifier */ + id: string + /** @description Unique identifier for the team */ + teamId: string + /** @description Webhook user friendly name */ + name: string + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** Format: uri */ + url: string + enabled: boolean + events: string[] + } + /** @description Configuration for updating existing webhooks */ + WebhookConfiguration: { + enabled?: boolean + /** @description Webhook user friendly name */ + name?: string + /** Format: uri */ + url?: string + events?: string[] + /** @description Secret used to sign the webhook payloads */ + signatureSecret?: string + } + } + responses: { + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Authentication error */ + 401: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Server error */ + 500: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + } + parameters: { + sandboxID: string + webhookID: string + } + requestBodies: never + headers: never + pathItems: never } -export type $defs = Record; +export type $defs = Record export interface operations { - webhooksList: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of registered webhooks. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["WebhookDetail"][]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - webhookCreate: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["WebhookCreate"]; - }; - }; - responses: { - /** @description Successfully created webhook. */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["WebhookCreation"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - webhookGet: { - parameters: { - query?: never; - header?: never; - path: { - webhookID: components["parameters"]["webhookID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the webhook configuration. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["WebhookDetail"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - webhookDelete: { - parameters: { - query?: never; - header?: never; - path: { - webhookID: components["parameters"]["webhookID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully deleted webhook. */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - webhookUpdate: { - parameters: { - query?: never; - header?: never; - path: { - webhookID: components["parameters"]["webhookID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["WebhookConfiguration"]; - }; - }; - responses: { - /** @description Successfully updated webhook. */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["WebhookDetail"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; + webhooksList: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description List of registered webhooks. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['WebhookDetail'][] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + webhookCreate: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['WebhookCreate'] + } + } + responses: { + /** @description Successfully created webhook. */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['WebhookCreation'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + webhookGet: { + parameters: { + query?: never + header?: never + path: { + webhookID: components['parameters']['webhookID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the webhook configuration. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['WebhookDetail'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + webhookDelete: { + parameters: { + query?: never + header?: never + path: { + webhookID: components['parameters']['webhookID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully deleted webhook. */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + webhookUpdate: { + parameters: { + query?: never + header?: never + path: { + webhookID: components['parameters']['webhookID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['WebhookConfiguration'] + } + } + responses: { + /** @description Successfully updated webhook. */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['WebhookDetail'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } } diff --git a/src/types/infra-api.types.ts b/src/types/infra-api.types.ts index 1c4537e3a..4fe6a5c02 100644 --- a/src/types/infra-api.types.ts +++ b/src/types/infra-api.types.ts @@ -4,2784 +4,2787 @@ */ export interface paths { - "/health": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Health check */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Request was successful */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all teams */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all teams */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Team"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams/{teamID}/metrics": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get metrics for the team */ - get: { - parameters: { - query?: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number; - end?: number; - }; - header?: never; - path: { - teamID: components["parameters"]["teamID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the team metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamMetric"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams/{teamID}/metrics/max": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get the maximum metrics for the team in the given interval */ - get: { - parameters: { - query: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number; - end?: number; - /** @description Metric to retrieve the maximum value for */ - metric: "concurrent_sandboxes" | "sandbox_start_rate"; - }; - header?: never; - path: { - teamID: components["parameters"]["teamID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the team metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["MaxTeamMetric"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all running sandboxes */ - get: { - parameters: { - query?: { - /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ - metadata?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all running sandboxes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ListedSandbox"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Create a sandbox from the template */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewSandbox"]; - }; - }; - responses: { - /** @description The sandbox was created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/sandboxes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all sandboxes */ - get: { - parameters: { - query?: { - /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ - metadata?: string; - /** @description Filter sandboxes by one or more states */ - state?: components["schemas"]["SandboxState"][]; - /** @description Cursor to start the list from */ - nextToken?: components["parameters"]["paginationNextToken"]; - /** @description Maximum number of items to return per page */ - limit?: components["parameters"]["paginationLimit"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all running sandboxes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ListedSandbox"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/metrics": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List metrics for given sandboxes */ - get: { - parameters: { - query: { - /** @description Comma-separated list of sandbox IDs to get metrics for */ - sandbox_ids: string[]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all running sandboxes with metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxesWithMetrics"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get sandbox logs */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - start?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - }; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox logs */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxLogs"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get a sandbox by id */ - get: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxDetail"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - /** @description Kill a sandbox */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The sandbox was killed successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/metrics": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get sandbox metrics */ - get: { - parameters: { - query?: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number; - end?: number; - }; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxMetric"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/pause": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Pause the sandbox */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The sandbox was paused successfully and can be resumed */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 409: components["responses"]["409"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/resume": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * @deprecated - * @description Resume the sandbox - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ResumedSandbox"]; - }; - }; - responses: { - /** @description The sandbox was resumed successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 409: components["responses"]["409"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/connect": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ConnectSandbox"]; - }; - }; - responses: { - /** @description The sandbox was already running */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - /** @description The sandbox was resumed successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/timeout": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** - * Format: int32 - * @description Timeout in seconds from the current time after which the sandbox should expire - */ - timeout: number; - }; - }; - }; - responses: { - /** @description Successfully set the sandbox timeout */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/refreshes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Refresh the sandbox extending its time to live */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @description Duration for which the sandbox should be kept alive in seconds */ - duration?: number; - }; - }; - }; - responses: { - /** @description Successfully refreshed the sandbox */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v3/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Create a new template */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequestV3"]; - }; - }; - responses: { - /** @description The build was requested successfully */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateRequestResponseV3"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * @deprecated - * @description Create a new template - */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequestV2"]; - }; - }; - responses: { - /** @description The build was requested successfully */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateLegacy"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/files/{hash}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get an upload link for a tar file containing build layer files */ - get: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - hash: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The upload link where to upload the tar file */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateBuildFileUpload"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all templates */ - get: { - parameters: { - query?: { - teamID?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all templates */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Template"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** - * @deprecated - * @description Create a new template - */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequest"]; - }; - }; - responses: { - /** @description The build was accepted */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateLegacy"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all builds for a template */ - get: { - parameters: { - query?: { - /** @description Cursor to start the list from */ - nextToken?: components["parameters"]["paginationNextToken"]; - /** @description Maximum number of items to return per page */ - limit?: components["parameters"]["paginationLimit"]; - }; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template with its builds */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateWithBuilds"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** - * @deprecated - * @description Rebuild an template - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequest"]; - }; - }; - responses: { - /** @description The build was accepted */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateLegacy"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - /** @description Delete a template */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The template was deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - /** - * @deprecated - * @description Update template - */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateUpdateRequest"]; - }; - }; - responses: { - /** @description The template was updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; - "/templates/{templateID}/builds/{buildID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * @deprecated - * @description Start the build - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The build has started */ - 202: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/templates/{templateID}/builds/{buildID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Start the build */ - post: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildStartV2"]; - }; - }; - responses: { - /** @description The build has started */ - 202: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/templates/{templateID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** @description Update template */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateUpdateRequest"]; - }; - }; - responses: { - /** @description The template was updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateUpdateResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; - "/templates/{templateID}/builds/{buildID}/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get template build info */ - get: { - parameters: { - query?: { - /** @description Index of the starting build log that should be returned with the template */ - logsOffset?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - level?: components["schemas"]["LogLevel"]; - }; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateBuildInfo"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/builds/{buildID}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get template build logs */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - cursor?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - direction?: components["schemas"]["LogsDirection"]; - level?: components["schemas"]["LogLevel"]; - /** @description Source of the logs that should be returned from */ - source?: components["schemas"]["LogsSource"]; - }; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template build logs */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateBuildLogsResponse"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/tags": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Assign tag(s) to a template build */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AssignTemplateTagsRequest"]; - }; - }; - responses: { - /** @description Tag assigned successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AssignedTemplateTags"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - /** @description Delete multiple tags from templates */ - delete: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["DeleteTemplateTagsRequest"]; - }; - }; - responses: { - /** @description Tags deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/aliases/{alias}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Check if template with given alias exists */ - get: { - parameters: { - query?: never; - header?: never; - path: { - alias: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully queried template by alias */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateAliasResponse"]; - }; - }; - 400: components["responses"]["400"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/nodes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all nodes */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all nodes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Node"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/nodes/{nodeID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get node info */ - get: { - parameters: { - query?: { - /** @description Identifier of the cluster */ - clusterID?: string; - }; - header?: never; - path: { - nodeID: components["parameters"]["nodeID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the node */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["NodeDetail"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Change status of a node */ - post: { - parameters: { - query?: never; - header?: never; - path: { - nodeID: components["parameters"]["nodeID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": components["schemas"]["NodeStatusChange"]; - }; - }; - responses: { - /** @description The node status was changed successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/teams/{teamID}/sandboxes/kill": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Kill all sandboxes for a team - * @description Kills all sandboxes for the specified team - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Team ID */ - teamID: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully killed sandboxes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AdminSandboxKillResult"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/access-tokens": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Create a new access token */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewAccessToken"]; - }; - }; - responses: { - /** @description Access token created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["CreatedAccessToken"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/access-tokens/{accessTokenID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** @description Delete an access token */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - accessTokenID: components["parameters"]["accessTokenID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Access token deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api-keys": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all team API keys */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all team API keys */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamAPIKey"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Create a new team API key */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewTeamAPIKey"]; - }; - }; - responses: { - /** @description Team API key created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["CreatedTeamAPIKey"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api-keys/{apiKeyID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** @description Delete a team API key */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - apiKeyID: components["parameters"]["apiKeyID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Team API key deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - /** @description Update a team API key */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - apiKeyID: components["parameters"]["apiKeyID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateTeamAPIKey"]; - }; - }; - responses: { - /** @description Team API key updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; -} -export type webhooks = Record; -export interface components { - schemas: { - Team: { - /** @description Identifier of the team */ - teamID: string; - /** @description Name of the team */ - name: string; - /** @description API key for the team */ - apiKey: string; - /** @description Whether the team is the default team */ - isDefault: boolean; - }; - TeamUser: { - /** - * Format: uuid - * @description Identifier of the user - */ - id: string; - /** @description Email of the user */ - email: string; - }; - TemplateUpdateRequest: { - /** @description Whether the template is public or only accessible by the team */ - public?: boolean; - }; - TemplateUpdateResponse: { - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[]; - }; - /** - * Format: int32 - * @description CPU cores for the sandbox - */ - CPUCount: number; - /** - * Format: int32 - * @description Memory for the sandbox in MiB - */ - MemoryMB: number; - /** - * Format: int32 - * @description Disk size for the sandbox in MiB - */ - DiskSizeMB: number; - /** @description Version of the envd running in the sandbox */ - EnvdVersion: string; - SandboxMetadata: { - [key: string]: string; - }; - /** - * @description State of the sandbox - * @enum {string} - */ - SandboxState: "running" | "paused"; - EnvVars: { - [key: string]: string; - }; - /** @description MCP configuration for the sandbox */ - Mcp: { - [key: string]: unknown; - } | null; - SandboxNetworkConfig: { - /** - * @description Specify if the sandbox URLs should be accessible only with authentication. - * @default true - */ - allowPublicTraffic: boolean; - /** @description List of allowed CIDR blocks or IP addresses for egress traffic. Allowed addresses always take precedence over blocked addresses. */ - allowOut?: string[]; - /** @description List of denied CIDR blocks or IP addresses for egress traffic */ - denyOut?: string[]; - /** @description Specify host mask which will be used for all sandbox requests */ - maskRequestHost?: string; - }; - /** @description Log entry with timestamp and line */ - SandboxLog: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string; - /** @description Log line content */ - line: string; - }; - SandboxLogEntry: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string; - /** @description Log message content */ - message: string; - level: components["schemas"]["LogLevel"]; - fields: { - [key: string]: string; - }; - }; - SandboxLogs: { - /** @description Logs of the sandbox */ - logs: components["schemas"]["SandboxLog"][]; - /** @description Structured logs of the sandbox */ - logEntries: components["schemas"]["SandboxLogEntry"][]; - }; - /** @description Metric entry with timestamp and line */ - SandboxMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string; - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number; - /** - * Format: int32 - * @description Number of CPU cores - */ - cpuCount: number; - /** - * Format: float - * @description CPU usage percentage - */ - cpuUsedPct: number; - /** - * Format: int64 - * @description Memory used in bytes - */ - memUsed: number; - /** - * Format: int64 - * @description Total memory in bytes - */ - memTotal: number; - /** - * Format: int64 - * @description Disk used in bytes - */ - diskUsed: number; - /** - * Format: int64 - * @description Total disk space in bytes - */ - diskTotal: number; - }; - Sandbox: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** @description Alias of the template */ - alias?: string; - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string; - envdVersion: components["schemas"]["EnvdVersion"]; - /** @description Access token used for envd communication */ - envdAccessToken?: string; - /** @description Token required for accessing sandbox via proxy. */ - trafficAccessToken?: string | null; - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null; - }; - SandboxDetail: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Alias of the template */ - alias?: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string; - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string; - /** - * Format: date-time - * @description Time when the sandbox will expire - */ - endAt: string; - envdVersion: components["schemas"]["EnvdVersion"]; - /** @description Access token used for envd communication */ - envdAccessToken?: string; - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - metadata?: components["schemas"]["SandboxMetadata"]; - state: components["schemas"]["SandboxState"]; - }; - ListedSandbox: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Alias of the template */ - alias?: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string; - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string; - /** - * Format: date-time - * @description Time when the sandbox will expire - */ - endAt: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - metadata?: components["schemas"]["SandboxMetadata"]; - state: components["schemas"]["SandboxState"]; - envdVersion: components["schemas"]["EnvdVersion"]; - }; - SandboxesWithMetrics: { - sandboxes: { - [key: string]: components["schemas"]["SandboxMetric"]; - }; - }; - NewSandbox: { - /** @description Identifier of the required template */ - templateID: string; - /** - * Format: int32 - * @description Time to live for the sandbox in seconds. - * @default 15 - */ - timeout: number; - /** - * @description Automatically pauses the sandbox after the timeout - * @default false - */ - autoPause: boolean; - /** @description Secure all system communication with sandbox */ - secure?: boolean; - /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ - allow_internet_access?: boolean; - network?: components["schemas"]["SandboxNetworkConfig"]; - metadata?: components["schemas"]["SandboxMetadata"]; - envVars?: components["schemas"]["EnvVars"]; - mcp?: components["schemas"]["Mcp"]; - }; - ResumedSandbox: { - /** - * Format: int32 - * @description Time to live for the sandbox in seconds. - * @default 15 - */ - timeout: number; - /** - * @deprecated - * @description Automatically pauses the sandbox after the timeout - */ - autoPause?: boolean; - }; - ConnectSandbox: { + '/health': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Health check */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Request was successful */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all teams */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all teams */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Team'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams/{teamID}/metrics': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get metrics for the team */ + get: { + parameters: { + query?: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number + end?: number + } + header?: never + path: { + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the team metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamMetric'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams/{teamID}/metrics/max': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get the maximum metrics for the team in the given interval */ + get: { + parameters: { + query: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number + end?: number + /** @description Metric to retrieve the maximum value for */ + metric: 'concurrent_sandboxes' | 'sandbox_start_rate' + } + header?: never + path: { + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the team metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['MaxTeamMetric'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all running sandboxes */ + get: { + parameters: { + query?: { + /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ + metadata?: string + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all running sandboxes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ListedSandbox'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Create a sandbox from the template */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewSandbox'] + } + } + responses: { + /** @description The sandbox was created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/sandboxes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all sandboxes */ + get: { + parameters: { + query?: { + /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ + metadata?: string + /** @description Filter sandboxes by one or more states */ + state?: components['schemas']['SandboxState'][] + /** @description Cursor to start the list from */ + nextToken?: components['parameters']['paginationNextToken'] + /** @description Maximum number of items to return per page */ + limit?: components['parameters']['paginationLimit'] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all running sandboxes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ListedSandbox'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/metrics': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List metrics for given sandboxes */ + get: { + parameters: { + query: { + /** @description Comma-separated list of sandbox IDs to get metrics for */ + sandbox_ids: string[] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all running sandboxes with metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxesWithMetrics'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/logs': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get sandbox logs */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + start?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + } + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox logs */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxLogs'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get a sandbox by id */ + get: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxDetail'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + /** @description Kill a sandbox */ + delete: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The sandbox was killed successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/metrics': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get sandbox metrics */ + get: { + parameters: { + query?: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number + end?: number + } + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxMetric'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/pause': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Pause the sandbox */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The sandbox was paused successfully and can be resumed */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 409: components['responses']['409'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/resume': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * @deprecated + * @description Resume the sandbox + */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['ResumedSandbox'] + } + } + responses: { + /** @description The sandbox was resumed successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 409: components['responses']['409'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/connect': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['ConnectSandbox'] + } + } + responses: { + /** @description The sandbox was already running */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + /** @description The sandbox was resumed successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/timeout': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': { /** * Format: int32 * @description Timeout in seconds from the current time after which the sandbox should expire */ - timeout: number; - }; - /** @description Team metric with timestamp */ - TeamMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string; - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number; - /** - * Format: int32 - * @description The number of concurrent sandboxes for the team - */ - concurrentSandboxes: number; - /** - * Format: float - * @description Number of sandboxes started per second - */ - sandboxStartRate: number; - }; - /** @description Team metric with timestamp */ - MaxTeamMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string; - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number; - /** @description The maximum value of the requested metric in the given interval */ - value: number; - }; - AdminSandboxKillResult: { - /** @description Number of sandboxes successfully killed */ - killedCount: number; - /** @description Number of sandboxes that failed to kill */ - failedCount: number; - }; - Template: { - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the last successful build for given template */ - buildID: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[]; - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[]; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string; - createdBy: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number; - /** - * Format: int32 - * @description Number of times the template was built - */ - buildCount: number; - envdVersion: components["schemas"]["EnvdVersion"]; - buildStatus: components["schemas"]["TemplateBuildStatus"]; - }; - TemplateRequestResponseV3: { - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the last successful build for given template */ - buildID: string; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** @description Names of the template */ - names: string[]; - /** @description Tags assigned to the template build */ - tags: string[]; - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[]; - }; - TemplateLegacy: { - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the last successful build for given template */ - buildID: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** @description Aliases of the template */ - aliases: string[]; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string; - createdBy: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number; - /** - * Format: int32 - * @description Number of times the template was built - */ - buildCount: number; - envdVersion: components["schemas"]["EnvdVersion"]; - }; - TemplateBuild: { - /** - * Format: uuid - * @description Identifier of the build - */ - buildID: string; - status: components["schemas"]["TemplateBuildStatus"]; - /** - * Format: date-time - * @description Time when the build was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the build was last updated - */ - updatedAt: string; - /** - * Format: date-time - * @description Time when the build was finished - */ - finishedAt?: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB?: components["schemas"]["DiskSizeMB"]; - envdVersion?: components["schemas"]["EnvdVersion"]; - }; - TemplateWithBuilds: { - /** @description Identifier of the template */ - templateID: string; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[]; - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[]; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string; - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number; - /** @description List of builds for the template */ - builds: components["schemas"]["TemplateBuild"][]; - }; - TemplateAliasResponse: { - /** @description Identifier of the template */ - templateID: string; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - }; - TemplateBuildRequest: { - /** @description Alias of the template */ - alias?: string; - /** @description Dockerfile for the template */ - dockerfile: string; - /** @description Identifier of the team */ - teamID?: string; - /** @description Start command to execute in the template after the build */ - startCmd?: string; - /** @description Ready check command to execute in the template after the build */ - readyCmd?: string; - cpuCount?: components["schemas"]["CPUCount"]; - memoryMB?: components["schemas"]["MemoryMB"]; - }; - /** @description Step in the template build process */ - TemplateStep: { - /** @description Type of the step */ - type: string; - /** - * @description Arguments for the step - * @default [] - */ - args: string[]; - /** @description Hash of the files used in the step */ - filesHash?: string; - /** - * @description Whether the step should be forced to run regardless of the cache - * @default false - */ - force: boolean; - }; - TemplateBuildRequestV3: { - /** @description Name of the template. Can include a tag with colon separator (e.g. "my-template" or "my-template:v1"). If tag is included, it will be treated as if the tag was provided in the tags array. */ - name?: string; - /** @description Tags to assign to the template build */ - tags?: string[]; - /** - * @deprecated - * @description Alias of the template. Deprecated, use name instead. - */ - alias?: string; - /** - * @deprecated - * @description Identifier of the team - */ - teamID?: string; - cpuCount?: components["schemas"]["CPUCount"]; - memoryMB?: components["schemas"]["MemoryMB"]; - }; - TemplateBuildRequestV2: { - /** @description Alias of the template */ - alias: string; - /** - * @deprecated - * @description Identifier of the team - */ - teamID?: string; - cpuCount?: components["schemas"]["CPUCount"]; - memoryMB?: components["schemas"]["MemoryMB"]; - }; - FromImageRegistry: components["schemas"]["AWSRegistry"] | components["schemas"]["GCPRegistry"] | components["schemas"]["GeneralRegistry"]; - AWSRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "aws"; - /** @description AWS Access Key ID for ECR authentication */ - awsAccessKeyId: string; - /** @description AWS Secret Access Key for ECR authentication */ - awsSecretAccessKey: string; - /** @description AWS Region where the ECR registry is located */ - awsRegion: string; - }; - GCPRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "gcp"; - /** @description Service Account JSON for GCP authentication */ - serviceAccountJson: string; - }; - GeneralRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "registry"; - /** @description Username to use for the registry */ - username: string; - /** @description Password to use for the registry */ - password: string; - }; - TemplateBuildStartV2: { - /** @description Image to use as a base for the template build */ - fromImage?: string; - /** @description Template to use as a base for the template build */ - fromTemplate?: string; - fromImageRegistry?: components["schemas"]["FromImageRegistry"]; - /** - * @description Whether the whole build should be forced to run regardless of the cache - * @default false - */ - force: boolean; - /** - * @description List of steps to execute in the template build - * @default [] - */ - steps: components["schemas"]["TemplateStep"][]; - /** @description Start command to execute in the template after the build */ - startCmd?: string; - /** @description Ready check command to execute in the template after the build */ - readyCmd?: string; - }; - TemplateBuildFileUpload: { - /** @description Whether the file is already present in the cache */ - present: boolean; - /** @description Url where the file should be uploaded to */ - url?: string; - }; - /** - * @description State of the sandbox - * @enum {string} - */ - LogLevel: "debug" | "info" | "warn" | "error"; - BuildLogEntry: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string; - /** @description Log message content */ - message: string; - level: components["schemas"]["LogLevel"]; - /** @description Step in the build process related to the log entry */ - step?: string; - }; - BuildStatusReason: { - /** @description Message with the status reason, currently reporting only for error status */ - message: string; - /** @description Step that failed */ - step?: string; - /** - * @description Log entries related to the status reason - * @default [] - */ - logEntries: components["schemas"]["BuildLogEntry"][]; - }; - /** - * @description Status of the template build - * @enum {string} - */ - TemplateBuildStatus: "building" | "waiting" | "ready" | "error"; - TemplateBuildInfo: { - /** - * @description Build logs - * @default [] - */ - logs: string[]; - /** - * @description Build logs structured - * @default [] - */ - logEntries: components["schemas"]["BuildLogEntry"][]; - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the build */ - buildID: string; - status: components["schemas"]["TemplateBuildStatus"]; - reason?: components["schemas"]["BuildStatusReason"]; - }; - TemplateBuildLogsResponse: { - /** - * @description Build logs structured - * @default [] - */ - logs: components["schemas"]["BuildLogEntry"][]; - }; - /** - * @description Direction of the logs that should be returned - * @enum {string} - */ - LogsDirection: "forward" | "backward"; - /** - * @description Source of the logs that should be returned - * @enum {string} - */ - LogsSource: "temporary" | "persistent"; - /** - * @description Status of the node - * @enum {string} - */ - NodeStatus: "ready" | "draining" | "connecting" | "unhealthy"; - NodeStatusChange: { - /** - * Format: uuid - * @description Identifier of the cluster - */ - clusterID?: string; - status: components["schemas"]["NodeStatus"]; - }; - DiskMetrics: { - /** @description Mount point of the disk */ - mountPoint: string; - /** @description Device name */ - device: string; - /** @description Filesystem type (e.g., ext4, xfs) */ - filesystemType: string; - /** - * Format: uint64 - * @description Used space in bytes - */ - usedBytes: number; - /** - * Format: uint64 - * @description Total space in bytes - */ - totalBytes: number; - }; - /** @description Node metrics */ - NodeMetrics: { - /** - * Format: uint32 - * @description Number of allocated CPU cores - */ - allocatedCPU: number; - /** - * Format: uint32 - * @description Node CPU usage percentage - */ - cpuPercent: number; - /** - * Format: uint32 - * @description Total number of CPU cores on the node - */ - cpuCount: number; - /** - * Format: uint64 - * @description Amount of allocated memory in bytes - */ - allocatedMemoryBytes: number; - /** - * Format: uint64 - * @description Node memory used in bytes - */ - memoryUsedBytes: number; - /** - * Format: uint64 - * @description Total node memory in bytes - */ - memoryTotalBytes: number; - /** @description Detailed metrics for each disk/mount point */ - disks: components["schemas"]["DiskMetrics"][]; - }; - MachineInfo: { - /** @description CPU family of the node */ - cpuFamily: string; - /** @description CPU model of the node */ - cpuModel: string; - /** @description CPU model name of the node */ - cpuModelName: string; - /** @description CPU architecture of the node */ - cpuArchitecture: string; - }; - Node: { - /** @description Version of the orchestrator */ - version: string; - /** @description Commit of the orchestrator */ - commit: string; - /** - * @deprecated - * @description Identifier of the nomad node - */ - nodeID: string; - /** @description Identifier of the node */ - id: string; - /** @description Service instance identifier of the node */ - serviceInstanceID: string; - /** @description Identifier of the cluster */ - clusterID: string; - machineInfo: components["schemas"]["MachineInfo"]; - status: components["schemas"]["NodeStatus"]; - /** - * Format: uint32 - * @description Number of sandboxes running on the node - */ - sandboxCount: number; - metrics: components["schemas"]["NodeMetrics"]; - /** - * Format: uint64 - * @description Number of sandbox create successes - */ - createSuccesses: number; - /** - * Format: uint64 - * @description Number of sandbox create fails - */ - createFails: number; - /** - * Format: int - * @description Number of starting Sandboxes - */ - sandboxStartingCount: number; - }; - NodeDetail: { - /** @description Identifier of the cluster */ - clusterID: string; - /** @description Version of the orchestrator */ - version: string; - /** @description Commit of the orchestrator */ - commit: string; - /** @description Identifier of the node */ - id: string; - /** @description Service instance identifier of the node */ - serviceInstanceID: string; - /** - * @deprecated - * @description Identifier of the nomad node - */ - nodeID: string; - machineInfo: components["schemas"]["MachineInfo"]; - status: components["schemas"]["NodeStatus"]; - /** @description List of sandboxes running on the node */ - sandboxes: components["schemas"]["ListedSandbox"][]; - metrics: components["schemas"]["NodeMetrics"]; - /** @description List of cached builds id on the node */ - cachedBuilds: string[]; - /** - * Format: uint64 - * @description Number of sandbox create successes - */ - createSuccesses: number; - /** - * Format: uint64 - * @description Number of sandbox create fails - */ - createFails: number; - }; - CreatedAccessToken: { - /** - * Format: uuid - * @description Identifier of the access token - */ - id: string; - /** @description Name of the access token */ - name: string; - /** @description The fully created access token */ - token: string; - mask: components["schemas"]["IdentifierMaskingDetails"]; - /** - * Format: date-time - * @description Timestamp of access token creation - */ - createdAt: string; - }; - NewAccessToken: { - /** @description Name of the access token */ - name: string; - }; - TeamAPIKey: { - /** - * Format: uuid - * @description Identifier of the API key - */ - id: string; - /** @description Name of the API key */ - name: string; - mask: components["schemas"]["IdentifierMaskingDetails"]; - /** - * Format: date-time - * @description Timestamp of API key creation - */ - createdAt: string; - createdBy?: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Last time this API key was used - */ - lastUsed?: string | null; - }; - CreatedTeamAPIKey: { - /** - * Format: uuid - * @description Identifier of the API key - */ - id: string; - /** @description Raw value of the API key */ - key: string; - mask: components["schemas"]["IdentifierMaskingDetails"]; - /** @description Name of the API key */ - name: string; - /** - * Format: date-time - * @description Timestamp of API key creation - */ - createdAt: string; - createdBy?: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Last time this API key was used - */ - lastUsed?: string | null; - }; - NewTeamAPIKey: { - /** @description Name of the API key */ - name: string; - }; - UpdateTeamAPIKey: { - /** @description New name for the API key */ - name: string; - }; - AssignedTemplateTags: { - /** @description Assigned tags of the template */ - tags: string[]; - /** - * Format: uuid - * @description Identifier of the build associated with these tags - */ - buildID: string; - }; - AssignTemplateTagsRequest: { - /** @description Target template in "name:tag" format */ - target: string; - /** @description Tags to assign to the template */ - tags: string[]; - }; - DeleteTemplateTagsRequest: { - /** @description Name of the template */ - name: string; - /** @description Tags to delete */ - tags: string[]; - }; - Error: { - /** - * Format: int32 - * @description Error code - */ - code: number; - /** @description Error */ - message: string; - }; - IdentifierMaskingDetails: { - /** @description Prefix that identifies the token or key type */ - prefix: string; - /** @description Length of the token or key */ - valueLength: number; - /** @description Prefix used in masked version of the token or key */ - maskedValuePrefix: string; - /** @description Suffix used in masked version of the token or key */ - maskedValueSuffix: string; - }; - }; - responses: { - /** @description Bad request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Authentication error */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Forbidden */ - 403: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Conflict */ - 409: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - }; + timeout: number + } + } + } + responses: { + /** @description Successfully set the sandbox timeout */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/refreshes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Refresh the sandbox extending its time to live */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': { + /** @description Duration for which the sandbox should be kept alive in seconds */ + duration?: number + } + } + } + responses: { + /** @description Successfully refreshed the sandbox */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v3/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Create a new template */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequestV3'] + } + } + responses: { + /** @description The build was requested successfully */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateRequestResponseV3'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * @deprecated + * @description Create a new template + */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequestV2'] + } + } + responses: { + /** @description The build was requested successfully */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateLegacy'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/files/{hash}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get an upload link for a tar file containing build layer files */ + get: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + hash: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The upload link where to upload the tar file */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateBuildFileUpload'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all templates */ + get: { + parameters: { + query?: { + teamID?: string + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all templates */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Template'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** + * @deprecated + * @description Create a new template + */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequest'] + } + } + responses: { + /** @description The build was accepted */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateLegacy'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all builds for a template */ + get: { + parameters: { + query?: { + /** @description Cursor to start the list from */ + nextToken?: components['parameters']['paginationNextToken'] + /** @description Maximum number of items to return per page */ + limit?: components['parameters']['paginationLimit'] + } + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template with its builds */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateWithBuilds'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** + * @deprecated + * @description Rebuild an template + */ + post: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequest'] + } + } + responses: { + /** @description The build was accepted */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateLegacy'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + /** @description Delete a template */ + delete: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The template was deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + /** + * @deprecated + * @description Update template + */ + patch: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateUpdateRequest'] + } + } + responses: { + /** @description The template was updated successfully */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + trace?: never + } + '/templates/{templateID}/builds/{buildID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * @deprecated + * @description Start the build + */ + post: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The build has started */ + 202: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/templates/{templateID}/builds/{buildID}': { parameters: { - templateID: string; - buildID: string; - sandboxID: string; - teamID: string; - nodeID: string; - apiKeyID: string; - accessTokenID: string; - tag: string; - /** @description Maximum number of items to return per page */ - paginationLimit: number; - /** @description Cursor to start the list from */ - paginationNextToken: string; - }; - requestBodies: never; - headers: never; - pathItems: never; + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Start the build */ + post: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildStartV2'] + } + } + responses: { + /** @description The build has started */ + 202: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/templates/{templateID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + delete?: never + options?: never + head?: never + /** @description Update template */ + patch: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateUpdateRequest'] + } + } + responses: { + /** @description The template was updated successfully */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateUpdateResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + trace?: never + } + '/templates/{templateID}/builds/{buildID}/status': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get template build info */ + get: { + parameters: { + query?: { + /** @description Index of the starting build log that should be returned with the template */ + logsOffset?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + level?: components['schemas']['LogLevel'] + } + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateBuildInfo'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/builds/{buildID}/logs': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get template build logs */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + cursor?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + direction?: components['schemas']['LogsDirection'] + level?: components['schemas']['LogLevel'] + /** @description Source of the logs that should be returned from */ + source?: components['schemas']['LogsSource'] + } + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template build logs */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateBuildLogsResponse'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/tags': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Assign tag(s) to a template build */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AssignTemplateTagsRequest'] + } + } + responses: { + /** @description Tag assigned successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AssignedTemplateTags'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + /** @description Delete multiple tags from templates */ + delete: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['DeleteTemplateTagsRequest'] + } + } + responses: { + /** @description Tags deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/aliases/{alias}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Check if template with given alias exists */ + get: { + parameters: { + query?: never + header?: never + path: { + alias: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully queried template by alias */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateAliasResponse'] + } + } + 400: components['responses']['400'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/nodes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all nodes */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all nodes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Node'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/nodes/{nodeID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get node info */ + get: { + parameters: { + query?: { + /** @description Identifier of the cluster */ + clusterID?: string + } + header?: never + path: { + nodeID: components['parameters']['nodeID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the node */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['NodeDetail'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Change status of a node */ + post: { + parameters: { + query?: never + header?: never + path: { + nodeID: components['parameters']['nodeID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': components['schemas']['NodeStatusChange'] + } + } + responses: { + /** @description The node status was changed successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/teams/{teamID}/sandboxes/kill': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * Kill all sandboxes for a team + * @description Kills all sandboxes for the specified team + */ + post: { + parameters: { + query?: never + header?: never + path: { + /** @description Team ID */ + teamID: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully killed sandboxes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AdminSandboxKillResult'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/access-tokens': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Create a new access token */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewAccessToken'] + } + } + responses: { + /** @description Access token created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['CreatedAccessToken'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/access-tokens/{accessTokenID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + /** @description Delete an access token */ + delete: { + parameters: { + query?: never + header?: never + path: { + accessTokenID: components['parameters']['accessTokenID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Access token deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/api-keys': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all team API keys */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all team API keys */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamAPIKey'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Create a new team API key */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewTeamAPIKey'] + } + } + responses: { + /** @description Team API key created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['CreatedTeamAPIKey'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/api-keys/{apiKeyID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + /** @description Delete a team API key */ + delete: { + parameters: { + query?: never + header?: never + path: { + apiKeyID: components['parameters']['apiKeyID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Team API key deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + /** @description Update a team API key */ + patch: { + parameters: { + query?: never + header?: never + path: { + apiKeyID: components['parameters']['apiKeyID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['UpdateTeamAPIKey'] + } + } + responses: { + /** @description Team API key updated successfully */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + trace?: never + } +} +export type webhooks = Record +export interface components { + schemas: { + Team: { + /** @description Identifier of the team */ + teamID: string + /** @description Name of the team */ + name: string + /** @description API key for the team */ + apiKey: string + /** @description Whether the team is the default team */ + isDefault: boolean + } + TeamUser: { + /** + * Format: uuid + * @description Identifier of the user + */ + id: string + /** @description Email of the user */ + email: string + } + TemplateUpdateRequest: { + /** @description Whether the template is public or only accessible by the team */ + public?: boolean + } + TemplateUpdateResponse: { + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[] + } + /** + * Format: int32 + * @description CPU cores for the sandbox + */ + CPUCount: number + /** + * Format: int32 + * @description Memory for the sandbox in MiB + */ + MemoryMB: number + /** + * Format: int32 + * @description Disk size for the sandbox in MiB + */ + DiskSizeMB: number + /** @description Version of the envd running in the sandbox */ + EnvdVersion: string + SandboxMetadata: { + [key: string]: string + } + /** + * @description State of the sandbox + * @enum {string} + */ + SandboxState: 'running' | 'paused' + EnvVars: { + [key: string]: string + } + /** @description MCP configuration for the sandbox */ + Mcp: { + [key: string]: unknown + } | null + SandboxNetworkConfig: { + /** + * @description Specify if the sandbox URLs should be accessible only with authentication. + * @default true + */ + allowPublicTraffic: boolean + /** @description List of allowed CIDR blocks or IP addresses for egress traffic. Allowed addresses always take precedence over blocked addresses. */ + allowOut?: string[] + /** @description List of denied CIDR blocks or IP addresses for egress traffic */ + denyOut?: string[] + /** @description Specify host mask which will be used for all sandbox requests */ + maskRequestHost?: string + } + /** @description Log entry with timestamp and line */ + SandboxLog: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string + /** @description Log line content */ + line: string + } + SandboxLogEntry: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string + /** @description Log message content */ + message: string + level: components['schemas']['LogLevel'] + fields: { + [key: string]: string + } + } + SandboxLogs: { + /** @description Logs of the sandbox */ + logs: components['schemas']['SandboxLog'][] + /** @description Structured logs of the sandbox */ + logEntries: components['schemas']['SandboxLogEntry'][] + } + /** @description Metric entry with timestamp and line */ + SandboxMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number + /** + * Format: int32 + * @description Number of CPU cores + */ + cpuCount: number + /** + * Format: float + * @description CPU usage percentage + */ + cpuUsedPct: number + /** + * Format: int64 + * @description Memory used in bytes + */ + memUsed: number + /** + * Format: int64 + * @description Total memory in bytes + */ + memTotal: number + /** + * Format: int64 + * @description Disk used in bytes + */ + diskUsed: number + /** + * Format: int64 + * @description Total disk space in bytes + */ + diskTotal: number + } + Sandbox: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** @description Alias of the template */ + alias?: string + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string + envdVersion: components['schemas']['EnvdVersion'] + /** @description Access token used for envd communication */ + envdAccessToken?: string + /** @description Token required for accessing sandbox via proxy. */ + trafficAccessToken?: string | null + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null + } + SandboxDetail: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Alias of the template */ + alias?: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string + /** + * Format: date-time + * @description Time when the sandbox will expire + */ + endAt: string + envdVersion: components['schemas']['EnvdVersion'] + /** @description Access token used for envd communication */ + envdAccessToken?: string + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + metadata?: components['schemas']['SandboxMetadata'] + state: components['schemas']['SandboxState'] + } + ListedSandbox: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Alias of the template */ + alias?: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string + /** + * Format: date-time + * @description Time when the sandbox will expire + */ + endAt: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + metadata?: components['schemas']['SandboxMetadata'] + state: components['schemas']['SandboxState'] + envdVersion: components['schemas']['EnvdVersion'] + } + SandboxesWithMetrics: { + sandboxes: { + [key: string]: components['schemas']['SandboxMetric'] + } + } + NewSandbox: { + /** @description Identifier of the required template */ + templateID: string + /** + * Format: int32 + * @description Time to live for the sandbox in seconds. + * @default 15 + */ + timeout: number + /** + * @description Automatically pauses the sandbox after the timeout + * @default false + */ + autoPause: boolean + /** @description Secure all system communication with sandbox */ + secure?: boolean + /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ + allow_internet_access?: boolean + network?: components['schemas']['SandboxNetworkConfig'] + metadata?: components['schemas']['SandboxMetadata'] + envVars?: components['schemas']['EnvVars'] + mcp?: components['schemas']['Mcp'] + } + ResumedSandbox: { + /** + * Format: int32 + * @description Time to live for the sandbox in seconds. + * @default 15 + */ + timeout: number + /** + * @deprecated + * @description Automatically pauses the sandbox after the timeout + */ + autoPause?: boolean + } + ConnectSandbox: { + /** + * Format: int32 + * @description Timeout in seconds from the current time after which the sandbox should expire + */ + timeout: number + } + /** @description Team metric with timestamp */ + TeamMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number + /** + * Format: int32 + * @description The number of concurrent sandboxes for the team + */ + concurrentSandboxes: number + /** + * Format: float + * @description Number of sandboxes started per second + */ + sandboxStartRate: number + } + /** @description Team metric with timestamp */ + MaxTeamMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number + /** @description The maximum value of the requested metric in the given interval */ + value: number + } + AdminSandboxKillResult: { + /** @description Number of sandboxes successfully killed */ + killedCount: number + /** @description Number of sandboxes that failed to kill */ + failedCount: number + } + Template: { + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the last successful build for given template */ + buildID: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[] + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[] + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string + createdBy: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number + /** + * Format: int32 + * @description Number of times the template was built + */ + buildCount: number + envdVersion: components['schemas']['EnvdVersion'] + buildStatus: components['schemas']['TemplateBuildStatus'] + } + TemplateRequestResponseV3: { + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the last successful build for given template */ + buildID: string + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** @description Names of the template */ + names: string[] + /** @description Tags assigned to the template build */ + tags: string[] + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[] + } + TemplateLegacy: { + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the last successful build for given template */ + buildID: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** @description Aliases of the template */ + aliases: string[] + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string + createdBy: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number + /** + * Format: int32 + * @description Number of times the template was built + */ + buildCount: number + envdVersion: components['schemas']['EnvdVersion'] + } + TemplateBuild: { + /** + * Format: uuid + * @description Identifier of the build + */ + buildID: string + status: components['schemas']['TemplateBuildStatus'] + /** + * Format: date-time + * @description Time when the build was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the build was last updated + */ + updatedAt: string + /** + * Format: date-time + * @description Time when the build was finished + */ + finishedAt?: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB?: components['schemas']['DiskSizeMB'] + envdVersion?: components['schemas']['EnvdVersion'] + } + TemplateWithBuilds: { + /** @description Identifier of the template */ + templateID: string + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[] + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[] + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number + /** @description List of builds for the template */ + builds: components['schemas']['TemplateBuild'][] + } + TemplateAliasResponse: { + /** @description Identifier of the template */ + templateID: string + /** @description Whether the template is public or only accessible by the team */ + public: boolean + } + TemplateBuildRequest: { + /** @description Alias of the template */ + alias?: string + /** @description Dockerfile for the template */ + dockerfile: string + /** @description Identifier of the team */ + teamID?: string + /** @description Start command to execute in the template after the build */ + startCmd?: string + /** @description Ready check command to execute in the template after the build */ + readyCmd?: string + cpuCount?: components['schemas']['CPUCount'] + memoryMB?: components['schemas']['MemoryMB'] + } + /** @description Step in the template build process */ + TemplateStep: { + /** @description Type of the step */ + type: string + /** + * @description Arguments for the step + * @default [] + */ + args: string[] + /** @description Hash of the files used in the step */ + filesHash?: string + /** + * @description Whether the step should be forced to run regardless of the cache + * @default false + */ + force: boolean + } + TemplateBuildRequestV3: { + /** @description Name of the template. Can include a tag with colon separator (e.g. "my-template" or "my-template:v1"). If tag is included, it will be treated as if the tag was provided in the tags array. */ + name?: string + /** @description Tags to assign to the template build */ + tags?: string[] + /** + * @deprecated + * @description Alias of the template. Deprecated, use name instead. + */ + alias?: string + /** + * @deprecated + * @description Identifier of the team + */ + teamID?: string + cpuCount?: components['schemas']['CPUCount'] + memoryMB?: components['schemas']['MemoryMB'] + } + TemplateBuildRequestV2: { + /** @description Alias of the template */ + alias: string + /** + * @deprecated + * @description Identifier of the team + */ + teamID?: string + cpuCount?: components['schemas']['CPUCount'] + memoryMB?: components['schemas']['MemoryMB'] + } + FromImageRegistry: + | components['schemas']['AWSRegistry'] + | components['schemas']['GCPRegistry'] + | components['schemas']['GeneralRegistry'] + AWSRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: 'aws' + /** @description AWS Access Key ID for ECR authentication */ + awsAccessKeyId: string + /** @description AWS Secret Access Key for ECR authentication */ + awsSecretAccessKey: string + /** @description AWS Region where the ECR registry is located */ + awsRegion: string + } + GCPRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: 'gcp' + /** @description Service Account JSON for GCP authentication */ + serviceAccountJson: string + } + GeneralRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: 'registry' + /** @description Username to use for the registry */ + username: string + /** @description Password to use for the registry */ + password: string + } + TemplateBuildStartV2: { + /** @description Image to use as a base for the template build */ + fromImage?: string + /** @description Template to use as a base for the template build */ + fromTemplate?: string + fromImageRegistry?: components['schemas']['FromImageRegistry'] + /** + * @description Whether the whole build should be forced to run regardless of the cache + * @default false + */ + force: boolean + /** + * @description List of steps to execute in the template build + * @default [] + */ + steps: components['schemas']['TemplateStep'][] + /** @description Start command to execute in the template after the build */ + startCmd?: string + /** @description Ready check command to execute in the template after the build */ + readyCmd?: string + } + TemplateBuildFileUpload: { + /** @description Whether the file is already present in the cache */ + present: boolean + /** @description Url where the file should be uploaded to */ + url?: string + } + /** + * @description State of the sandbox + * @enum {string} + */ + LogLevel: 'debug' | 'info' | 'warn' | 'error' + BuildLogEntry: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string + /** @description Log message content */ + message: string + level: components['schemas']['LogLevel'] + /** @description Step in the build process related to the log entry */ + step?: string + } + BuildStatusReason: { + /** @description Message with the status reason, currently reporting only for error status */ + message: string + /** @description Step that failed */ + step?: string + /** + * @description Log entries related to the status reason + * @default [] + */ + logEntries: components['schemas']['BuildLogEntry'][] + } + /** + * @description Status of the template build + * @enum {string} + */ + TemplateBuildStatus: 'building' | 'waiting' | 'ready' | 'error' + TemplateBuildInfo: { + /** + * @description Build logs + * @default [] + */ + logs: string[] + /** + * @description Build logs structured + * @default [] + */ + logEntries: components['schemas']['BuildLogEntry'][] + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the build */ + buildID: string + status: components['schemas']['TemplateBuildStatus'] + reason?: components['schemas']['BuildStatusReason'] + } + TemplateBuildLogsResponse: { + /** + * @description Build logs structured + * @default [] + */ + logs: components['schemas']['BuildLogEntry'][] + } + /** + * @description Direction of the logs that should be returned + * @enum {string} + */ + LogsDirection: 'forward' | 'backward' + /** + * @description Source of the logs that should be returned + * @enum {string} + */ + LogsSource: 'temporary' | 'persistent' + /** + * @description Status of the node + * @enum {string} + */ + NodeStatus: 'ready' | 'draining' | 'connecting' | 'unhealthy' + NodeStatusChange: { + /** + * Format: uuid + * @description Identifier of the cluster + */ + clusterID?: string + status: components['schemas']['NodeStatus'] + } + DiskMetrics: { + /** @description Mount point of the disk */ + mountPoint: string + /** @description Device name */ + device: string + /** @description Filesystem type (e.g., ext4, xfs) */ + filesystemType: string + /** + * Format: uint64 + * @description Used space in bytes + */ + usedBytes: number + /** + * Format: uint64 + * @description Total space in bytes + */ + totalBytes: number + } + /** @description Node metrics */ + NodeMetrics: { + /** + * Format: uint32 + * @description Number of allocated CPU cores + */ + allocatedCPU: number + /** + * Format: uint32 + * @description Node CPU usage percentage + */ + cpuPercent: number + /** + * Format: uint32 + * @description Total number of CPU cores on the node + */ + cpuCount: number + /** + * Format: uint64 + * @description Amount of allocated memory in bytes + */ + allocatedMemoryBytes: number + /** + * Format: uint64 + * @description Node memory used in bytes + */ + memoryUsedBytes: number + /** + * Format: uint64 + * @description Total node memory in bytes + */ + memoryTotalBytes: number + /** @description Detailed metrics for each disk/mount point */ + disks: components['schemas']['DiskMetrics'][] + } + MachineInfo: { + /** @description CPU family of the node */ + cpuFamily: string + /** @description CPU model of the node */ + cpuModel: string + /** @description CPU model name of the node */ + cpuModelName: string + /** @description CPU architecture of the node */ + cpuArchitecture: string + } + Node: { + /** @description Version of the orchestrator */ + version: string + /** @description Commit of the orchestrator */ + commit: string + /** + * @deprecated + * @description Identifier of the nomad node + */ + nodeID: string + /** @description Identifier of the node */ + id: string + /** @description Service instance identifier of the node */ + serviceInstanceID: string + /** @description Identifier of the cluster */ + clusterID: string + machineInfo: components['schemas']['MachineInfo'] + status: components['schemas']['NodeStatus'] + /** + * Format: uint32 + * @description Number of sandboxes running on the node + */ + sandboxCount: number + metrics: components['schemas']['NodeMetrics'] + /** + * Format: uint64 + * @description Number of sandbox create successes + */ + createSuccesses: number + /** + * Format: uint64 + * @description Number of sandbox create fails + */ + createFails: number + /** + * Format: int + * @description Number of starting Sandboxes + */ + sandboxStartingCount: number + } + NodeDetail: { + /** @description Identifier of the cluster */ + clusterID: string + /** @description Version of the orchestrator */ + version: string + /** @description Commit of the orchestrator */ + commit: string + /** @description Identifier of the node */ + id: string + /** @description Service instance identifier of the node */ + serviceInstanceID: string + /** + * @deprecated + * @description Identifier of the nomad node + */ + nodeID: string + machineInfo: components['schemas']['MachineInfo'] + status: components['schemas']['NodeStatus'] + /** @description List of sandboxes running on the node */ + sandboxes: components['schemas']['ListedSandbox'][] + metrics: components['schemas']['NodeMetrics'] + /** @description List of cached builds id on the node */ + cachedBuilds: string[] + /** + * Format: uint64 + * @description Number of sandbox create successes + */ + createSuccesses: number + /** + * Format: uint64 + * @description Number of sandbox create fails + */ + createFails: number + } + CreatedAccessToken: { + /** + * Format: uuid + * @description Identifier of the access token + */ + id: string + /** @description Name of the access token */ + name: string + /** @description The fully created access token */ + token: string + mask: components['schemas']['IdentifierMaskingDetails'] + /** + * Format: date-time + * @description Timestamp of access token creation + */ + createdAt: string + } + NewAccessToken: { + /** @description Name of the access token */ + name: string + } + TeamAPIKey: { + /** + * Format: uuid + * @description Identifier of the API key + */ + id: string + /** @description Name of the API key */ + name: string + mask: components['schemas']['IdentifierMaskingDetails'] + /** + * Format: date-time + * @description Timestamp of API key creation + */ + createdAt: string + createdBy?: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Last time this API key was used + */ + lastUsed?: string | null + } + CreatedTeamAPIKey: { + /** + * Format: uuid + * @description Identifier of the API key + */ + id: string + /** @description Raw value of the API key */ + key: string + mask: components['schemas']['IdentifierMaskingDetails'] + /** @description Name of the API key */ + name: string + /** + * Format: date-time + * @description Timestamp of API key creation + */ + createdAt: string + createdBy?: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Last time this API key was used + */ + lastUsed?: string | null + } + NewTeamAPIKey: { + /** @description Name of the API key */ + name: string + } + UpdateTeamAPIKey: { + /** @description New name for the API key */ + name: string + } + AssignedTemplateTags: { + /** @description Assigned tags of the template */ + tags: string[] + /** + * Format: uuid + * @description Identifier of the build associated with these tags + */ + buildID: string + } + AssignTemplateTagsRequest: { + /** @description Target template in "name:tag" format */ + target: string + /** @description Tags to assign to the template */ + tags: string[] + } + DeleteTemplateTagsRequest: { + /** @description Name of the template */ + name: string + /** @description Tags to delete */ + tags: string[] + } + Error: { + /** + * Format: int32 + * @description Error code + */ + code: number + /** @description Error */ + message: string + } + IdentifierMaskingDetails: { + /** @description Prefix that identifies the token or key type */ + prefix: string + /** @description Length of the token or key */ + valueLength: number + /** @description Prefix used in masked version of the token or key */ + maskedValuePrefix: string + /** @description Suffix used in masked version of the token or key */ + maskedValueSuffix: string + } + } + responses: { + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Authentication error */ + 401: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Server error */ + 500: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + } + parameters: { + templateID: string + buildID: string + sandboxID: string + teamID: string + nodeID: string + apiKeyID: string + accessTokenID: string + tag: string + /** @description Maximum number of items to return per page */ + paginationLimit: number + /** @description Cursor to start the list from */ + paginationNextToken: string + } + requestBodies: never + headers: never + pathItems: never } -export type $defs = Record; -export type operations = Record; +export type $defs = Record +export type operations = Record diff --git a/src/ui/chart-placeholder.tsx b/src/ui/chart-placeholder.tsx index 54d4e2bc2..7581b8340 100644 --- a/src/ui/chart-placeholder.tsx +++ b/src/ui/chart-placeholder.tsx @@ -1,4 +1,4 @@ -"use client" +'use client' import { cn } from '@/lib/utils' import { diff --git a/src/ui/dashboard-tabs.tsx b/src/ui/dashboard-tabs.tsx index 306bcbffb..85cc9871c 100644 --- a/src/ui/dashboard-tabs.tsx +++ b/src/ui/dashboard-tabs.tsx @@ -4,7 +4,7 @@ import { cn } from '@/lib/utils' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/ui/primitives/tabs' import Link from 'next/link' import { usePathname, useSearchParams } from 'next/navigation' -import { memo, ReactElement, ReactNode, useCallback, useMemo } from 'react' +import { ReactElement, ReactNode, memo, useCallback, useMemo } from 'react' type DashboardTabElement = ReactElement diff --git a/src/ui/data-table.tsx b/src/ui/data-table.tsx index 95d11304b..f26402b35 100644 --- a/src/ui/data-table.tsx +++ b/src/ui/data-table.tsx @@ -40,7 +40,9 @@ function DataTableHead({ 'relative flex h-8 items-center align-middle group', 'font-mono uppercase', '[&:has([role=checkbox])]:pr-0', - sorting !== undefined ? 'prose-label-highlight text-fg' : 'prose-label text-fg-tertiary', + sorting !== undefined + ? 'prose-label-highlight text-fg' + : 'prose-label text-fg-tertiary', className )} style={{ @@ -62,10 +64,12 @@ function DataTableHead({ > {children} {canSort && ( -
+
{sorting === undefined ? ( // Show the arrow for the next state based on sortDescFirst header.column.columnDef.sortDescFirst ? ( @@ -94,7 +98,10 @@ function DataTableHead({ e.stopPropagation() }} > - +
)}
diff --git a/src/ui/docs-tabs.tsx b/src/ui/docs-tabs.tsx index f585772ce..bea8ab20b 100644 --- a/src/ui/docs-tabs.tsx +++ b/src/ui/docs-tabs.tsx @@ -78,7 +78,6 @@ export function Tabs({ const [value, setValue] = useState(values[defaultIndex]) const valueToIdMap = useMemo(() => new Map(), []) - // eslint-disable-next-line react-hooks/exhaustive-deps -- re-reconstruct the collection if items changed const collection = useMemo(() => createCollection(), [items]) const onChange: ChangeListener = (v) => { @@ -184,10 +183,7 @@ export type TabProps = Omit & { export function Tab({ value, className, ...props }: TabProps) { const ctx = useContext(TabsContext) - const resolvedValue = - value ?? - // eslint-disable-next-line react-hooks/rules-of-hooks -- `value` is not supposed to change - ctx?.items.at(useCollectionIndex()) + const resolvedValue = value ?? ctx?.items.at(useCollectionIndex()) if (!resolvedValue) throw new Error( 'Failed to resolve tab `value`, please pass a `value` prop to the Tab component.' @@ -243,12 +239,10 @@ function useCollectionIndex() { // re-order the item to the bottom if registered unregister() register() - // eslint-disable-next-line -- register }, [list]) useEffect(() => { return unregister - // eslint-disable-next-line -- clean up only }, []) return list.indexOf(key) diff --git a/src/ui/primitives/alert.tsx b/src/ui/primitives/alert.tsx index 9d7435e7a..388897266 100644 --- a/src/ui/primitives/alert.tsx +++ b/src/ui/primitives/alert.tsx @@ -1,5 +1,5 @@ import { cn } from '@/lib/utils' -import { cva, type VariantProps } from 'class-variance-authority' +import { type VariantProps, cva } from 'class-variance-authority' import * as React from 'react' const alertVariants = cva( diff --git a/src/ui/primitives/badge.tsx b/src/ui/primitives/badge.tsx index ae1764996..ba5492dd8 100644 --- a/src/ui/primitives/badge.tsx +++ b/src/ui/primitives/badge.tsx @@ -1,6 +1,6 @@ import { cn } from '@/lib/utils/index' import { Slot } from '@radix-ui/react-slot' -import { cva, type VariantProps } from 'class-variance-authority' +import { type VariantProps, cva } from 'class-variance-authority' import * as React from 'react' const badgeVariants = cva( diff --git a/src/ui/primitives/button.tsx b/src/ui/primitives/button.tsx index cd5446869..17b849f4b 100644 --- a/src/ui/primitives/button.tsx +++ b/src/ui/primitives/button.tsx @@ -1,6 +1,6 @@ import { cn } from '@/lib/utils/index' import { Slot } from '@radix-ui/react-slot' -import { cva, type VariantProps } from 'class-variance-authority' +import { type VariantProps, cva } from 'class-variance-authority' import * as React from 'react' import { Loader } from './loader_d' diff --git a/src/ui/primitives/card.tsx b/src/ui/primitives/card.tsx index fcb335b00..3b1fa2ade 100644 --- a/src/ui/primitives/card.tsx +++ b/src/ui/primitives/card.tsx @@ -1,5 +1,5 @@ import { cn } from '@/lib/utils' -import { cva, VariantProps } from 'class-variance-authority' +import { VariantProps, cva } from 'class-variance-authority' import * as React from 'react' export const cardVariants = cva('', { @@ -60,7 +60,11 @@ const CardDescription = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( -

+

)) CardDescription.displayName = 'CardDescription' diff --git a/src/ui/primitives/command.tsx b/src/ui/primitives/command.tsx index 45690f6ae..78a2928ad 100644 --- a/src/ui/primitives/command.tsx +++ b/src/ui/primitives/command.tsx @@ -1,6 +1,6 @@ 'use client' -import { DialogTitle, type DialogProps } from '@radix-ui/react-dialog' +import { type DialogProps, DialogTitle } from '@radix-ui/react-dialog' import { Command as CommandPrimitive } from 'cmdk' import { Search } from 'lucide-react' import * as React from 'react' diff --git a/src/ui/primitives/sheet.tsx b/src/ui/primitives/sheet.tsx index 895c3ae57..189e90344 100644 --- a/src/ui/primitives/sheet.tsx +++ b/src/ui/primitives/sheet.tsx @@ -1,7 +1,7 @@ 'use client' import * as SheetPrimitive from '@radix-ui/react-dialog' -import { cva, type VariantProps } from 'class-variance-authority' +import { type VariantProps, cva } from 'class-variance-authority' import { X } from 'lucide-react' import * as React from 'react' diff --git a/src/ui/primitives/toast.tsx b/src/ui/primitives/toast.tsx index 82dad21aa..48aa2046c 100644 --- a/src/ui/primitives/toast.tsx +++ b/src/ui/primitives/toast.tsx @@ -1,7 +1,7 @@ 'use client' import * as ToastPrimitives from '@radix-ui/react-toast' -import { cva, type VariantProps } from 'class-variance-authority' +import { type VariantProps, cva } from 'class-variance-authority' import { X } from 'lucide-react' import * as React from 'react' diff --git a/src/ui/survey.tsx b/src/ui/survey.tsx index effebf583..80f5c3c11 100644 --- a/src/ui/survey.tsx +++ b/src/ui/survey.tsx @@ -163,13 +163,9 @@ export function SurveyContent({ return (

- - {currentQuestion?.question} - + {currentQuestion?.question} {currentQuestion?.description && ( - - {currentQuestion?.description} - + {currentQuestion?.description} )} diff --git a/src/ui/time-input.tsx b/src/ui/time-input.tsx index 7993fcc32..0298ca367 100644 --- a/src/ui/time-input.tsx +++ b/src/ui/time-input.tsx @@ -183,85 +183,85 @@ export const TimeInput = memo(function TimeInput({ {!hideTime && ( -
- setDisplayTime(e.target.value)} - onBlur={() => onTimeChange(displayTime)} - placeholder="HH:MM:SS" - disabled={disabled} - className={cn( - 'pr-10 h-10 w-full bg-transparent', - 'placeholder:prose-label' - )} - /> -
- - {getTimezoneIdentifier()} - +
+ setDisplayTime(e.target.value)} + onBlur={() => onTimeChange(displayTime)} + placeholder="HH:MM:SS" + disabled={disabled} + className={cn( + 'pr-10 h-10 w-full bg-transparent', + 'placeholder:prose-label' + )} + /> +
+ + {getTimezoneIdentifier()} + - - - -
-
- -
-
- Hours - handleTimeChange('hours', value)} - min={0} - max={23} - step={1} - disabled={disabled} - inputClassName="h-8 w-11 text-center border-r-0" - buttonClassName="h-[1rem]" - /> -
-
- Minutes - handleTimeChange('minutes', value)} - min={0} - max={59} - step={1} - disabled={disabled} - inputClassName="h-8 w-11 text-center border-r-0" - buttonClassName="h-[1rem]" - /> -
-
- Seconds - handleTimeChange('seconds', value)} - min={0} - max={59} - step={1} - disabled={disabled} - inputClassName="h-8 w-11 text-center" - buttonClassName="h-[1rem]" - /> + + +
-
- + +
+
+ Hours + handleTimeChange('hours', value)} + min={0} + max={23} + step={1} + disabled={disabled} + inputClassName="h-8 w-11 text-center border-r-0" + buttonClassName="h-[1rem]" + /> +
+
+ Minutes + handleTimeChange('minutes', value)} + min={0} + max={59} + step={1} + disabled={disabled} + inputClassName="h-8 w-11 text-center border-r-0" + buttonClassName="h-[1rem]" + /> +
+
+ Seconds + handleTimeChange('seconds', value)} + min={0} + max={59} + step={1} + disabled={disabled} + inputClassName="h-8 w-11 text-center" + buttonClassName="h-[1rem]" + /> +
+
+
+ )}
) From 225c876f9d7a147681b9cb1dfcb945a6e87a7dfc Mon Sep 17 00:00:00 2001 From: ben-fornefeld Date: Fri, 27 Feb 2026 11:21:45 -0800 Subject: [PATCH 2/7] update biome migration commit with current lint/format state Replace the previous biome migration commit with the current workspace changes, keeping the updated biome and package configuration and reapplying safe formatting/lint fixes. Made-with: Cursor --- biome.json | 55 ++++++++++- bun.lock | 20 ++-- package.json | 5 +- src/__test__/integration/auth.test.ts | 4 +- .../integration/dashboard-route.test.ts | 2 +- src/__test__/integration/proxy.test.ts | 4 +- .../integration/resolve-user-team.test.ts | 2 +- src/__test__/unit/chart-utils.test.ts | 4 +- .../unit/fill-metrics-with-zeros.test.ts | 2 +- src/__test__/unit/formatting.test.ts | 4 +- src/__test__/unit/team-metrics-step.test.ts | 2 +- src/app/(auth)/auth/cli/page.tsx | 8 +- src/app/(auth)/confirm/page.tsx | 6 +- src/app/(auth)/forgot-password/page.tsx | 14 +-- src/app/(auth)/sign-in/page.tsx | 14 +-- src/app/(auth)/sign-up/page.tsx | 16 +-- src/app/(rewrites)/[[...slug]]/not-found.tsx | 2 +- src/app/(rewrites)/[[...slug]]/route.ts | 4 +- src/app/(rewrites)/not-found/page.tsx | 2 +- src/app/api/auth/callback/route.ts | 4 +- src/app/api/auth/confirm/route.ts | 6 +- src/app/api/auth/email-callback/route.tsx | 2 +- src/app/api/auth/verify-otp/route.ts | 4 +- src/app/api/health/route.ts | 4 +- src/app/api/sandbox/details/polling/route.ts | 2 +- src/app/api/sandbox/details/route.ts | 2 +- .../api/sandbox/inspect/root-path/route.ts | 2 +- src/app/api/sidebar/state/route.ts | 2 +- src/app/api/team/state/route.ts | 2 +- src/app/api/teams/[teamId]/metrics/route.ts | 4 +- src/app/api/teams/[teamId]/metrics/types.ts | 4 +- .../teams/[teamId]/sandboxes/metrics/route.ts | 2 +- .../teams/[teamId]/sandboxes/metrics/types.ts | 2 +- src/app/api/teams/user/route.ts | 2 +- src/app/api/teams/user/types.ts | 2 +- src/app/api/trpc/[trpc]/route.ts | 2 +- src/app/body.tsx | 4 +- .../inspect/sandbox/[sandboxId]/route.ts | 6 +- .../dashboard/[teamIdOrSlug]/keys/page.tsx | 2 +- src/app/dashboard/[teamIdOrSlug]/layout.tsx | 8 +- .../sandboxes/(tabs)/@list/page.tsx | 2 +- .../sandboxes/[sandboxId]/inspect/page.tsx | 2 +- .../templates/(tabs)/@list/page.tsx | 2 +- .../[templateId]/builds/[buildId]/page.tsx | 6 +- .../[teamIdOrSlug]/webhooks/page.tsx | 4 +- src/app/dashboard/account/route.ts | 2 +- src/app/dashboard/error.tsx | 2 +- src/app/dashboard/route.ts | 2 +- src/app/dashboard/unauthorized.tsx | 4 +- src/app/error.tsx | 2 +- src/app/layout.tsx | 8 +- src/app/not-found.tsx | 2 +- src/app/robots.ts | 2 +- src/app/sbx/new/route.ts | 6 +- src/app/sitemap.ts | 6 +- src/configs/cookies.ts | 2 +- src/configs/docs.ts | 2 +- src/configs/layout.ts | 2 +- src/configs/mock-data.ts | 10 +- src/configs/rewrites.ts | 3 +- src/configs/shiki.ts | 7 +- src/configs/sidebar.ts | 6 +- src/features/auth/form-message.tsx | 4 +- src/features/auth/oauth-provider-buttons.tsx | 4 +- src/features/auth/turnstile-widget.tsx | 4 +- src/features/client-providers.tsx | 4 +- .../dashboard/account/email-settings.tsx | 12 +-- .../dashboard/account/name-settings.tsx | 8 +- .../account/password-settings-server.tsx | 2 +- .../dashboard/account/password-settings.tsx | 10 +- .../dashboard/account/user-access-token.tsx | 6 +- src/features/dashboard/billing/addons.tsx | 8 +- .../concurrent-sandboxes-addon-dialog.tsx | 28 +++--- src/features/dashboard/billing/hooks.ts | 6 +- src/features/dashboard/billing/invoices.tsx | 2 +- .../dashboard/billing/select-plan.tsx | 6 +- .../dashboard/billing/selected-plan.tsx | 10 +- src/features/dashboard/billing/types.ts | 4 +- src/features/dashboard/billing/utils.ts | 4 +- .../dashboard/build/build-logs-store.ts | 4 +- src/features/dashboard/build/header-cells.tsx | 6 +- src/features/dashboard/build/header.tsx | 2 +- src/features/dashboard/build/logs-cells.tsx | 8 +- .../dashboard/build/logs-filter-params.ts | 2 +- src/features/dashboard/build/logs.tsx | 28 +++--- .../dashboard/build/use-build-logs.ts | 6 +- .../dashboard/build/use-log-filters.ts | 5 +- src/features/dashboard/common/empty-frame.tsx | 2 +- .../dashboard/common/resource-usage.tsx | 2 +- src/features/dashboard/context.tsx | 6 +- .../dashboard/dashboard-title-provider.tsx | 2 +- .../dashboard/layouts/details-row.tsx | 2 +- src/features/dashboard/layouts/footer.tsx | 2 +- src/features/dashboard/layouts/header.tsx | 8 +- .../layouts/status-indicator.server.tsx | 4 +- src/features/dashboard/layouts/wrapper.tsx | 2 +- src/features/dashboard/limits/alert-card.tsx | 2 +- src/features/dashboard/limits/limit-card.tsx | 2 +- src/features/dashboard/limits/limit-form.tsx | 10 +- .../dashboard/limits/usage-limits.tsx | 2 +- .../dashboard/members/add-member-form.tsx | 8 +- .../dashboard/members/member-table-row.tsx | 8 +- .../dashboard/members/member-table.tsx | 2 +- .../navbar/dashboard-survey-popover.tsx | 8 +- .../dashboard/navbar/report-issue-popover.tsx | 8 +- src/features/dashboard/sandbox/context.tsx | 10 +- .../dashboard/sandbox/header/header.tsx | 6 +- .../dashboard/sandbox/header/kill-button.tsx | 6 +- .../dashboard/sandbox/header/metadata.tsx | 2 +- .../dashboard/sandbox/header/refresh.tsx | 4 +- .../sandbox/header/remaining-time.tsx | 6 +- .../sandbox/header/resource-usage-client.tsx | 2 +- .../dashboard/sandbox/header/status.tsx | 2 +- .../dashboard/sandbox/header/template-id.tsx | 2 +- .../dashboard/sandbox/inspect/context.tsx | 18 ++-- .../dashboard/sandbox/inspect/dir.tsx | 6 +- .../dashboard/sandbox/inspect/empty.tsx | 2 +- .../dashboard/sandbox/inspect/file.tsx | 4 +- .../sandbox/inspect/filesystem/store.ts | 8 +- .../dashboard/sandbox/inspect/frame.tsx | 4 +- .../sandbox/inspect/hooks/use-directory.ts | 2 +- .../sandbox/inspect/incompatible.tsx | 8 +- .../dashboard/sandbox/inspect/node-label.tsx | 2 +- .../dashboard/sandbox/inspect/not-found.tsx | 8 +- .../sandbox/inspect/parent-dir-item.tsx | 6 +- .../sandbox/inspect/root-path-input.tsx | 8 +- .../sandbox/inspect/sandbox-manager.ts | 14 +-- .../sandbox/inspect/stopped-banner.tsx | 6 +- .../dashboard/sandbox/inspect/view.tsx | 2 +- .../sandbox/inspect/viewer-header.tsx | 6 +- .../dashboard/sandbox/inspect/viewer.tsx | 8 +- src/features/dashboard/sandbox/layout.tsx | 2 +- .../dashboard/sandboxes/list/empty.tsx | 2 +- .../dashboard/sandboxes/list/header.tsx | 2 +- .../list/hooks/use-sandboxes-metrics.tsx | 4 +- .../sandboxes/list/stores/metrics-store.ts | 2 +- .../sandboxes/list/stores/table-store.ts | 4 +- .../dashboard/sandboxes/list/table-body.tsx | 4 +- .../dashboard/sandboxes/list/table-cells.tsx | 8 +- .../dashboard/sandboxes/list/table-config.tsx | 4 +- .../sandboxes/list/table-filters.tsx | 10 +- .../dashboard/sandboxes/list/table-row.tsx | 6 +- .../dashboard/sandboxes/list/table-search.tsx | 2 +- .../dashboard/sandboxes/list/table.tsx | 30 +++--- .../sandboxes/live-counter.client.tsx | 6 +- .../sandboxes/live-counter.server.tsx | 2 +- .../sandboxes/monitoring/charts-context.tsx | 10 +- .../charts/animated-metric-display.tsx | 2 +- .../sandboxes/monitoring/charts/charts.tsx | 2 +- .../components/time-range-selector.tsx | 2 +- .../charts/concurrent-chart/hooks.ts | 2 +- .../charts/concurrent-chart/index.tsx | 2 +- .../charts/startrate-chart/hooks.ts | 2 +- .../charts/startrate-chart/index.tsx | 2 +- .../charts/team-metrics-chart/constants.ts | 2 +- .../charts/team-metrics-chart/index.tsx | 12 ++- .../charts/team-metrics-chart/types.ts | 2 +- .../charts/team-metrics-chart/utils.ts | 2 +- .../sandboxes/monitoring/header.client.tsx | 8 +- .../dashboard/sandboxes/monitoring/header.tsx | 4 +- .../monitoring/hooks/use-recent-metrics.ts | 8 +- .../monitoring/hooks/use-timeframe.ts | 6 +- .../sandboxes/monitoring/time-picker/hooks.ts | 2 +- .../monitoring/time-picker/index.tsx | 2 +- .../monitoring/time-picker/time-panel.tsx | 2 +- .../monitoring/time-picker/validation.ts | 2 +- .../dashboard/settings/general/name-card.tsx | 6 +- .../settings/general/profile-picture-card.tsx | 8 +- .../settings/keys/create-api-key-dialog.tsx | 14 +-- .../dashboard/settings/keys/table-row.tsx | 10 +- .../dashboard/settings/keys/table.tsx | 2 +- .../webhooks/add-edit-dialog-steps.tsx | 10 +- .../settings/webhooks/add-edit-dialog.tsx | 10 +- .../settings/webhooks/delete-dialog.tsx | 6 +- .../settings/webhooks/edit-secret-dialog.tsx | 8 +- .../dashboard/settings/webhooks/table-row.tsx | 16 +-- .../dashboard/settings/webhooks/table.tsx | 2 +- .../dashboard/settings/webhooks/types.ts | 2 +- .../dashboard/sidebar/blocked-banner.tsx | 6 +- src/features/dashboard/sidebar/command.tsx | 6 +- src/features/dashboard/sidebar/content.tsx | 6 +- .../dashboard/sidebar/create-team-dialog.tsx | 6 +- src/features/dashboard/sidebar/footer.tsx | 4 +- src/features/dashboard/sidebar/item.tsx | 4 +- src/features/dashboard/sidebar/menu-teams.tsx | 12 +-- src/features/dashboard/sidebar/menu.tsx | 6 +- .../dashboard/sidebar/sidebar-mobile.tsx | 2 +- src/features/dashboard/sidebar/sidebar.tsx | 6 +- src/features/dashboard/sidebar/toggle.tsx | 4 +- .../dashboard/templates/builds/constants.ts | 2 +- .../dashboard/templates/builds/header.tsx | 2 +- .../templates/builds/table-cells.tsx | 6 +- .../dashboard/templates/builds/table.tsx | 16 +-- .../templates/builds/use-filters.tsx | 2 +- .../dashboard/templates/list/header.tsx | 6 +- .../templates/list/stores/table-store.ts | 4 +- .../dashboard/templates/list/table-body.tsx | 8 +- .../dashboard/templates/list/table-cells.tsx | 10 +- .../dashboard/templates/list/table-config.tsx | 8 +- .../templates/list/table-filters.tsx | 6 +- .../dashboard/templates/list/table-search.tsx | 2 +- .../dashboard/templates/list/table.tsx | 22 ++--- .../usage/compute-usage-chart/index.tsx | 8 +- .../usage/compute-usage-chart/types.ts | 2 +- src/features/dashboard/usage/constants.ts | 4 +- src/features/dashboard/usage/display-utils.ts | 2 +- .../dashboard/usage/sampling-utils.ts | 7 +- .../dashboard/usage/usage-charts-context.tsx | 8 +- .../dashboard/usage/usage-metric-chart.tsx | 6 +- .../usage/usage-time-range-controls.tsx | 4 +- src/features/general-analytics-collector.tsx | 2 +- src/features/posthog-provider.tsx | 6 +- src/lib/clients/action.ts | 12 +-- src/lib/clients/api.ts | 4 +- src/lib/clients/logger/logger.ts | 4 +- src/lib/clients/storage.ts | 2 +- src/lib/clients/supabase/admin.ts | 2 +- src/lib/clients/supabase/client.ts | 2 +- src/lib/clients/supabase/server.ts | 2 +- src/lib/hooks/use-column-size-vars.tsx | 2 +- src/lib/hooks/use-team.ts | 4 +- src/lib/hooks/use-toast.ts | 2 +- src/lib/hooks/use-user.ts | 2 +- src/lib/hooks/use-virtual-rows.ts | 6 +- src/lib/utils/auth.ts | 2 +- src/lib/utils/cookies.ts | 2 +- src/lib/utils/filesystem.ts | 3 +- src/lib/utils/index.ts | 2 +- src/lib/utils/redirects.ts | 5 +- src/lib/utils/rewrites.ts | 8 +- src/lib/utils/server.ts | 4 +- src/lib/utils/store.ts | 2 +- src/server/api/init.ts | 2 +- src/server/api/middlewares/auth.ts | 8 +- src/server/api/middlewares/telemetry.ts | 16 +-- src/server/api/models/builds.models.ts | 2 +- src/server/api/procedures.ts | 4 +- .../api/repositories/auth.repository.ts | 4 +- .../api/repositories/builds.repository.ts | 8 +- src/server/api/routers/billing.ts | 8 +- src/server/api/routers/builds.ts | 8 +- src/server/api/routers/sandboxes.ts | 4 +- src/server/api/routers/support.ts | 2 +- src/server/api/routers/templates.ts | 8 +- src/server/api/schemas/sandboxes.ts | 2 +- src/server/auth/auth-actions.ts | 8 +- src/server/auth/auth.types.ts | 2 +- .../auth/check-user-team-auth-cached.ts | 4 +- src/server/auth/get-default-team.ts | 2 +- src/server/auth/get-session.ts | 4 +- src/server/auth/get-user-by-token.ts | 2 +- src/server/auth/validate-email.ts | 4 +- src/server/keys/get-api-keys.ts | 4 +- src/server/keys/key-actions.ts | 4 +- src/server/proxy.ts | 2 +- src/server/sandboxes/get-sandbox-details.ts | 2 +- src/server/sandboxes/get-sandbox-root.ts | 4 +- src/server/sandboxes/get-team-metrics-core.ts | 6 +- src/server/sandboxes/get-team-metrics-max.ts | 2 +- src/server/sandboxes/get-team-metrics.ts | 2 +- src/server/sandboxes/sandbox-actions.ts | 4 +- src/server/sandboxes/utils.ts | 4 +- src/server/team/get-team-id-from-segment.ts | 8 +- src/server/team/get-team-limits-memo.ts | 4 +- src/server/team/get-team-limits.ts | 2 +- src/server/team/get-team-members.ts | 6 +- src/server/team/get-team-pure.ts | 2 +- src/server/team/get-team.ts | 2 +- src/server/team/get-user-teams.ts | 6 +- src/server/team/resolve-user-team.ts | 6 +- src/server/team/team-actions.ts | 16 +-- src/server/team/types.ts | 6 +- src/server/usage/get-usage.ts | 6 +- src/server/user/user-actions.ts | 6 +- src/server/webhooks/get-webhooks.ts | 2 +- src/server/webhooks/schema.ts | 2 +- src/server/webhooks/webhooks-actions.ts | 4 +- src/styles/theme.css | 98 +++++++++++++------ src/trpc/client.tsx | 4 +- src/trpc/query-client.ts | 2 +- src/trpc/server.tsx | 4 +- src/types/api.types.ts | 2 +- src/types/billing.types.ts | 2 +- src/types/dashboard.types.ts | 2 +- src/types/sandboxes.types.ts | 2 +- src/ui/alert-dialog.tsx | 2 +- src/ui/alert-popover.tsx | 2 +- src/ui/brand.tsx | 2 +- src/ui/chart-placeholder.tsx | 2 +- src/ui/client-only.tsx | 2 +- src/ui/code-block.tsx | 7 +- src/ui/copy-button-inline.tsx | 2 +- src/ui/copy-button.tsx | 6 +- src/ui/dashboard-tabs.tsx | 12 ++- src/ui/data-table.tsx | 14 +-- src/ui/docs-code-block.tsx | 5 +- src/ui/docs-tabs.tsx | 4 +- src/ui/drawer-css-provider.tsx | 2 +- src/ui/empty.tsx | 2 +- src/ui/error-indicator.tsx | 2 +- src/ui/error.tsx | 4 +- src/ui/external-icon.tsx | 2 +- src/ui/help-tooltip.tsx | 2 +- src/ui/hover-prefetch-link.tsx | 2 +- src/ui/icons.tsx | 6 +- src/ui/json-popover.tsx | 4 +- src/ui/live.tsx | 2 +- src/ui/not-found.tsx | 2 +- src/ui/number-input.tsx | 2 +- src/ui/polling-button.tsx | 2 +- src/ui/primitives/alert.tsx | 4 +- src/ui/primitives/animated-number.tsx | 2 +- src/ui/primitives/avatar.tsx | 2 +- src/ui/primitives/badge.tsx | 6 +- src/ui/primitives/button.tsx | 4 +- src/ui/primitives/calendar.tsx | 6 +- src/ui/primitives/card.tsx | 4 +- src/ui/primitives/checkbox.tsx | 5 +- src/ui/primitives/dialog.tsx | 2 +- src/ui/primitives/drawer.tsx | 2 +- src/ui/primitives/dropdown-menu.tsx | 5 +- src/ui/primitives/form.tsx | 8 +- src/ui/primitives/icons.tsx | 2 +- src/ui/primitives/input.tsx | 3 +- src/ui/primitives/kbd.tsx | 6 +- src/ui/primitives/label.tsx | 2 +- src/ui/primitives/loader_d.tsx | 2 +- src/ui/primitives/radio-group.tsx | 4 +- src/ui/primitives/select.tsx | 3 +- src/ui/primitives/shared-menu-styles.ts | 2 +- src/ui/primitives/sheet.tsx | 2 +- src/ui/primitives/sidebar.tsx | 2 +- src/ui/primitives/sonner.tsx | 2 +- src/ui/primitives/tabs.tsx | 3 +- src/ui/primitives/textarea.tsx | 2 +- src/ui/primitives/toast.tsx | 2 +- src/ui/primitives/toaster.tsx | 24 ++--- src/ui/primitives/tooltip.tsx | 2 +- src/ui/shortcut-tooltip.tsx | 4 +- src/ui/skeletons.tsx | 2 +- src/ui/survey.tsx | 19 ++-- src/ui/theme-switcher.tsx | 4 +- src/ui/time-range-presets.tsx | 2 +- 343 files changed, 970 insertions(+), 870 deletions(-) diff --git a/biome.json b/biome.json index c89959a61..0da7ab988 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.4/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -13,11 +13,44 @@ "linter": { "enabled": true, "rules": { - "recommended": false + "recommended": true, + "a11y": { + "noLabelWithoutControl": "warn", + "noStaticElementInteractions": "warn", + "noSvgWithoutTitle": "warn", + "useButtonType": "warn", + "useIframeTitle": "warn", + "useKeyWithClickEvents": "warn" + }, + "correctness": { + "useExhaustiveDependencies": "warn", + "useHookAtTopLevel": "warn" + }, + "performance": { + "noAccumulatingSpread": "warn", + "noImgElement": "warn" + }, + "security": { + "noDangerouslySetInnerHtml": "warn", + "noDangerouslySetInnerHtmlWithChildren": "warn" + }, + "style": { + "noNonNullAssertion": "warn" + }, + "suspicious": { + "noArrayIndexKey": "off", + "noCommentText": "warn", + "noExplicitAny": "warn", + "useIterableCallbackReturn": "warn" + } } }, - "organizeImports": { - "enabled": true + "assist": { + "actions": { + "source": { + "organizeImports": "on" + } + } }, "javascript": { "formatter": { @@ -25,5 +58,19 @@ "semicolons": "asNeeded", "trailingCommas": "es5" } + }, + "json": { + "formatter": { + "enabled": true + }, + "parser": { + "allowComments": false, + "allowTrailingCommas": false + } + }, + "css": { + "parser": { + "tailwindDirectives": true + } } } diff --git a/bun.lock b/bun.lock index a8eb7ac18..36d107374 100644 --- a/bun.lock +++ b/bun.lock @@ -118,7 +118,7 @@ "zustand-computed": "^2.0.2", }, "devDependencies": { - "@biomejs/biome": "^1.9.4", + "@biomejs/biome": "^2.4.4", "@bufbuild/buf": "^1.54.0", "@bufbuild/protobuf": "^2.5.2", "@bufbuild/protoc-gen-es": "^2.5.2", @@ -207,23 +207,23 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], - "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], + "@biomejs/biome": ["@biomejs/biome@2.4.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.4.4", "@biomejs/cli-darwin-x64": "2.4.4", "@biomejs/cli-linux-arm64": "2.4.4", "@biomejs/cli-linux-arm64-musl": "2.4.4", "@biomejs/cli-linux-x64": "2.4.4", "@biomejs/cli-linux-x64-musl": "2.4.4", "@biomejs/cli-win32-arm64": "2.4.4", "@biomejs/cli-win32-x64": "2.4.4" }, "bin": { "biome": "bin/biome" } }, "sha512-tigwWS5KfJf0cABVd52NVaXyAVv4qpUXOWJ1rxFL8xF1RVoeS2q/LK+FHgYoKMclJCuRoCWAPy1IXaN9/mS61Q=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.4.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-jZ+Xc6qvD6tTH5jM6eKX44dcbyNqJHssfl2nnwT6vma6B1sj7ZLTGIk6N5QwVBs5xGN52r3trk5fgd3sQ9We9A=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.4.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-Dh1a/+W+SUCXhEdL7TiX3ArPTFCQKJTI1mGncZNWfO+6suk+gYA4lNyJcBB+pwvF49uw0pEbUS49BgYOY4hzUg=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.4.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-V/NFfbWhsUU6w+m5WYbBenlEAz8eYnSqRMDMAW3K+3v0tYVkNyZn8VU0XPxk/lOqNXLSCCrV7FmV/u3SjCBShg=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.4.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+sPAXq3bxmFwhVFJnSwkSF5Rw2ZAJMH3MF6C9IveAEOdSpgajPhoQhbbAK12SehN9j2QrHpk4J/cHsa/HqWaYQ=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.4.4", "", { "os": "linux", "cpu": "x64" }, "sha512-R4+ZCDtG9kHArasyBO+UBD6jr/FcFCTH8QkNTOCu0pRJzCWyWC4EtZa2AmUZB5h3e0jD7bRV2KvrENcf8rndBg=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.4.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gGvFTGpOIQDb5CQ2VC0n9Z2UEqlP46c4aNgHmAMytYieTGEcfqhfCFnhs6xjt0S3igE6q5GLuIXtdQt3Izok+g=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.4.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-trzCqM7x+Gn832zZHgr28JoYagQNX4CZkUZhMUac2YxvvyDRLJDrb5m9IA7CaZLlX6lTQmADVfLEKP1et1Ma4Q=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.4", "", { "os": "win32", "cpu": "x64" }, "sha512-gnOHKVPFAAPrpoPt2t+Q6FZ7RPry/FDV3GcpU53P3PtLNnQjBmKyN2Vh/JtqXet+H4pme8CC76rScwdjDcT1/A=="], "@borewit/text-codec": ["@borewit/text-codec@0.2.1", "", {}, "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw=="], diff --git a/package.json b/package.json index 79e586d1e..12e580c1a 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,7 @@ "preview": "next build --turbopack && next start | pino-pretty --colorize", "lint": "biome lint .", "lint:fix": "biome lint --write .", - "format": "biome format --write .", - "format:check": "biome format .", + "format": "biome check --write . --max-diagnostics none", "check": "biome check .", "prebuild": "bun scripts:check-app-env", "<<<<<<< Development Tools": "", @@ -157,7 +156,7 @@ "zustand-computed": "^2.0.2" }, "devDependencies": { - "@biomejs/biome": "^1.9.4", + "@biomejs/biome": "^2.4.4", "@bufbuild/buf": "^1.54.0", "@bufbuild/protobuf": "^2.5.2", "@bufbuild/protoc-gen-es": "^2.5.2", diff --git a/src/__test__/integration/auth.test.ts b/src/__test__/integration/auth.test.ts index c2b4f1517..e6fc25926 100644 --- a/src/__test__/integration/auth.test.ts +++ b/src/__test__/integration/auth.test.ts @@ -1,3 +1,5 @@ +import { redirect } from 'next/navigation' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' import { encodedRedirect } from '@/lib/utils/auth' import { @@ -7,8 +9,6 @@ import { signOutAction, signUpAction, } from '@/server/auth/auth-actions' -import { redirect } from 'next/navigation' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' // Create hoisted mock functions that can be used throughout the file const { validateEmail, shouldWarnAboutAlternateEmail } = vi.hoisted(() => ({ diff --git a/src/__test__/integration/dashboard-route.test.ts b/src/__test__/integration/dashboard-route.test.ts index ddbae5497..0dee60fce 100644 --- a/src/__test__/integration/dashboard-route.test.ts +++ b/src/__test__/integration/dashboard-route.test.ts @@ -1,6 +1,6 @@ -import { PROTECTED_URLS } from '@/configs/urls' import { NextRequest, NextResponse } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { PROTECTED_URLS } from '@/configs/urls' /** * Integration tests for /dashboard route diff --git a/src/__test__/integration/proxy.test.ts b/src/__test__/integration/proxy.test.ts index 66863cd94..90e254519 100644 --- a/src/__test__/integration/proxy.test.ts +++ b/src/__test__/integration/proxy.test.ts @@ -1,8 +1,8 @@ -import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' -import { proxy } from '@/proxy' import { createServerClient } from '@supabase/ssr' import { NextRequest, NextResponse } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' +import { proxy } from '@/proxy' // mock supabase auth vi.mock('@supabase/ssr', () => ({ diff --git a/src/__test__/integration/resolve-user-team.test.ts b/src/__test__/integration/resolve-user-team.test.ts index 7dc29a910..8c26c2cdc 100644 --- a/src/__test__/integration/resolve-user-team.test.ts +++ b/src/__test__/integration/resolve-user-team.test.ts @@ -1,5 +1,5 @@ -import { COOKIE_KEYS } from '@/configs/cookies' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { COOKIE_KEYS } from '@/configs/cookies' /** * Integration tests for resolveUserTeam function diff --git a/src/__test__/unit/chart-utils.test.ts b/src/__test__/unit/chart-utils.test.ts index 7efc34c91..6ff740a71 100644 --- a/src/__test__/unit/chart-utils.test.ts +++ b/src/__test__/unit/chart-utils.test.ts @@ -1,7 +1,7 @@ +import { describe, expect, it } from 'vitest' import { transformMetrics } from '@/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/utils' import { calculateAxisMax } from '@/lib/utils/chart' -import { ClientTeamMetric } from '@/types/sandboxes.types' -import { describe, expect, it } from 'vitest' +import type { ClientTeamMetric } from '@/types/sandboxes.types' describe('team-metrics-chart-utils', () => { describe('calculateYAxisMax', () => { diff --git a/src/__test__/unit/fill-metrics-with-zeros.test.ts b/src/__test__/unit/fill-metrics-with-zeros.test.ts index b6c138a58..40af27022 100644 --- a/src/__test__/unit/fill-metrics-with-zeros.test.ts +++ b/src/__test__/unit/fill-metrics-with-zeros.test.ts @@ -1,6 +1,6 @@ +import { describe, expect, it } from 'vitest' import { fillTeamMetricsWithZeros } from '@/server/sandboxes/utils' import type { ClientTeamMetrics } from '@/types/sandboxes.types' -import { describe, expect, it } from 'vitest' describe('fillTeamMetricsWithZeros', () => { describe('Empty data handling', () => { diff --git a/src/__test__/unit/formatting.test.ts b/src/__test__/unit/formatting.test.ts index a6f8cf9fa..70d7c77eb 100644 --- a/src/__test__/unit/formatting.test.ts +++ b/src/__test__/unit/formatting.test.ts @@ -1,9 +1,10 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { formatAveragingPeriod, - formatCPUCores, formatChartTimestampLocal, formatChartTimestampUTC, formatCompactDate, + formatCPUCores, formatDecimal, formatDuration, formatMemory, @@ -11,7 +12,6 @@ import { formatTimeAxisLabel, parseUTCDateComponents, } from '@/lib/utils/formatting' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' describe('Date & Time Formatting', () => { beforeEach(() => { diff --git a/src/__test__/unit/team-metrics-step.test.ts b/src/__test__/unit/team-metrics-step.test.ts index b7f67d9a6..7b84a69f8 100644 --- a/src/__test__/unit/team-metrics-step.test.ts +++ b/src/__test__/unit/team-metrics-step.test.ts @@ -1,6 +1,6 @@ +import { describe, expect, it } from 'vitest' import { calculateTeamMetricsStep } from '@/configs/mock-data' import { formatAveragingPeriod } from '@/lib/utils/formatting' -import { describe, expect, it } from 'vitest' describe('Team Metrics Step Calculation', () => { describe('calculateTeamMetricsStep', () => { diff --git a/src/app/(auth)/auth/cli/page.tsx b/src/app/(auth)/auth/cli/page.tsx index 330a3e00d..d116b3c44 100644 --- a/src/app/(auth)/auth/cli/page.tsx +++ b/src/app/(auth)/auth/cli/page.tsx @@ -1,3 +1,7 @@ +import { CloudIcon, LaptopIcon, Link2Icon } from 'lucide-react' +import { redirect } from 'next/navigation' +import { Suspense } from 'react' +import { serializeError } from 'serialize-error' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' import { l } from '@/lib/clients/logger/logger' import { createClient } from '@/lib/clients/supabase/server' @@ -5,10 +9,6 @@ import { encodedRedirect } from '@/lib/utils/auth' import { generateE2BUserAccessToken } from '@/lib/utils/server' import { getDefaultTeamRelation } from '@/server/auth/get-default-team' import { Alert, AlertDescription, AlertTitle } from '@/ui/primitives/alert' -import { CloudIcon, LaptopIcon, Link2Icon } from 'lucide-react' -import { redirect } from 'next/navigation' -import { Suspense } from 'react' -import { serializeError } from 'serialize-error' // Types type CLISearchParams = Promise<{ diff --git a/src/app/(auth)/confirm/page.tsx b/src/app/(auth)/confirm/page.tsx index 781a05939..7cfaf88f9 100644 --- a/src/app/(auth)/confirm/page.tsx +++ b/src/app/(auth)/confirm/page.tsx @@ -1,5 +1,8 @@ 'use client' +import { useMutation } from '@tanstack/react-query' +import { useRouter, useSearchParams } from 'next/navigation' +import { useMemo, useTransition } from 'react' import { AUTH_URLS } from '@/configs/urls' import { AuthFormMessage } from '@/features/auth/form-message' import { @@ -9,9 +12,6 @@ import { OtpTypeSchema, } from '@/server/api/models/auth.models' import { Button } from '@/ui/primitives/button' -import { useMutation } from '@tanstack/react-query' -import { useRouter, useSearchParams } from 'next/navigation' -import { useMemo, useTransition } from 'react' const OTP_TYPE_LABELS: Record = { signup: 'Welcome to E2B', diff --git a/src/app/(auth)/forgot-password/page.tsx b/src/app/(auth)/forgot-password/page.tsx index 30ec9312d..dc470821e 100644 --- a/src/app/(auth)/forgot-password/page.tsx +++ b/src/app/(auth)/forgot-password/page.tsx @@ -1,20 +1,20 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' +import { useSearchParams } from 'next/navigation' +import { useEffect, useState } from 'react' import { AUTH_URLS } from '@/configs/urls' import { - USER_MESSAGES, getTimeoutMsFromUserMessage, + USER_MESSAGES, } from '@/configs/user-messages' -import { AuthFormMessage, AuthMessage } from '@/features/auth/form-message' -import { forgotPasswordAction } from '@/server/auth/auth-actions' +import { AuthFormMessage, type AuthMessage } from '@/features/auth/form-message' import { forgotPasswordSchema } from '@/server/auth/auth.types' +import { forgotPasswordAction } from '@/server/auth/auth-actions' import { Button } from '@/ui/primitives/button' import { Input } from '@/ui/primitives/input' import { Label } from '@/ui/primitives/label' -import { zodResolver } from '@hookform/resolvers/zod' -import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' -import { useSearchParams } from 'next/navigation' -import { useEffect, useState } from 'react' export default function ForgotPassword() { const searchParams = useSearchParams() diff --git a/src/app/(auth)/sign-in/page.tsx b/src/app/(auth)/sign-in/page.tsx index 3235f16de..d091d7674 100644 --- a/src/app/(auth)/sign-in/page.tsx +++ b/src/app/(auth)/sign-in/page.tsx @@ -1,11 +1,16 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' +import Link from 'next/link' +import { useSearchParams } from 'next/navigation' +import { Suspense, useEffect, useState } from 'react' import { AUTH_URLS } from '@/configs/urls' import { USER_MESSAGES } from '@/configs/user-messages' -import { AuthFormMessage, AuthMessage } from '@/features/auth/form-message' +import { AuthFormMessage, type AuthMessage } from '@/features/auth/form-message' import { OAuthProviders } from '@/features/auth/oauth-provider-buttons' -import { signInAction } from '@/server/auth/auth-actions' import { signInSchema } from '@/server/auth/auth.types' +import { signInAction } from '@/server/auth/auth-actions' import { Button } from '@/ui/primitives/button' import { Form, @@ -17,11 +22,6 @@ import { } from '@/ui/primitives/form' import { Input } from '@/ui/primitives/input' import TextSeparator from '@/ui/text-separator' -import { zodResolver } from '@hookform/resolvers/zod' -import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' -import Link from 'next/link' -import { useSearchParams } from 'next/navigation' -import { Suspense, useEffect, useState } from 'react' export default function Login() { 'use no memo' diff --git a/src/app/(auth)/sign-up/page.tsx b/src/app/(auth)/sign-up/page.tsx index fc28c634c..7fdad1eb8 100644 --- a/src/app/(auth)/sign-up/page.tsx +++ b/src/app/(auth)/sign-up/page.tsx @@ -1,17 +1,22 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' +import Link from 'next/link' +import { useSearchParams } from 'next/navigation' +import { Suspense, useEffect, useRef, useState } from 'react' import { CAPTCHA_REQUIRED_CLIENT } from '@/configs/flags' import { AUTH_URLS } from '@/configs/urls' import { - USER_MESSAGES, getTimeoutMsFromUserMessage, + USER_MESSAGES, } from '@/configs/user-messages' -import { AuthFormMessage, AuthMessage } from '@/features/auth/form-message' +import { AuthFormMessage, type AuthMessage } from '@/features/auth/form-message' import { OAuthProviders } from '@/features/auth/oauth-provider-buttons' import { TurnstileWidget } from '@/features/auth/turnstile-widget' import { useTurnstile } from '@/features/auth/use-turnstile' -import { signUpAction } from '@/server/auth/auth-actions' import { signUpSchema } from '@/server/auth/auth.types' +import { signUpAction } from '@/server/auth/auth-actions' import { Button } from '@/ui/primitives/button' import { Form, @@ -23,11 +28,6 @@ import { } from '@/ui/primitives/form' import { Input } from '@/ui/primitives/input' import TextSeparator from '@/ui/text-separator' -import { zodResolver } from '@hookform/resolvers/zod' -import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' -import Link from 'next/link' -import { useSearchParams } from 'next/navigation' -import { Suspense, useEffect, useRef, useState } from 'react' export default function SignUp() { 'use no memo' diff --git a/src/app/(rewrites)/[[...slug]]/not-found.tsx b/src/app/(rewrites)/[[...slug]]/not-found.tsx index b229419e3..cb158ef70 100644 --- a/src/app/(rewrites)/[[...slug]]/not-found.tsx +++ b/src/app/(rewrites)/[[...slug]]/not-found.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next' import NotFound from '@/ui/not-found' -import { Metadata } from 'next' export const metadata: Metadata = { title: '404 - Page Not Found', diff --git a/src/app/(rewrites)/[[...slug]]/route.ts b/src/app/(rewrites)/[[...slug]]/route.ts index 209d92906..ae05517fc 100644 --- a/src/app/(rewrites)/[[...slug]]/route.ts +++ b/src/app/(rewrites)/[[...slug]]/route.ts @@ -1,3 +1,5 @@ +import type { NextRequest } from 'next/server' +import { serializeError } from 'serialize-error' import { constructSitemap } from '@/app/sitemap' import { ALLOW_SEO_INDEXING } from '@/configs/flags' import { ROUTE_REWRITE_CONFIG } from '@/configs/rewrites' @@ -7,8 +9,6 @@ import { getRewriteForPath, rewriteContentPagesHtml, } from '@/lib/utils/rewrites' -import { NextRequest } from 'next/server' -import { serializeError } from 'serialize-error' export const dynamic = 'force-static' export const revalidate = 900 diff --git a/src/app/(rewrites)/not-found/page.tsx b/src/app/(rewrites)/not-found/page.tsx index 6d17a1024..461d6b490 100644 --- a/src/app/(rewrites)/not-found/page.tsx +++ b/src/app/(rewrites)/not-found/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next' import NotFound from '@/ui/not-found' -import { Metadata } from 'next' export const metadata: Metadata = { title: '404 - Page Not Found', diff --git a/src/app/api/auth/callback/route.ts b/src/app/api/auth/callback/route.ts index 859454e20..241b2d414 100644 --- a/src/app/api/auth/callback/route.ts +++ b/src/app/api/auth/callback/route.ts @@ -1,9 +1,9 @@ +import { redirect } from 'next/navigation' +import { serializeError } from 'serialize-error' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' import { l } from '@/lib/clients/logger/logger' import { createClient } from '@/lib/clients/supabase/server' import { encodedRedirect } from '@/lib/utils/auth' -import { redirect } from 'next/navigation' -import { serializeError } from 'serialize-error' export async function GET(request: Request) { // The `/auth/callback` route is required for the server-side auth flow implemented diff --git a/src/app/api/auth/confirm/route.ts b/src/app/api/auth/confirm/route.ts index b5400fbe1..ee0033f98 100644 --- a/src/app/api/auth/confirm/route.ts +++ b/src/app/api/auth/confirm/route.ts @@ -1,10 +1,10 @@ +import { redirect } from 'next/navigation' +import type { NextRequest } from 'next/server' +import { z } from 'zod' import { AUTH_URLS } from '@/configs/urls' import { l } from '@/lib/clients/logger/logger' import { encodedRedirect, isExternalOrigin } from '@/lib/utils/auth' import { OtpTypeSchema } from '@/server/api/models/auth.models' -import { redirect } from 'next/navigation' -import { NextRequest } from 'next/server' -import { z } from 'zod' const confirmSchema = z.object({ token_hash: z.string().min(1), diff --git a/src/app/api/auth/email-callback/route.tsx b/src/app/api/auth/email-callback/route.tsx index cae07133d..3fd46b5b4 100644 --- a/src/app/api/auth/email-callback/route.tsx +++ b/src/app/api/auth/email-callback/route.tsx @@ -1,7 +1,7 @@ +import { redirect } from 'next/navigation' import { PROTECTED_URLS } from '@/configs/urls' import { createClient } from '@/lib/clients/supabase/server' import { encodedRedirect } from '@/lib/utils/auth' -import { redirect } from 'next/navigation' export async function GET(request: Request) { const requestUrl = new URL(request.url) diff --git a/src/app/api/auth/verify-otp/route.ts b/src/app/api/auth/verify-otp/route.ts index 0ca59e12d..87f3cd02d 100644 --- a/src/app/api/auth/verify-otp/route.ts +++ b/src/app/api/auth/verify-otp/route.ts @@ -1,3 +1,5 @@ +import { type NextRequest, NextResponse } from 'next/server' +import { flattenError } from 'zod' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' import { l } from '@/lib/clients/logger/logger' import { isExternalOrigin } from '@/lib/utils/auth' @@ -6,8 +8,6 @@ import { type OtpType, } from '@/server/api/models/auth.models' import { authRepo } from '@/server/api/repositories/auth.repository' -import { NextRequest, NextResponse } from 'next/server' -import { flattenError } from 'zod' /** * Determines the redirect URL based on OTP type. diff --git a/src/app/api/health/route.ts b/src/app/api/health/route.ts index 5464b943b..56f59379d 100644 --- a/src/app/api/health/route.ts +++ b/src/app/api/health/route.ts @@ -1,8 +1,8 @@ +import { NextResponse } from 'next/server' +import { serializeError } from 'serialize-error' import { kv } from '@/lib/clients/kv' import { l } from '@/lib/clients/logger/logger' import { supabaseAdmin } from '@/lib/clients/supabase/admin' -import { NextResponse } from 'next/server' -import { serializeError } from 'serialize-error' // NOTE - using cdn caching for rate limiting on db calls diff --git a/src/app/api/sandbox/details/polling/route.ts b/src/app/api/sandbox/details/polling/route.ts index 9fe5bcf05..b505c83c8 100644 --- a/src/app/api/sandbox/details/polling/route.ts +++ b/src/app/api/sandbox/details/polling/route.ts @@ -1,8 +1,8 @@ 'use server' -import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' import { cookies } from 'next/headers' import { z } from 'zod' +import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' const BodySchema = z.object({ interval: z.number() }) diff --git a/src/app/api/sandbox/details/route.ts b/src/app/api/sandbox/details/route.ts index 7fdfd4876..1f2cab171 100644 --- a/src/app/api/sandbox/details/route.ts +++ b/src/app/api/sandbox/details/route.ts @@ -1,7 +1,7 @@ +import { type NextRequest, NextResponse } from 'next/server' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { infra } from '@/lib/clients/api' import { createClient } from '@/lib/clients/supabase/server' -import { NextRequest, NextResponse } from 'next/server' export async function GET(request: NextRequest) { const supabase = await createClient() diff --git a/src/app/api/sandbox/inspect/root-path/route.ts b/src/app/api/sandbox/inspect/root-path/route.ts index a2b0128b1..99d6f54b2 100644 --- a/src/app/api/sandbox/inspect/root-path/route.ts +++ b/src/app/api/sandbox/inspect/root-path/route.ts @@ -1,8 +1,8 @@ 'use server' -import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' import { cookies } from 'next/headers' import { z } from 'zod' +import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' const BodySchema = z.object({ path: z.string() }) diff --git a/src/app/api/sidebar/state/route.ts b/src/app/api/sidebar/state/route.ts index 6674ab9d4..ac750bbf8 100644 --- a/src/app/api/sidebar/state/route.ts +++ b/src/app/api/sidebar/state/route.ts @@ -1,6 +1,6 @@ -import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' import { cookies } from 'next/headers' import { z } from 'zod' +import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' const SidebarStateSchema = z.object({ state: z.boolean(), diff --git a/src/app/api/team/state/route.ts b/src/app/api/team/state/route.ts index a7cbebbc2..22d1203ce 100644 --- a/src/app/api/team/state/route.ts +++ b/src/app/api/team/state/route.ts @@ -1,6 +1,6 @@ -import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' import { cookies } from 'next/headers' import { z } from 'zod' +import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' const TeamStateSchema = z.object({ teamId: z.string(), diff --git a/src/app/api/teams/[teamId]/metrics/route.ts b/src/app/api/teams/[teamId]/metrics/route.ts index 096a609b8..3223e779a 100644 --- a/src/app/api/teams/[teamId]/metrics/route.ts +++ b/src/app/api/teams/[teamId]/metrics/route.ts @@ -1,10 +1,10 @@ import 'server-cli-only' +import { serializeError } from 'serialize-error' import { l } from '@/lib/clients/logger/logger' import { getSessionInsecure } from '@/server/auth/get-session' import { getTeamMetricsCore } from '@/server/sandboxes/get-team-metrics-core' -import { serializeError } from 'serialize-error' -import { TeamMetricsRequestSchema, TeamMetricsResponse } from './types' +import { TeamMetricsRequestSchema, type TeamMetricsResponse } from './types' export async function POST( request: Request, diff --git a/src/app/api/teams/[teamId]/metrics/types.ts b/src/app/api/teams/[teamId]/metrics/types.ts index bb3a5a022..b1306f467 100644 --- a/src/app/api/teams/[teamId]/metrics/types.ts +++ b/src/app/api/teams/[teamId]/metrics/types.ts @@ -1,6 +1,6 @@ -import { MAX_DAYS_AGO } from '@/features/dashboard/sandboxes/monitoring/time-picker/constants' -import { ClientTeamMetrics } from '@/types/sandboxes.types' import { z } from 'zod' +import { MAX_DAYS_AGO } from '@/features/dashboard/sandboxes/monitoring/time-picker/constants' +import type { ClientTeamMetrics } from '@/types/sandboxes.types' export const TeamMetricsRequestSchema = z .object({ diff --git a/src/app/api/teams/[teamId]/sandboxes/metrics/route.ts b/src/app/api/teams/[teamId]/sandboxes/metrics/route.ts index 0db50db64..cb410c4fc 100644 --- a/src/app/api/teams/[teamId]/sandboxes/metrics/route.ts +++ b/src/app/api/teams/[teamId]/sandboxes/metrics/route.ts @@ -6,7 +6,7 @@ import { l } from '@/lib/clients/logger/logger' import { handleDefaultInfraError } from '@/lib/utils/action' import { getSessionInsecure } from '@/server/auth/get-session' import { transformMetricsToClientMetrics } from '@/server/sandboxes/utils' -import { MetricsRequestSchema, MetricsResponse } from './types' +import { MetricsRequestSchema, type MetricsResponse } from './types' export async function POST( request: Request, diff --git a/src/app/api/teams/[teamId]/sandboxes/metrics/types.ts b/src/app/api/teams/[teamId]/sandboxes/metrics/types.ts index 98d9ed24b..e2f6a0433 100644 --- a/src/app/api/teams/[teamId]/sandboxes/metrics/types.ts +++ b/src/app/api/teams/[teamId]/sandboxes/metrics/types.ts @@ -1,5 +1,5 @@ -import { ClientSandboxesMetrics } from '@/types/sandboxes.types' import { z } from 'zod' +import type { ClientSandboxesMetrics } from '@/types/sandboxes.types' export const MetricsRequestSchema = z.object({ sandboxIds: z.array(z.string()).min(1, 'Provide at least one sandbox id'), diff --git a/src/app/api/teams/user/route.ts b/src/app/api/teams/user/route.ts index 6abca5459..d2dbd6066 100644 --- a/src/app/api/teams/user/route.ts +++ b/src/app/api/teams/user/route.ts @@ -1,6 +1,6 @@ import { createClient } from '@/lib/clients/supabase/server' import getUserTeamsMemo from '@/server/team/get-user-teams-memo' -import { UserTeamsResponse } from './types' +import type { UserTeamsResponse } from './types' export async function GET() { try { diff --git a/src/app/api/teams/user/types.ts b/src/app/api/teams/user/types.ts index 0f2151b63..60b1fc766 100644 --- a/src/app/api/teams/user/types.ts +++ b/src/app/api/teams/user/types.ts @@ -1,3 +1,3 @@ -import { ClientTeam } from '@/types/dashboard.types' +import type { ClientTeam } from '@/types/dashboard.types' export type UserTeamsResponse = { teams: ClientTeam[] } diff --git a/src/app/api/trpc/[trpc]/route.ts b/src/app/api/trpc/[trpc]/route.ts index e33ae2602..303157cac 100644 --- a/src/app/api/trpc/[trpc]/route.ts +++ b/src/app/api/trpc/[trpc]/route.ts @@ -1,5 +1,5 @@ import { fetchRequestHandler } from '@trpc/server/adapters/fetch' -import { type NextRequest } from 'next/server' +import type { NextRequest } from 'next/server' import { createTRPCContext } from '@/server/api/init' import { trpcAppRouter } from '@/server/api/routers' diff --git a/src/app/body.tsx b/src/app/body.tsx index 310ea5406..a39a4383c 100644 --- a/src/app/body.tsx +++ b/src/app/body.tsx @@ -1,9 +1,9 @@ 'use client' +import { useParams } from 'next/navigation' +import type { ReactNode } from 'react' import { GTMBody } from '@/features/google-tag-manager' import { cn } from '@/lib/utils' -import { useParams } from 'next/navigation' -import { type ReactNode } from 'react' export function Body({ children, diff --git a/src/app/dashboard/(resolvers)/inspect/sandbox/[sandboxId]/route.ts b/src/app/dashboard/(resolvers)/inspect/sandbox/[sandboxId]/route.ts index 045b35d9c..64afa7034 100644 --- a/src/app/dashboard/(resolvers)/inspect/sandbox/[sandboxId]/route.ts +++ b/src/app/dashboard/(resolvers)/inspect/sandbox/[sandboxId]/route.ts @@ -1,3 +1,6 @@ +import { cookies } from 'next/headers' +import { type NextRequest, NextResponse } from 'next/server' +import { serializeError } from 'serialize-error' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { COOKIE_KEYS } from '@/configs/cookies' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' @@ -7,9 +10,6 @@ import { supabaseAdmin } from '@/lib/clients/supabase/admin' import { createClient } from '@/lib/clients/supabase/server' import { SandboxIdSchema } from '@/lib/schemas/api' import { setTeamCookies } from '@/lib/utils/cookies' -import { cookies } from 'next/headers' -import { NextRequest, NextResponse } from 'next/server' -import { serializeError } from 'serialize-error' export const dynamic = 'force-dynamic' export const fetchCache = 'force-no-store' diff --git a/src/app/dashboard/[teamIdOrSlug]/keys/page.tsx b/src/app/dashboard/[teamIdOrSlug]/keys/page.tsx index 56139bc48..9589fdc82 100644 --- a/src/app/dashboard/[teamIdOrSlug]/keys/page.tsx +++ b/src/app/dashboard/[teamIdOrSlug]/keys/page.tsx @@ -1,3 +1,4 @@ +import { Plus } from 'lucide-react' import CreateApiKeyDialog from '@/features/dashboard/settings/keys/create-api-key-dialog' import ApiKeysTable from '@/features/dashboard/settings/keys/table' import Frame from '@/ui/frame' @@ -9,7 +10,6 @@ import { CardHeader, CardTitle, } from '@/ui/primitives/card' -import { Plus } from 'lucide-react' interface KeysPageClientProps { params: Promise<{ diff --git a/src/app/dashboard/[teamIdOrSlug]/layout.tsx b/src/app/dashboard/[teamIdOrSlug]/layout.tsx index e6b8282b3..624d2444a 100644 --- a/src/app/dashboard/[teamIdOrSlug]/layout.tsx +++ b/src/app/dashboard/[teamIdOrSlug]/layout.tsx @@ -1,3 +1,7 @@ +import { cookies } from 'next/headers' +import { redirect, unauthorized } from 'next/navigation' +import type { Metadata } from 'next/types' +import { serializeError } from 'serialize-error' import { COOKIE_KEYS } from '@/configs/cookies' import { METADATA } from '@/configs/metadata' import { AUTH_URLS } from '@/configs/urls' @@ -9,10 +13,6 @@ import { getSessionInsecure } from '@/server/auth/get-session' import getUserByToken from '@/server/auth/get-user-by-token' import { getTeam } from '@/server/team/get-team' import { SidebarInset, SidebarProvider } from '@/ui/primitives/sidebar' -import { cookies } from 'next/headers' -import { redirect, unauthorized } from 'next/navigation' -import { Metadata } from 'next/types' -import { serializeError } from 'serialize-error' export const metadata: Metadata = { title: 'Dashboard - E2B', diff --git a/src/app/dashboard/[teamIdOrSlug]/sandboxes/(tabs)/@list/page.tsx b/src/app/dashboard/[teamIdOrSlug]/sandboxes/(tabs)/@list/page.tsx index 1c1a0703f..2ecbacc8d 100644 --- a/src/app/dashboard/[teamIdOrSlug]/sandboxes/(tabs)/@list/page.tsx +++ b/src/app/dashboard/[teamIdOrSlug]/sandboxes/(tabs)/@list/page.tsx @@ -1,7 +1,7 @@ +import { Suspense } from 'react' import LoadingLayout from '@/features/dashboard/loading-layout' import SandboxesTable from '@/features/dashboard/sandboxes/list/table' import { HydrateClient, prefetch, trpc } from '@/trpc/server' -import { Suspense } from 'react' export default async function ListPage({ params, diff --git a/src/app/dashboard/[teamIdOrSlug]/sandboxes/[sandboxId]/inspect/page.tsx b/src/app/dashboard/[teamIdOrSlug]/sandboxes/[sandboxId]/inspect/page.tsx index 38de7fcee..4952c0479 100644 --- a/src/app/dashboard/[teamIdOrSlug]/sandboxes/[sandboxId]/inspect/page.tsx +++ b/src/app/dashboard/[teamIdOrSlug]/sandboxes/[sandboxId]/inspect/page.tsx @@ -1,7 +1,7 @@ +import { cookies } from 'next/headers' import { COOKIE_KEYS } from '@/configs/cookies' import SandboxInspectView from '@/features/dashboard/sandbox/inspect/view' import { getSandboxRoot } from '@/server/sandboxes/get-sandbox-root' -import { cookies } from 'next/headers' const DEFAULT_ROOT_PATH = '/home/user' diff --git a/src/app/dashboard/[teamIdOrSlug]/templates/(tabs)/@list/page.tsx b/src/app/dashboard/[teamIdOrSlug]/templates/(tabs)/@list/page.tsx index 5900c4cf3..a2fb9f4be 100644 --- a/src/app/dashboard/[teamIdOrSlug]/templates/(tabs)/@list/page.tsx +++ b/src/app/dashboard/[teamIdOrSlug]/templates/(tabs)/@list/page.tsx @@ -1,6 +1,6 @@ +import { Suspense } from 'react' import LoadingLayout from '@/features/dashboard/loading-layout' import TemplatesTable from '@/features/dashboard/templates/list/table' -import { Suspense } from 'react' export default async function ListPage() { return ( diff --git a/src/app/dashboard/[teamIdOrSlug]/templates/[templateId]/builds/[buildId]/page.tsx b/src/app/dashboard/[teamIdOrSlug]/templates/[templateId]/builds/[buildId]/page.tsx index 4e966adf6..6866a84d1 100644 --- a/src/app/dashboard/[teamIdOrSlug]/templates/[templateId]/builds/[buildId]/page.tsx +++ b/src/app/dashboard/[teamIdOrSlug]/templates/[templateId]/builds/[buildId]/page.tsx @@ -1,12 +1,12 @@ 'use client' -import BuildHeader from '@/features/dashboard/build/header' -import Logs from '@/features/dashboard/build/logs' -import { useTRPC } from '@/trpc/client' import { useQuery } from '@tanstack/react-query' import { TRPCClientError } from '@trpc/client' import { notFound } from 'next/navigation' import { use } from 'react' +import BuildHeader from '@/features/dashboard/build/header' +import Logs from '@/features/dashboard/build/logs' +import { useTRPC } from '@/trpc/client' const REFETCH_INTERVAL_MS = 1_500 diff --git a/src/app/dashboard/[teamIdOrSlug]/webhooks/page.tsx b/src/app/dashboard/[teamIdOrSlug]/webhooks/page.tsx index 0d5da845b..911f43ab1 100644 --- a/src/app/dashboard/[teamIdOrSlug]/webhooks/page.tsx +++ b/src/app/dashboard/[teamIdOrSlug]/webhooks/page.tsx @@ -1,3 +1,5 @@ +import { Plus } from 'lucide-react' +import { notFound } from 'next/navigation' import { INCLUDE_ARGUS } from '@/configs/flags' import WebhookAddEditDialog from '@/features/dashboard/settings/webhooks/add-edit-dialog' import WebhooksTable from '@/features/dashboard/settings/webhooks/table' @@ -9,8 +11,6 @@ import { CardDescription, CardHeader, } from '@/ui/primitives/card' -import { Plus } from 'lucide-react' -import { notFound } from 'next/navigation' interface WebhooksPageClientProps { params: Promise<{ diff --git a/src/app/dashboard/account/route.ts b/src/app/dashboard/account/route.ts index d59976617..99b96ad44 100644 --- a/src/app/dashboard/account/route.ts +++ b/src/app/dashboard/account/route.ts @@ -1,9 +1,9 @@ +import { type NextRequest, NextResponse } from 'next/server' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' import { createClient } from '@/lib/clients/supabase/server' import { encodedRedirect } from '@/lib/utils/auth' import { setTeamCookies } from '@/lib/utils/cookies' import { resolveUserTeam } from '@/server/team/resolve-user-team' -import { NextRequest, NextResponse } from 'next/server' export async function GET(request: NextRequest) { const supabase = await createClient() diff --git a/src/app/dashboard/error.tsx b/src/app/dashboard/error.tsx index 3e14002a4..70aeae672 100644 --- a/src/app/dashboard/error.tsx +++ b/src/app/dashboard/error.tsx @@ -2,7 +2,7 @@ import ErrorBoundary from '@/ui/error' -export default function Error({ +export default function DashboardError({ error, }: { error: Error & { digest?: string } diff --git a/src/app/dashboard/route.ts b/src/app/dashboard/route.ts index 23b30facb..d69a65e5b 100644 --- a/src/app/dashboard/route.ts +++ b/src/app/dashboard/route.ts @@ -1,9 +1,9 @@ +import { type NextRequest, NextResponse } from 'next/server' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' import { createClient } from '@/lib/clients/supabase/server' import { encodedRedirect } from '@/lib/utils/auth' import { setTeamCookies } from '@/lib/utils/cookies' import { resolveUserTeam } from '@/server/team/resolve-user-team' -import { NextRequest, NextResponse } from 'next/server' export const TAB_URL_MAP: Record string> = { sandboxes: (teamId) => PROTECTED_URLS.SANDBOXES(teamId), diff --git a/src/app/dashboard/unauthorized.tsx b/src/app/dashboard/unauthorized.tsx index 2ce2aa0d7..2d38b35b9 100644 --- a/src/app/dashboard/unauthorized.tsx +++ b/src/app/dashboard/unauthorized.tsx @@ -1,5 +1,7 @@ 'use client' +import { ArrowLeft, HomeIcon, ShieldX, UsersIcon } from 'lucide-react' +import Link from 'next/link' import { PROTECTED_URLS } from '@/configs/urls' import { AsciiBackgroundPattern } from '@/ui/patterns' import { Button } from '@/ui/primitives/button' @@ -10,8 +12,6 @@ import { CardFooter, CardHeader, } from '@/ui/primitives/card' -import { ArrowLeft, HomeIcon, ShieldX, UsersIcon } from 'lucide-react' -import Link from 'next/link' export default function Unauthorized() { return ( diff --git a/src/app/error.tsx b/src/app/error.tsx index 2daf96df9..c3952450c 100644 --- a/src/app/error.tsx +++ b/src/app/error.tsx @@ -2,7 +2,7 @@ import ErrorBoundary from '@/ui/error' -export default function Error({ +export default function AppError({ error, }: { error: Error & { digest?: string } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index d75d09ca4..412708168 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,14 +1,14 @@ import '@/app/fonts' import '@/styles/globals.css' -import ClientProviders from '@/features/client-providers' -import { GeneralAnalyticsCollector } from '@/features/general-analytics-collector' -import { GTMHead } from '@/features/google-tag-manager' -import { Toaster } from '@/ui/primitives/toaster' import { Analytics } from '@vercel/analytics/next' import { SpeedInsights } from '@vercel/speed-insights/next' import Head from 'next/head' import { Suspense } from 'react' +import ClientProviders from '@/features/client-providers' +import { GeneralAnalyticsCollector } from '@/features/general-analytics-collector' +import { GTMHead } from '@/features/google-tag-manager' +import { Toaster } from '@/ui/primitives/toaster' import { Body } from './body' export default function RootLayout({ diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx index b229419e3..cb158ef70 100644 --- a/src/app/not-found.tsx +++ b/src/app/not-found.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next' import NotFound from '@/ui/not-found' -import { Metadata } from 'next' export const metadata: Metadata = { title: '404 - Page Not Found', diff --git a/src/app/robots.ts b/src/app/robots.ts index d3d8cb539..dbe70f712 100644 --- a/src/app/robots.ts +++ b/src/app/robots.ts @@ -1,5 +1,5 @@ -import { ALLOW_SEO_INDEXING } from '@/configs/flags' import type { MetadataRoute } from 'next' +import { ALLOW_SEO_INDEXING } from '@/configs/flags' export default function robots(): MetadataRoute.Robots { if (!ALLOW_SEO_INDEXING) { diff --git a/src/app/sbx/new/route.ts b/src/app/sbx/new/route.ts index 6b4cb9e13..9a7f0f769 100644 --- a/src/app/sbx/new/route.ts +++ b/src/app/sbx/new/route.ts @@ -1,12 +1,12 @@ +import Sandbox from 'e2b' +import { type NextRequest, NextResponse } from 'next/server' +import { serializeError } from 'serialize-error' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' import { l } from '@/lib/clients/logger/logger' import { createClient } from '@/lib/clients/supabase/server' import { getDefaultTeam } from '@/server/auth/get-default-team' import { getSessionInsecure } from '@/server/auth/get-session' -import Sandbox from 'e2b' -import { NextRequest, NextResponse } from 'next/server' -import { serializeError } from 'serialize-error' export const GET = async (req: NextRequest) => { try { diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 48966e4bd..3e668a1dc 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -7,15 +7,15 @@ * is discoverable by search engines. */ +import { XMLParser } from 'fast-xml-parser' +import type { MetadataRoute } from 'next' import { ALLOW_SEO_INDEXING } from '@/configs/flags' import { LANDING_PAGE_DOMAIN, ROUTE_REWRITE_CONFIG, SDK_REFERENCE_DOMAIN, } from '@/configs/rewrites' -import { DomainConfig } from '@/types/rewrites.types' -import { XMLParser } from 'fast-xml-parser' -import { MetadataRoute } from 'next' +import type { DomainConfig } from '@/types/rewrites.types' import { DOCUMENTATION_DOMAIN } from '../../next.config.mjs' // Cache the sitemap for 15 minutes (in seconds) diff --git a/src/configs/cookies.ts b/src/configs/cookies.ts index 6acc60bbc..4d412a43b 100644 --- a/src/configs/cookies.ts +++ b/src/configs/cookies.ts @@ -1,4 +1,4 @@ -import { ResponseCookie } from 'next/dist/compiled/@edge-runtime/cookies' +import type { ResponseCookie } from 'next/dist/compiled/@edge-runtime/cookies' /** * Cookie keys used throughout the application. diff --git a/src/configs/docs.ts b/src/configs/docs.ts index aa4e2e38a..ba39eca90 100644 --- a/src/configs/docs.ts +++ b/src/configs/docs.ts @@ -1,4 +1,4 @@ -import { IconType } from 'react-icons/lib' +import type { IconType } from 'react-icons/lib' import { SiDocker, SiGnubash, diff --git a/src/configs/layout.ts b/src/configs/layout.ts index 5e8656cc9..6ba8b77b7 100644 --- a/src/configs/layout.ts +++ b/src/configs/layout.ts @@ -1,5 +1,5 @@ -import { l } from '@/lib/clients/logger/logger' import micromatch from 'micromatch' +import { l } from '@/lib/clients/logger/logger' import { PROTECTED_URLS } from './urls' export interface TitleSegment { diff --git a/src/configs/mock-data.ts b/src/configs/mock-data.ts index d1d04e593..50da57f1e 100644 --- a/src/configs/mock-data.ts +++ b/src/configs/mock-data.ts @@ -1,16 +1,16 @@ -import { MetricsResponse } from '@/app/api/teams/[teamId]/sandboxes/metrics/types' -import { +import { addHours, subHours } from 'date-fns' +import { nanoid } from 'nanoid' +import type { MetricsResponse } from '@/app/api/teams/[teamId]/sandboxes/metrics/types' +import type { DefaultTemplate, Sandbox, Sandboxes, Template, } from '@/types/api.types' -import { +import type { ClientSandboxesMetrics, ClientTeamMetrics, } from '@/types/sandboxes.types' -import { addHours, subHours } from 'date-fns' -import { nanoid } from 'nanoid' const DEFAULT_TEMPLATES: DefaultTemplate[] = [ { diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index b10ca17af..eb11f3492 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -1,7 +1,8 @@ -import { DomainConfig } from '@/types/rewrites.types' +import type { DomainConfig } from '@/types/rewrites.types' export const LANDING_PAGE_DOMAIN = 'www.e2b-landing-page.com' export const SDK_REFERENCE_DOMAIN = 'e2b-docs.vercel.app' + // NOTE: DOCUMENTATION_DOMAIN has to be defined in next.config.mjs, such that we are able to use it there import { DOCUMENTATION_DOMAIN } from '../../next.config.mjs' diff --git a/src/configs/shiki.ts b/src/configs/shiki.ts index 3d9be6bf6..3f638b686 100644 --- a/src/configs/shiki.ts +++ b/src/configs/shiki.ts @@ -1,9 +1,8 @@ -import { useTheme } from 'next-themes' -import { useMemo } from 'react' -import { ThemeRegistration } from 'shiki' - import baseThemeDark from '@shikijs/themes/vitesse-dark' import baseThemeLight from '@shikijs/themes/vitesse-light' +import { useTheme } from 'next-themes' +import { useMemo } from 'react' +import type { ThemeRegistration } from 'shiki' export const SHIKI_THEME_DARK: ThemeRegistration = { ...baseThemeDark, diff --git a/src/configs/sidebar.ts b/src/configs/sidebar.ts index fbb8ad5e4..65bf013f7 100644 --- a/src/configs/sidebar.ts +++ b/src/configs/sidebar.ts @@ -1,16 +1,16 @@ -import { GaugeIcon, WebhookIcon } from '@/ui/primitives/icons' import { Activity, Box, Container, CreditCard, Key, - LucideProps, + type LucideProps, Settings, UserRoundCog, Users, } from 'lucide-react' -import { ForwardRefExoticComponent, JSX, RefAttributes } from 'react' +import type { ForwardRefExoticComponent, JSX, RefAttributes } from 'react' +import { GaugeIcon, WebhookIcon } from '@/ui/primitives/icons' import { INCLUDE_ARGUS, INCLUDE_BILLING } from './flags' import { PROTECTED_URLS } from './urls' diff --git a/src/features/auth/form-message.tsx b/src/features/auth/form-message.tsx index 54a28c1b1..9d823936e 100644 --- a/src/features/auth/form-message.tsx +++ b/src/features/auth/form-message.tsx @@ -1,9 +1,9 @@ 'use client' -import { cn } from '@/lib/utils' -import { Alert, AlertDescription } from '@/ui/primitives/alert' import { AlertCircle, CheckCircle2, Info } from 'lucide-react' import { motion } from 'motion/react' +import { cn } from '@/lib/utils' +import { Alert, AlertDescription } from '@/ui/primitives/alert' // TODO: this type is used in more places than just authentication // -> should probably be renamed / moved to a more appropriate location diff --git a/src/features/auth/oauth-provider-buttons.tsx b/src/features/auth/oauth-provider-buttons.tsx index 8b67a129c..b6f4e4896 100644 --- a/src/features/auth/oauth-provider-buttons.tsx +++ b/src/features/auth/oauth-provider-buttons.tsx @@ -1,9 +1,9 @@ 'use client' +import { useSearchParams } from 'next/navigation' +import { useAction } from 'next-safe-action/hooks' import { signInWithOAuthAction } from '@/server/auth/auth-actions' import { Button } from '@/ui/primitives/button' -import { useAction } from 'next-safe-action/hooks' -import { useSearchParams } from 'next/navigation' export function OAuthProviders() { const searchParams = useSearchParams() diff --git a/src/features/auth/turnstile-widget.tsx b/src/features/auth/turnstile-widget.tsx index e8880be4a..8ceda6c9d 100644 --- a/src/features/auth/turnstile-widget.tsx +++ b/src/features/auth/turnstile-widget.tsx @@ -1,9 +1,9 @@ 'use client' -import { CAPTCHA_REQUIRED_CLIENT } from '@/configs/flags' -import { cn } from '@/lib/utils' import { Turnstile, type TurnstileInstance } from '@marsidev/react-turnstile' import { forwardRef } from 'react' +import { CAPTCHA_REQUIRED_CLIENT } from '@/configs/flags' +import { cn } from '@/lib/utils' interface TurnstileWidgetProps { onSuccess: (token: string) => void diff --git a/src/features/client-providers.tsx b/src/features/client-providers.tsx index 61d61590c..100a2b6e2 100644 --- a/src/features/client-providers.tsx +++ b/src/features/client-providers.tsx @@ -1,11 +1,11 @@ 'use client' +import { ThemeProvider } from 'next-themes' +import { NuqsAdapter } from 'nuqs/adapters/next/app' import { TRPCReactProvider } from '@/trpc/client' import { Toaster } from '@/ui/primitives/sonner' import { ToastProvider } from '@/ui/primitives/toast' import { TooltipProvider } from '@/ui/primitives/tooltip' -import { ThemeProvider } from 'next-themes' -import { NuqsAdapter } from 'nuqs/adapters/next/app' import { PostHogProvider } from './posthog-provider' interface ClientProvidersProps { diff --git a/src/features/dashboard/account/email-settings.tsx b/src/features/dashboard/account/email-settings.tsx index 2b69464c8..0bf3bee9c 100644 --- a/src/features/dashboard/account/email-settings.tsx +++ b/src/features/dashboard/account/email-settings.tsx @@ -1,5 +1,11 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useSearchParams } from 'next/navigation' +import { useAction } from 'next-safe-action/hooks' +import { useEffect, useMemo } from 'react' +import { useForm } from 'react-hook-form' +import { z } from 'zod' import { USER_MESSAGES } from '@/configs/user-messages' import { defaultErrorToast, @@ -26,12 +32,6 @@ import { FormMessage, } from '@/ui/primitives/form' import { Input } from '@/ui/primitives/input' -import { zodResolver } from '@hookform/resolvers/zod' -import { useAction } from 'next-safe-action/hooks' -import { useSearchParams } from 'next/navigation' -import { useEffect, useMemo } from 'react' -import { useForm } from 'react-hook-form' -import { z } from 'zod' import { useDashboard } from '../context' const formSchema = z.object({ diff --git a/src/features/dashboard/account/name-settings.tsx b/src/features/dashboard/account/name-settings.tsx index 6422b90eb..92f4818cf 100644 --- a/src/features/dashboard/account/name-settings.tsx +++ b/src/features/dashboard/account/name-settings.tsx @@ -1,5 +1,9 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useAction } from 'next-safe-action/hooks' +import { useForm } from 'react-hook-form' +import { z } from 'zod' import { USER_MESSAGES } from '@/configs/user-messages' import { defaultErrorToast, @@ -25,10 +29,6 @@ import { FormMessage, } from '@/ui/primitives/form' import { Input } from '@/ui/primitives/input' -import { zodResolver } from '@hookform/resolvers/zod' -import { useAction } from 'next-safe-action/hooks' -import { useForm } from 'react-hook-form' -import { z } from 'zod' import { useDashboard } from '../context' const formSchema = z.object({ diff --git a/src/features/dashboard/account/password-settings-server.tsx b/src/features/dashboard/account/password-settings-server.tsx index 06b5d1c0d..ea74e0227 100644 --- a/src/features/dashboard/account/password-settings-server.tsx +++ b/src/features/dashboard/account/password-settings-server.tsx @@ -1,4 +1,4 @@ -import { AccountPageSearchParams } from '@/app/dashboard/[teamIdOrSlug]/account/page' +import type { AccountPageSearchParams } from '@/app/dashboard/[teamIdOrSlug]/account/page' import { PasswordSettings } from './password-settings' interface PasswordSettingsServerProps { diff --git a/src/features/dashboard/account/password-settings.tsx b/src/features/dashboard/account/password-settings.tsx index b70377c76..4b54f6943 100644 --- a/src/features/dashboard/account/password-settings.tsx +++ b/src/features/dashboard/account/password-settings.tsx @@ -1,5 +1,10 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useAction } from 'next-safe-action/hooks' +import { useEffect, useMemo, useState } from 'react' +import { useForm } from 'react-hook-form' +import { z } from 'zod' import { USER_MESSAGES } from '@/configs/user-messages' import { defaultErrorToast, @@ -26,11 +31,6 @@ import { FormMessage, } from '@/ui/primitives/form' import { Input } from '@/ui/primitives/input' -import { zodResolver } from '@hookform/resolvers/zod' -import { useAction } from 'next-safe-action/hooks' -import { useEffect, useMemo, useState } from 'react' -import { useForm } from 'react-hook-form' -import { z } from 'zod' import { useDashboard } from '../context' import { ReauthDialog } from './reauth-dialog' diff --git a/src/features/dashboard/account/user-access-token.tsx b/src/features/dashboard/account/user-access-token.tsx index d322e26c0..159c0d405 100644 --- a/src/features/dashboard/account/user-access-token.tsx +++ b/src/features/dashboard/account/user-access-token.tsx @@ -1,14 +1,14 @@ 'use client' +import { Eye, EyeOff } from 'lucide-react' +import { useAction } from 'next-safe-action/hooks' +import { useState } from 'react' import { defaultErrorToast, useToast } from '@/lib/hooks/use-toast' import { getUserAccessTokenAction } from '@/server/user/user-actions' import CopyButton from '@/ui/copy-button' import { Button } from '@/ui/primitives/button' import { Input } from '@/ui/primitives/input' import { Loader } from '@/ui/primitives/loader_d' -import { Eye, EyeOff } from 'lucide-react' -import { useAction } from 'next-safe-action/hooks' -import { useState } from 'react' interface UserAccessTokenProps { className?: string diff --git a/src/features/dashboard/billing/addons.tsx b/src/features/dashboard/billing/addons.tsx index 467ceddae..f67873ca5 100644 --- a/src/features/dashboard/billing/addons.tsx +++ b/src/features/dashboard/billing/addons.tsx @@ -1,11 +1,14 @@ 'use client' +import { useMutation } from '@tanstack/react-query' +import Link from 'next/link' +import { useState } from 'react' import { PROTECTED_URLS } from '@/configs/urls' import { useRouteParams } from '@/lib/hooks/use-route-params' import { defaultErrorToast, useToast } from '@/lib/hooks/use-toast' import { formatCurrency } from '@/lib/utils/formatting' import { useTRPC } from '@/trpc/client' -import { AddonInfo } from '@/types/billing.types' +import type { AddonInfo } from '@/types/billing.types' import HelpTooltip from '@/ui/help-tooltip' import { Badge } from '@/ui/primitives/badge' import { Button } from '@/ui/primitives/button' @@ -13,9 +16,6 @@ import { InfoIcon, SandboxIcon, UpgradeIcon } from '@/ui/primitives/icons' import { Label } from '@/ui/primitives/label' import { Loader } from '@/ui/primitives/loader' import { Skeleton } from '@/ui/primitives/skeleton' -import { useMutation } from '@tanstack/react-query' -import Link from 'next/link' -import { useState } from 'react' import { useDashboard } from '../context' import { ConcurrentSandboxAddOnPurchaseDialog } from './concurrent-sandboxes-addon-dialog' import { ADDON_500_SANDBOXES_ID, TIER_PRO_ID } from './constants' diff --git a/src/features/dashboard/billing/concurrent-sandboxes-addon-dialog.tsx b/src/features/dashboard/billing/concurrent-sandboxes-addon-dialog.tsx index c81cc4e1d..17a41935a 100644 --- a/src/features/dashboard/billing/concurrent-sandboxes-addon-dialog.tsx +++ b/src/features/dashboard/billing/concurrent-sandboxes-addon-dialog.tsx @@ -1,19 +1,5 @@ 'use client' -import { useRouteParams } from '@/lib/hooks/use-route-params' -import { defaultErrorToast, useToast } from '@/lib/hooks/use-toast' -import { useTRPC } from '@/trpc/client' -import { AsciiSandbox } from '@/ui/patterns' -import { Alert, AlertDescription } from '@/ui/primitives/alert' -import { Button } from '@/ui/primitives/button' -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, -} from '@/ui/primitives/dialog' -import { SandboxIcon } from '@/ui/primitives/icons' -import { Loader } from '@/ui/primitives/loader' import { Elements, PaymentElement, @@ -29,6 +15,20 @@ import { } from 'lucide-react' import { useRouter } from 'next/navigation' import { useState } from 'react' +import { useRouteParams } from '@/lib/hooks/use-route-params' +import { defaultErrorToast, useToast } from '@/lib/hooks/use-toast' +import { useTRPC } from '@/trpc/client' +import { AsciiSandbox } from '@/ui/patterns' +import { Alert, AlertDescription } from '@/ui/primitives/alert' +import { Button } from '@/ui/primitives/button' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from '@/ui/primitives/dialog' +import { SandboxIcon } from '@/ui/primitives/icons' +import { Loader } from '@/ui/primitives/loader' import { useDashboard } from '../context' import { ADDON_PURCHASE_ACTION_ERRORS, diff --git a/src/features/dashboard/billing/hooks.ts b/src/features/dashboard/billing/hooks.ts index 64dd937c3..a6a413327 100644 --- a/src/features/dashboard/billing/hooks.ts +++ b/src/features/dashboard/billing/hooks.ts @@ -1,12 +1,12 @@ 'use client' -import { useRouteParams } from '@/lib/hooks/use-route-params' -import { defaultErrorToast, useToast } from '@/lib/hooks/use-toast' -import { useTRPC } from '@/trpc/client' import { loadStripe } from '@stripe/stripe-js' import { useQuery } from '@tanstack/react-query' import { useTheme } from 'next-themes' import { useState } from 'react' +import { useRouteParams } from '@/lib/hooks/use-route-params' +import { defaultErrorToast, useToast } from '@/lib/hooks/use-toast' +import { useTRPC } from '@/trpc/client' import { ADDON_PURCHASE_MESSAGES } from './constants' import { extractAddonData, extractTierData } from './utils' diff --git a/src/features/dashboard/billing/invoices.tsx b/src/features/dashboard/billing/invoices.tsx index 3eaba3711..f603d5885 100644 --- a/src/features/dashboard/billing/invoices.tsx +++ b/src/features/dashboard/billing/invoices.tsx @@ -1,5 +1,6 @@ 'use client' +import Link from 'next/link' import { cn } from '@/lib/utils' import { formatCurrency } from '@/lib/utils/formatting' import { Badge } from '@/ui/primitives/badge' @@ -20,7 +21,6 @@ import { TableHeader, TableRow, } from '@/ui/primitives/table' -import Link from 'next/link' import { useInvoices } from './hooks' import { TableEmptyRowBorder } from './table-empty-row-border' diff --git a/src/features/dashboard/billing/select-plan.tsx b/src/features/dashboard/billing/select-plan.tsx index 485ceff1f..e6b3f6de9 100644 --- a/src/features/dashboard/billing/select-plan.tsx +++ b/src/features/dashboard/billing/select-plan.tsx @@ -1,10 +1,12 @@ 'use client' +import { useMutation } from '@tanstack/react-query' +import { useRouter } from 'next/navigation' import { useRouteParams } from '@/lib/hooks/use-route-params' import { defaultErrorToast, useToast } from '@/lib/hooks/use-toast' import { formatCurrency } from '@/lib/utils/formatting' import { useTRPC } from '@/trpc/client' -import { TierInfo } from '@/types/billing.types' +import type { TierInfo } from '@/types/billing.types' import { Badge } from '@/ui/primitives/badge' import { Button } from '@/ui/primitives/button' import { @@ -17,8 +19,6 @@ import { } from '@/ui/primitives/icons' import { Separator } from '@/ui/primitives/separator' import { Skeleton } from '@/ui/primitives/skeleton' -import { useMutation } from '@tanstack/react-query' -import { useRouter } from 'next/navigation' import { useDashboard } from '../context' import { TIER_BASE_ID, TIER_PRO_ID } from './constants' import { useBillingItems } from './hooks' diff --git a/src/features/dashboard/billing/selected-plan.tsx b/src/features/dashboard/billing/selected-plan.tsx index 819f7180d..4dba6cde9 100644 --- a/src/features/dashboard/billing/selected-plan.tsx +++ b/src/features/dashboard/billing/selected-plan.tsx @@ -1,10 +1,13 @@ 'use client' +import { useMutation } from '@tanstack/react-query' +import Link from 'next/link' +import { usePathname, useRouter } from 'next/navigation' import { PROTECTED_URLS } from '@/configs/urls' import { useRouteParams } from '@/lib/hooks/use-route-params' import { defaultErrorToast, useToast } from '@/lib/hooks/use-toast' import { formatCurrency } from '@/lib/utils/formatting' -import { TeamLimits } from '@/server/team/get-team-limits' +import type { TeamLimits } from '@/server/team/get-team-limits' import { useTRPC } from '@/trpc/client' import { Badge } from '@/ui/primitives/badge' import { Button } from '@/ui/primitives/button' @@ -20,12 +23,9 @@ import { import { Label } from '@/ui/primitives/label' import { Separator } from '@/ui/primitives/separator' import { Skeleton } from '@/ui/primitives/skeleton' -import { useMutation } from '@tanstack/react-query' -import Link from 'next/link' -import { usePathname, useRouter } from 'next/navigation' import { useBillingItems, useTeamLimits } from './hooks' import { TierAvatarBorder } from './tier-avatar-border' -import { BillingTierData } from './types' +import type { BillingTierData } from './types' import { formatHours, formatMibToGb, formatTierDisplayName } from './utils' function formatCpu(vcpu: number): string { diff --git a/src/features/dashboard/billing/types.ts b/src/features/dashboard/billing/types.ts index 898cee563..e94d5092d 100644 --- a/src/features/dashboard/billing/types.ts +++ b/src/features/dashboard/billing/types.ts @@ -1,5 +1,5 @@ -import { TeamLimits } from '@/server/team/get-team-limits' -import { TeamItems } from '@/types/billing.types' +import type { TeamLimits } from '@/server/team/get-team-limits' +import type { TeamItems } from '@/types/billing.types' export interface BillingData { items: TeamItems diff --git a/src/features/dashboard/billing/utils.ts b/src/features/dashboard/billing/utils.ts index 9fdbda0f0..7768efa4c 100644 --- a/src/features/dashboard/billing/utils.ts +++ b/src/features/dashboard/billing/utils.ts @@ -1,7 +1,7 @@ import { l } from '@/lib/clients/logger/logger' -import { TeamItems } from '@/types/billing.types' +import type { TeamItems } from '@/types/billing.types' import { ADDON_500_SANDBOXES_ID, TIER_BASE_ID, TIER_PRO_ID } from './constants' -import { BillingAddonData, BillingTierData } from './types' +import type { BillingAddonData, BillingTierData } from './types' export function formatTierDisplayName(name: string): string { if (name.toLowerCase().includes('base')) return 'Hobby' diff --git a/src/features/dashboard/build/build-logs-store.ts b/src/features/dashboard/build/build-logs-store.ts index 7d85d6b3e..4e598904b 100644 --- a/src/features/dashboard/build/build-logs-store.ts +++ b/src/features/dashboard/build/build-logs-store.ts @@ -1,9 +1,9 @@ 'use client' -import type { BuildLogDTO } from '@/server/api/models/builds.models' -import type { useTRPCClient } from '@/trpc/client' import { create } from 'zustand' import { immer } from 'zustand/middleware/immer' +import type { BuildLogDTO } from '@/server/api/models/builds.models' +import type { useTRPCClient } from '@/trpc/client' import type { LogLevelFilter } from './logs-filter-params' const FORWARD_CURSOR_PADDING_MS = 1 diff --git a/src/features/dashboard/build/header-cells.tsx b/src/features/dashboard/build/header-cells.tsx index 55a6417d6..e4628638f 100644 --- a/src/features/dashboard/build/header-cells.tsx +++ b/src/features/dashboard/build/header-cells.tsx @@ -1,3 +1,6 @@ +import { ArrowUpRight } from 'lucide-react' +import { useRouter } from 'next/navigation' +import { useEffect, useState } from 'react' import { PROTECTED_URLS } from '@/configs/urls' import { useRouteParams } from '@/lib/hooks/use-route-params' import { @@ -8,9 +11,6 @@ import { import { cn } from '@/lib/utils/ui' import CopyButtonInline from '@/ui/copy-button-inline' import { Button } from '@/ui/primitives/button' -import { ArrowUpRight } from 'lucide-react' -import { useRouter } from 'next/navigation' -import { useEffect, useState } from 'react' import { useTemplateTableStore } from '../templates/list/stores/table-store' export function Template({ diff --git a/src/features/dashboard/build/header.tsx b/src/features/dashboard/build/header.tsx index ea349c933..d40979ecc 100644 --- a/src/features/dashboard/build/header.tsx +++ b/src/features/dashboard/build/header.tsx @@ -1,7 +1,7 @@ 'use client' import { cn } from '@/lib/utils/ui' -import { BuildDetailsDTO } from '@/server/api/models/builds.models' +import type { BuildDetailsDTO } from '@/server/api/models/builds.models' import CopyButton from '@/ui/copy-button' import CopyButtonInline from '@/ui/copy-button-inline' import { CheckIcon, CloseIcon } from '@/ui/primitives/icons' diff --git a/src/features/dashboard/build/logs-cells.tsx b/src/features/dashboard/build/logs-cells.tsx index 7413cea3f..bbaef19df 100644 --- a/src/features/dashboard/build/logs-cells.tsx +++ b/src/features/dashboard/build/logs-cells.tsx @@ -1,9 +1,9 @@ -import { formatDurationCompact } from '@/lib/utils/formatting' -import { BuildLogDTO } from '@/server/api/models/builds.models' -import CopyButtonInline from '@/ui/copy-button-inline' -import { Badge, BadgeProps } from '@/ui/primitives/badge' import { format } from 'date-fns' import { enUS } from 'date-fns/locale/en-US' +import { formatDurationCompact } from '@/lib/utils/formatting' +import type { BuildLogDTO } from '@/server/api/models/builds.models' +import CopyButtonInline from '@/ui/copy-button-inline' +import { Badge, type BadgeProps } from '@/ui/primitives/badge' interface LogLevelProps { level: BuildLogDTO['level'] diff --git a/src/features/dashboard/build/logs-filter-params.ts b/src/features/dashboard/build/logs-filter-params.ts index 75e9095a4..d972fc419 100644 --- a/src/features/dashboard/build/logs-filter-params.ts +++ b/src/features/dashboard/build/logs-filter-params.ts @@ -1,5 +1,5 @@ -import { BuildLogDTO } from '@/server/api/models/builds.models' import { createLoader, parseAsStringEnum } from 'nuqs/server' +import type { BuildLogDTO } from '@/server/api/models/builds.models' export type LogLevelFilter = BuildLogDTO['level'] diff --git a/src/features/dashboard/build/logs.tsx b/src/features/dashboard/build/logs.tsx index edc76e9c1..758871b92 100644 --- a/src/features/dashboard/build/logs.tsx +++ b/src/features/dashboard/build/logs.tsx @@ -1,5 +1,18 @@ 'use client' +import { + useVirtualizer, + type VirtualItem, + type Virtualizer, +} from '@tanstack/react-virtual' +import { + type RefObject, + useCallback, + useEffect, + useReducer, + useRef, + useState, +} from 'react' import { cn } from '@/lib/utils' import type { BuildDetailsDTO, @@ -23,22 +36,9 @@ import { TableHeader, TableRow, } from '@/ui/primitives/table' -import { - VirtualItem, - Virtualizer, - useVirtualizer, -} from '@tanstack/react-virtual' -import { - RefObject, - useCallback, - useEffect, - useReducer, - useRef, - useState, -} from 'react' import { LOG_RETENTION_MS } from '../templates/builds/constants' import { LogLevel, Message, Timestamp } from './logs-cells' -import { type LogLevelFilter } from './logs-filter-params' +import type { LogLevelFilter } from './logs-filter-params' import { useBuildLogs } from './use-build-logs' import useLogFilters from './use-log-filters' diff --git a/src/features/dashboard/build/use-build-logs.ts b/src/features/dashboard/build/use-build-logs.ts index 192f8cbc5..7fd90797a 100644 --- a/src/features/dashboard/build/use-build-logs.ts +++ b/src/features/dashboard/build/use-build-logs.ts @@ -1,12 +1,12 @@ 'use client' -import type { BuildStatusDTO } from '@/server/api/models/builds.models' -import { useTRPCClient } from '@/trpc/client' import { useQuery } from '@tanstack/react-query' import { useCallback, useEffect, useRef } from 'react' import { useStore } from 'zustand' +import type { BuildStatusDTO } from '@/server/api/models/builds.models' +import { useTRPCClient } from '@/trpc/client' import { type BuildLogsStore, createBuildLogsStore } from './build-logs-store' -import { type LogLevelFilter } from './logs-filter-params' +import type { LogLevelFilter } from './logs-filter-params' const REFETCH_INTERVAL_MS = 1_500 diff --git a/src/features/dashboard/build/use-log-filters.ts b/src/features/dashboard/build/use-log-filters.ts index 6e855456c..cf65b6224 100644 --- a/src/features/dashboard/build/use-log-filters.ts +++ b/src/features/dashboard/build/use-log-filters.ts @@ -2,7 +2,10 @@ import { useQueryStates } from 'nuqs' import { useCallback } from 'react' -import { LogLevelFilter, buildLogsFilterParams } from './logs-filter-params' +import { + buildLogsFilterParams, + type LogLevelFilter, +} from './logs-filter-params' export default function useLogFilters() { const [filters, setFilters] = useQueryStates(buildLogsFilterParams, { diff --git a/src/features/dashboard/common/empty-frame.tsx b/src/features/dashboard/common/empty-frame.tsx index fe38735c8..ee78beb19 100644 --- a/src/features/dashboard/common/empty-frame.tsx +++ b/src/features/dashboard/common/empty-frame.tsx @@ -1,3 +1,4 @@ +import type { ReactNode } from 'react' import { cn } from '@/lib/utils' import { AsciiBackgroundPattern } from '@/ui/patterns' import { @@ -8,7 +9,6 @@ import { CardHeader, CardTitle, } from '@/ui/primitives/card' -import type { ReactNode } from 'react' interface DashboardEmptyFrameProps { title: ReactNode diff --git a/src/features/dashboard/common/resource-usage.tsx b/src/features/dashboard/common/resource-usage.tsx index 639bca3da..e88df4571 100644 --- a/src/features/dashboard/common/resource-usage.tsx +++ b/src/features/dashboard/common/resource-usage.tsx @@ -1,6 +1,6 @@ +import type React from 'react' import { cn } from '@/lib/utils' import { formatNumber } from '@/lib/utils/formatting' -import React from 'react' export interface ResourceUsageProps { type: 'cpu' | 'mem' | 'disk' diff --git a/src/features/dashboard/context.tsx b/src/features/dashboard/context.tsx index 2281e0435..ec8ec4505 100644 --- a/src/features/dashboard/context.tsx +++ b/src/features/dashboard/context.tsx @@ -1,8 +1,8 @@ 'use client' -import { ClientTeam } from '@/types/dashboard.types' -import { User } from '@supabase/supabase-js' -import { ReactNode, createContext, useContext, useState } from 'react' +import type { User } from '@supabase/supabase-js' +import { createContext, type ReactNode, useContext, useState } from 'react' +import type { ClientTeam } from '@/types/dashboard.types' interface DashboardContextValue { team: ClientTeam diff --git a/src/features/dashboard/dashboard-title-provider.tsx b/src/features/dashboard/dashboard-title-provider.tsx index 925c49fcb..21d018daa 100644 --- a/src/features/dashboard/dashboard-title-provider.tsx +++ b/src/features/dashboard/dashboard-title-provider.tsx @@ -1,8 +1,8 @@ 'use client' -import { METADATA } from '@/configs/metadata' import { usePathname } from 'next/navigation' import { useEffect, useMemo } from 'react' +import { METADATA } from '@/configs/metadata' import { useDashboard } from './context' /** diff --git a/src/features/dashboard/layouts/details-row.tsx b/src/features/dashboard/layouts/details-row.tsx index 83fb7127a..c5425f3a7 100644 --- a/src/features/dashboard/layouts/details-row.tsx +++ b/src/features/dashboard/layouts/details-row.tsx @@ -1,5 +1,5 @@ +import type { ReactNode } from 'react' import { cn } from '@/lib/utils/ui' -import { ReactNode } from 'react' interface DetailItemProps extends React.HTMLAttributes { label: string diff --git a/src/features/dashboard/layouts/footer.tsx b/src/features/dashboard/layouts/footer.tsx index f2965e862..a8675804a 100644 --- a/src/features/dashboard/layouts/footer.tsx +++ b/src/features/dashboard/layouts/footer.tsx @@ -1,8 +1,8 @@ 'use client' +import { usePathname } from 'next/navigation' import { getDashboardLayoutConfig } from '@/configs/layout' import { useDashboard } from '@/features/dashboard/context' -import { usePathname } from 'next/navigation' interface DashboardLayoutFooterProps { statusBanner: React.ReactNode diff --git a/src/features/dashboard/layouts/header.tsx b/src/features/dashboard/layouts/header.tsx index 595af2e67..4e4358259 100644 --- a/src/features/dashboard/layouts/header.tsx +++ b/src/features/dashboard/layouts/header.tsx @@ -1,13 +1,13 @@ 'use client' -import { TitleSegment, getDashboardLayoutConfig } from '@/configs/layout' +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import { Fragment } from 'react' +import { getDashboardLayoutConfig, type TitleSegment } from '@/configs/layout' import { cn } from '@/lib/utils' import ClientOnly from '@/ui/client-only' import { SidebarTrigger } from '@/ui/primitives/sidebar' import { ThemeSwitcher } from '@/ui/theme-switcher' -import Link from 'next/link' -import { usePathname } from 'next/navigation' -import { Fragment } from 'react' interface DashboardLayoutHeaderProps { className?: string diff --git a/src/features/dashboard/layouts/status-indicator.server.tsx b/src/features/dashboard/layouts/status-indicator.server.tsx index f650874c4..e5f0c1bc7 100644 --- a/src/features/dashboard/layouts/status-indicator.server.tsx +++ b/src/features/dashboard/layouts/status-indicator.server.tsx @@ -1,9 +1,9 @@ import 'server-only' -import { l } from '@/lib/clients/logger/logger' -import { LiveDot } from '@/ui/live' import { cacheLife } from 'next/cache' import Link from 'next/link' +import { l } from '@/lib/clients/logger/logger' +import { LiveDot } from '@/ui/live' const STATUS_PAGE_URL = 'https://status.e2b.dev' const STATUS_PAGE_INDEX_URL = `${STATUS_PAGE_URL}/index.json` diff --git a/src/features/dashboard/layouts/wrapper.tsx b/src/features/dashboard/layouts/wrapper.tsx index 6473d5317..2c6c4d078 100644 --- a/src/features/dashboard/layouts/wrapper.tsx +++ b/src/features/dashboard/layouts/wrapper.tsx @@ -1,8 +1,8 @@ 'use client' +import { usePathname } from 'next/navigation' import { getDashboardLayoutConfig } from '@/configs/layout' import { CatchErrorBoundary } from '@/ui/error' -import { usePathname } from 'next/navigation' export function DefaultDashboardLayout({ children, diff --git a/src/features/dashboard/limits/alert-card.tsx b/src/features/dashboard/limits/alert-card.tsx index 519b1cf59..c5fbdbb69 100644 --- a/src/features/dashboard/limits/alert-card.tsx +++ b/src/features/dashboard/limits/alert-card.tsx @@ -1,7 +1,7 @@ 'use client' import { useRouteParams } from '@/lib/hooks/use-route-params' -import { BillingLimit } from '@/types/billing.types' +import type { BillingLimit } from '@/types/billing.types' import { Card, CardContent, CardHeader, CardTitle } from '@/ui/primitives/card' import { useDashboard } from '../context' import LimitForm from './limit-form' diff --git a/src/features/dashboard/limits/limit-card.tsx b/src/features/dashboard/limits/limit-card.tsx index ef6232655..39bad9af3 100644 --- a/src/features/dashboard/limits/limit-card.tsx +++ b/src/features/dashboard/limits/limit-card.tsx @@ -1,7 +1,7 @@ 'use client' import { useRouteParams } from '@/lib/hooks/use-route-params' -import { BillingLimit } from '@/types/billing.types' +import type { BillingLimit } from '@/types/billing.types' import { Card, CardContent, CardHeader, CardTitle } from '@/ui/primitives/card' import { useDashboard } from '../context' import LimitForm from './limit-form' diff --git a/src/features/dashboard/limits/limit-form.tsx b/src/features/dashboard/limits/limit-form.tsx index 9eda7ac9c..428f24a80 100644 --- a/src/features/dashboard/limits/limit-form.tsx +++ b/src/features/dashboard/limits/limit-form.tsx @@ -1,5 +1,10 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import { useState } from 'react' +import { useForm } from 'react-hook-form' +import { z } from 'zod' import { defaultErrorToast, defaultSuccessToast, @@ -17,11 +22,6 @@ import { FormLabel, FormMessage, } from '@/ui/primitives/form' -import { zodResolver } from '@hookform/resolvers/zod' -import { useMutation, useQueryClient } from '@tanstack/react-query' -import { useState } from 'react' -import { useForm } from 'react-hook-form' -import { z } from 'zod' interface LimitFormProps { teamIdOrSlug: string diff --git a/src/features/dashboard/limits/usage-limits.tsx b/src/features/dashboard/limits/usage-limits.tsx index 9bc2486d5..814c7f5ef 100644 --- a/src/features/dashboard/limits/usage-limits.tsx +++ b/src/features/dashboard/limits/usage-limits.tsx @@ -1,10 +1,10 @@ 'use client' +import { useQuery } from '@tanstack/react-query' import { useRouteParams } from '@/lib/hooks/use-route-params' import { cn } from '@/lib/utils' import { useTRPC } from '@/trpc/client' import { Skeleton } from '@/ui/primitives/skeleton' -import { useQuery } from '@tanstack/react-query' import AlertCard from './alert-card' import LimitCard from './limit-card' diff --git a/src/features/dashboard/members/add-member-form.tsx b/src/features/dashboard/members/add-member-form.tsx index 90ae745e5..e73ff6d6c 100644 --- a/src/features/dashboard/members/add-member-form.tsx +++ b/src/features/dashboard/members/add-member-form.tsx @@ -1,5 +1,9 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useAction } from 'next-safe-action/hooks' +import { useForm } from 'react-hook-form' +import { z } from 'zod' import { defaultErrorToast, defaultSuccessToast, @@ -17,10 +21,6 @@ import { FormMessage, } from '@/ui/primitives/form' import { Input } from '@/ui/primitives/input' -import { zodResolver } from '@hookform/resolvers/zod' -import { useAction } from 'next-safe-action/hooks' -import { useForm } from 'react-hook-form' -import { z } from 'zod' import { useDashboard } from '../context' const addMemberSchema = z.object({ diff --git a/src/features/dashboard/members/member-table-row.tsx b/src/features/dashboard/members/member-table-row.tsx index 9c5755c15..83782682a 100644 --- a/src/features/dashboard/members/member-table-row.tsx +++ b/src/features/dashboard/members/member-table-row.tsx @@ -1,5 +1,8 @@ 'use client' +import { useRouter } from 'next/navigation' +import { useAction } from 'next-safe-action/hooks' +import { useState } from 'react' import { PROTECTED_URLS } from '@/configs/urls' import { defaultErrorToast, @@ -7,14 +10,11 @@ import { useToast, } from '@/lib/hooks/use-toast' import { removeTeamMemberAction } from '@/server/team/team-actions' -import { TeamMember } from '@/server/team/types' +import type { TeamMember } from '@/server/team/types' import { AlertDialog } from '@/ui/alert-dialog' import { Avatar, AvatarFallback, AvatarImage } from '@/ui/primitives/avatar' import { Button } from '@/ui/primitives/button' import { TableCell, TableRow } from '@/ui/primitives/table' -import { useAction } from 'next-safe-action/hooks' -import { useRouter } from 'next/navigation' -import { useState } from 'react' import { useDashboard } from '../context' interface TableRowProps { diff --git a/src/features/dashboard/members/member-table.tsx b/src/features/dashboard/members/member-table.tsx index 472b6fe1e..02bdff36d 100644 --- a/src/features/dashboard/members/member-table.tsx +++ b/src/features/dashboard/members/member-table.tsx @@ -1,3 +1,4 @@ +import { type FC, Suspense } from 'react' import { cn } from '@/lib/utils' import { Alert, AlertDescription, AlertTitle } from '@/ui/primitives/alert' import { Loader } from '@/ui/primitives/loader_d' @@ -9,7 +10,6 @@ import { TableHeader, TableRow, } from '@/ui/primitives/table' -import { FC, Suspense } from 'react' import MemberTableBody from './member-table-body' interface MemberTableProps { diff --git a/src/features/dashboard/navbar/dashboard-survey-popover.tsx b/src/features/dashboard/navbar/dashboard-survey-popover.tsx index 34255b946..29cc269ac 100644 --- a/src/features/dashboard/navbar/dashboard-survey-popover.tsx +++ b/src/features/dashboard/navbar/dashboard-survey-popover.tsx @@ -1,14 +1,14 @@ 'use client' +import { PopoverTrigger } from '@radix-ui/react-popover' +import { usePostHog } from 'posthog-js/react' +import { useCallback, useState } from 'react' +import { toast } from 'sonner' import { INCLUDE_DASHBOARD_FEEDBACK_SURVEY } from '@/configs/flags' import { useAppPostHogProvider } from '@/features/posthog-provider' import { l } from '@/lib/clients/logger/logger' import { Popover, PopoverContent } from '@/ui/primitives/popover' import { SurveyContent } from '@/ui/survey' -import { PopoverTrigger } from '@radix-ui/react-popover' -import { usePostHog } from 'posthog-js/react' -import { useCallback, useState } from 'react' -import { toast } from 'sonner' interface DashboardSurveyPopoverProps { trigger: React.ReactNode diff --git a/src/features/dashboard/navbar/report-issue-popover.tsx b/src/features/dashboard/navbar/report-issue-popover.tsx index e4b56bc2e..10933448d 100644 --- a/src/features/dashboard/navbar/report-issue-popover.tsx +++ b/src/features/dashboard/navbar/report-issue-popover.tsx @@ -1,5 +1,9 @@ 'use client' +import { useMutation } from '@tanstack/react-query' +import { usePostHog } from 'posthog-js/react' +import { useState } from 'react' +import { toast } from 'sonner' import { useTRPC } from '@/trpc/client' import { Button } from '@/ui/primitives/button' import { @@ -15,10 +19,6 @@ import { PopoverTrigger, } from '@/ui/primitives/popover' import { Textarea } from '@/ui/primitives/textarea' -import { useMutation } from '@tanstack/react-query' -import { usePostHog } from 'posthog-js/react' -import { useState } from 'react' -import { toast } from 'sonner' interface ReportIssuePopoverProps { trigger: React.ReactNode diff --git a/src/features/dashboard/sandbox/context.tsx b/src/features/dashboard/sandbox/context.tsx index 0798b870a..ff99f8151 100644 --- a/src/features/dashboard/sandbox/context.tsx +++ b/src/features/dashboard/sandbox/context.tsx @@ -1,17 +1,17 @@ 'use client' -import { MetricsResponse } from '@/app/api/teams/[teamId]/sandboxes/metrics/types' -import { SANDBOXES_DETAILS_METRICS_POLLING_MS } from '@/configs/intervals' -import { SandboxInfo } from '@/types/api.types' -import { ClientSandboxMetric } from '@/types/sandboxes.types' import { - ReactNode, createContext, + type ReactNode, useContext, useEffect, useState, } from 'react' import useSWR from 'swr' +import type { MetricsResponse } from '@/app/api/teams/[teamId]/sandboxes/metrics/types' +import { SANDBOXES_DETAILS_METRICS_POLLING_MS } from '@/configs/intervals' +import type { SandboxInfo } from '@/types/api.types' +import type { ClientSandboxMetric } from '@/types/sandboxes.types' import { useDashboard } from '../context' interface SandboxContextValue { diff --git a/src/features/dashboard/sandbox/header/header.tsx b/src/features/dashboard/sandbox/header/header.tsx index 64b384bc3..fdc04bce3 100644 --- a/src/features/dashboard/sandbox/header/header.tsx +++ b/src/features/dashboard/sandbox/header/header.tsx @@ -1,9 +1,9 @@ -import { COOKIE_KEYS } from '@/configs/cookies' -import { PROTECTED_URLS } from '@/configs/urls' -import { SandboxInfo } from '@/types/api.types' import { ChevronLeftIcon } from 'lucide-react' import { cookies } from 'next/headers' import Link from 'next/link' +import { COOKIE_KEYS } from '@/configs/cookies' +import { PROTECTED_URLS } from '@/configs/urls' +import type { SandboxInfo } from '@/types/api.types' import { DetailsItem, DetailsRow } from '../../layouts/details-row' import KillButton from './kill-button' import Metadata from './metadata' diff --git a/src/features/dashboard/sandbox/header/kill-button.tsx b/src/features/dashboard/sandbox/header/kill-button.tsx index 62c17f780..50214f095 100644 --- a/src/features/dashboard/sandbox/header/kill-button.tsx +++ b/src/features/dashboard/sandbox/header/kill-button.tsx @@ -1,12 +1,12 @@ 'use client' +import { useAction } from 'next-safe-action/hooks' +import { useState } from 'react' +import { toast } from 'sonner' import { killSandboxAction } from '@/server/sandboxes/sandbox-actions' import { AlertPopover } from '@/ui/alert-popover' import { Button } from '@/ui/primitives/button' import { TrashIcon } from '@/ui/primitives/icons' -import { useAction } from 'next-safe-action/hooks' -import { useState } from 'react' -import { toast } from 'sonner' import { useDashboard } from '../../context' import { useSandboxContext } from '../context' diff --git a/src/features/dashboard/sandbox/header/metadata.tsx b/src/features/dashboard/sandbox/header/metadata.tsx index a7cd914d7..0f09519e5 100644 --- a/src/features/dashboard/sandbox/header/metadata.tsx +++ b/src/features/dashboard/sandbox/header/metadata.tsx @@ -1,8 +1,8 @@ 'use client' +import { Braces, CircleSlash } from 'lucide-react' import { JsonPopover } from '@/ui/json-popover' import { Badge } from '@/ui/primitives/badge' -import { Braces, CircleSlash } from 'lucide-react' import { useSandboxContext } from '../context' export default function Metadata() { diff --git a/src/features/dashboard/sandbox/header/refresh.tsx b/src/features/dashboard/sandbox/header/refresh.tsx index 11cd10f8f..960643f32 100644 --- a/src/features/dashboard/sandbox/header/refresh.tsx +++ b/src/features/dashboard/sandbox/header/refresh.tsx @@ -1,9 +1,9 @@ 'use client' -import { l } from '@/lib/clients/logger/logger' -import { PollingButton } from '@/ui/polling-button' import { useCallback, useState } from 'react' import { serializeError } from 'serialize-error' +import { l } from '@/lib/clients/logger/logger' +import { PollingButton } from '@/ui/polling-button' import { useSandboxContext } from '../context' const pollingIntervals = [ diff --git a/src/features/dashboard/sandbox/header/remaining-time.tsx b/src/features/dashboard/sandbox/header/remaining-time.tsx index 764b0d16d..f90f64196 100644 --- a/src/features/dashboard/sandbox/header/remaining-time.tsx +++ b/src/features/dashboard/sandbox/header/remaining-time.tsx @@ -1,11 +1,11 @@ 'use client' -import { cn } from '@/lib/utils' -import { Badge } from '@/ui/primitives/badge' -import { Button } from '@/ui/primitives/button' import { RefreshCw, Square } from 'lucide-react' import { motion } from 'motion/react' import { useCallback, useEffect, useState } from 'react' +import { cn } from '@/lib/utils' +import { Badge } from '@/ui/primitives/badge' +import { Button } from '@/ui/primitives/button' import { useSandboxContext } from '../context' export default function RemainingTime() { diff --git a/src/features/dashboard/sandbox/header/resource-usage-client.tsx b/src/features/dashboard/sandbox/header/resource-usage-client.tsx index cc9e61060..b0257b603 100644 --- a/src/features/dashboard/sandbox/header/resource-usage-client.tsx +++ b/src/features/dashboard/sandbox/header/resource-usage-client.tsx @@ -1,8 +1,8 @@ 'use client' +import { memo, useMemo } from 'react' import type { ResourceUsageProps } from '@/features/dashboard/common/resource-usage' import ResourceUsage from '@/features/dashboard/common/resource-usage' -import { memo, useMemo } from 'react' import { useSandboxContext } from '../context' interface ResourceUsageClientProps extends ResourceUsageProps {} diff --git a/src/features/dashboard/sandbox/header/status.tsx b/src/features/dashboard/sandbox/header/status.tsx index 2eb70507b..d400d3013 100644 --- a/src/features/dashboard/sandbox/header/status.tsx +++ b/src/features/dashboard/sandbox/header/status.tsx @@ -1,7 +1,7 @@ 'use client' -import { Badge } from '@/ui/primitives/badge' import { Circle, Square } from 'lucide-react' +import { Badge } from '@/ui/primitives/badge' import { useSandboxContext } from '../context' export default function Status() { diff --git a/src/features/dashboard/sandbox/header/template-id.tsx b/src/features/dashboard/sandbox/header/template-id.tsx index d235ea179..fa254285c 100644 --- a/src/features/dashboard/sandbox/header/template-id.tsx +++ b/src/features/dashboard/sandbox/header/template-id.tsx @@ -1,8 +1,8 @@ 'use client' +import { useMemo } from 'react' import CopyButton from '@/ui/copy-button' import { Badge } from '@/ui/primitives/badge' -import { useMemo } from 'react' import { useSandboxContext } from '../context' export default function TemplateId() { diff --git a/src/features/dashboard/sandbox/inspect/context.tsx b/src/features/dashboard/sandbox/inspect/context.tsx index b8da5141f..def3b587c 100644 --- a/src/features/dashboard/sandbox/inspect/context.tsx +++ b/src/features/dashboard/sandbox/inspect/context.tsx @@ -1,25 +1,25 @@ 'use client' -import { SUPABASE_AUTH_HEADERS } from '@/configs/api' -import { AUTH_URLS } from '@/configs/urls' -import { supabase } from '@/lib/clients/supabase/client' -import { useSandboxInspectAnalytics } from '@/lib/hooks/use-analytics' -import { getParentPath, normalizePath } from '@/lib/utils/filesystem' -import Sandbox, { EntryInfo } from 'e2b' +import Sandbox, { type EntryInfo } from 'e2b' import { useRouter } from 'next/navigation' import { - ReactNode, createContext, + type ReactNode, useCallback, useContext, useEffect, useMemo, useRef, } from 'react' +import { SUPABASE_AUTH_HEADERS } from '@/configs/api' +import { AUTH_URLS } from '@/configs/urls' +import { supabase } from '@/lib/clients/supabase/client' +import { useSandboxInspectAnalytics } from '@/lib/hooks/use-analytics' +import { getParentPath, normalizePath } from '@/lib/utils/filesystem' import { useDashboard } from '../../context' import { useSandboxContext } from '../context' -import { type FilesystemStore, createFilesystemStore } from './filesystem/store' -import { FilesystemNode, FilesystemOperations } from './filesystem/types' +import { createFilesystemStore, type FilesystemStore } from './filesystem/store' +import type { FilesystemNode, FilesystemOperations } from './filesystem/types' import { SandboxManager } from './sandbox-manager' interface SandboxInspectContextValue { diff --git a/src/features/dashboard/sandbox/inspect/dir.tsx b/src/features/dashboard/sandbox/inspect/dir.tsx index 437245a63..6cf5ac1ac 100644 --- a/src/features/dashboard/sandbox/inspect/dir.tsx +++ b/src/features/dashboard/sandbox/inspect/dir.tsx @@ -1,11 +1,11 @@ 'use client' -import { cn } from '@/lib/utils' -import { DataTableRow } from '@/ui/data-table' import { AlertCircle, FolderClosed, FolderOpen } from 'lucide-react' import { AnimatePresence, motion } from 'motion/react' +import { cn } from '@/lib/utils' +import { DataTableRow } from '@/ui/data-table' import SandboxInspectEmptyNode from './empty-node' -import { FilesystemNode } from './filesystem/types' +import type { FilesystemNode } from './filesystem/types' import { useDirectory } from './hooks/use-directory' import SandboxInspectNode from './node' import NodeLabel from './node-label' diff --git a/src/features/dashboard/sandbox/inspect/empty.tsx b/src/features/dashboard/sandbox/inspect/empty.tsx index 2d53961a5..f75a574be 100644 --- a/src/features/dashboard/sandbox/inspect/empty.tsx +++ b/src/features/dashboard/sandbox/inspect/empty.tsx @@ -1,7 +1,7 @@ 'use client' -import DashboardEmptyFrame from '@/features/dashboard/common/empty-frame' import type { ReactNode } from 'react' +import DashboardEmptyFrame from '@/features/dashboard/common/empty-frame' interface SandboxInspectEmptyFrameProps { title: ReactNode diff --git a/src/features/dashboard/sandbox/inspect/file.tsx b/src/features/dashboard/sandbox/inspect/file.tsx index c6ef4e1df..f420c0506 100644 --- a/src/features/dashboard/sandbox/inspect/file.tsx +++ b/src/features/dashboard/sandbox/inspect/file.tsx @@ -1,9 +1,9 @@ 'use client' +import { AlertCircle, FileIcon } from 'lucide-react' import { cn } from '@/lib/utils' import { DataTableRow } from '@/ui/data-table' -import { AlertCircle, FileIcon } from 'lucide-react' -import { FilesystemNode } from './filesystem/types' +import type { FilesystemNode } from './filesystem/types' import { useFile } from './hooks/use-file' import NodeLabel from './node-label' diff --git a/src/features/dashboard/sandbox/inspect/filesystem/store.ts b/src/features/dashboard/sandbox/inspect/filesystem/store.ts index e26591844..0cce133e2 100644 --- a/src/features/dashboard/sandbox/inspect/filesystem/store.ts +++ b/src/features/dashboard/sandbox/inspect/filesystem/store.ts @@ -1,15 +1,15 @@ 'use client' +import { enableMapSet } from 'immer' +import { create } from 'zustand' +import { immer } from 'zustand/middleware/immer' import { getBasename, getParentPath, isChildPath, normalizePath, } from '@/lib/utils/filesystem' -import { enableMapSet } from 'immer' -import { create } from 'zustand' -import { immer } from 'zustand/middleware/immer' -import { FilesystemNode } from './types' +import type { FilesystemNode } from './types' enableMapSet() diff --git a/src/features/dashboard/sandbox/inspect/frame.tsx b/src/features/dashboard/sandbox/inspect/frame.tsx index 9f5d173bd..b6b560fdb 100644 --- a/src/features/dashboard/sandbox/inspect/frame.tsx +++ b/src/features/dashboard/sandbox/inspect/frame.tsx @@ -1,8 +1,8 @@ 'use client' -import { cn } from '@/lib/utils' import { motion } from 'motion/react' -import React from 'react' +import type React from 'react' +import { cn } from '@/lib/utils' type SandboxInspectFrameProps = React.ComponentProps & { header: React.ReactNode diff --git a/src/features/dashboard/sandbox/inspect/hooks/use-directory.ts b/src/features/dashboard/sandbox/inspect/hooks/use-directory.ts index e0cb94a72..bd7d66f6c 100644 --- a/src/features/dashboard/sandbox/inspect/hooks/use-directory.ts +++ b/src/features/dashboard/sandbox/inspect/hooks/use-directory.ts @@ -3,7 +3,7 @@ import { useMemo } from 'react' import { useStore } from 'zustand' import { useSandboxInspectContext } from '../context' -import { FilesystemNode } from '../filesystem/types' +import type { FilesystemNode } from '../filesystem/types' /** * Hook for accessing directory children with automatic updates diff --git a/src/features/dashboard/sandbox/inspect/incompatible.tsx b/src/features/dashboard/sandbox/inspect/incompatible.tsx index bb182b8af..18a2639b2 100644 --- a/src/features/dashboard/sandbox/inspect/incompatible.tsx +++ b/src/features/dashboard/sandbox/inspect/incompatible.tsx @@ -1,5 +1,9 @@ 'use client' +import { AlertTriangle, ArrowUpRight, ChevronLeft } from 'lucide-react' +import { motion } from 'motion/react' +import Link from 'next/link' +import { useEffect } from 'react' import { HELP_URLS, PROTECTED_URLS } from '@/configs/urls' import { useSandboxInspectAnalytics } from '@/lib/hooks/use-analytics' import { CodeBlock } from '@/ui/code-block' @@ -14,10 +18,6 @@ import { CardHeader, CardTitle, } from '@/ui/primitives/card' -import { AlertTriangle, ArrowUpRight, ChevronLeft } from 'lucide-react' -import { motion } from 'motion/react' -import Link from 'next/link' -import { useEffect } from 'react' interface SandboxInspectIncompatibleProps { templateNameOrId?: string diff --git a/src/features/dashboard/sandbox/inspect/node-label.tsx b/src/features/dashboard/sandbox/inspect/node-label.tsx index 835a84b09..94fcf8c86 100644 --- a/src/features/dashboard/sandbox/inspect/node-label.tsx +++ b/src/features/dashboard/sandbox/inspect/node-label.tsx @@ -1,5 +1,5 @@ +import type { CSSProperties } from 'react' import { cn } from '@/lib/utils' -import { CSSProperties } from 'react' interface NodeLabelProps { name: string diff --git a/src/features/dashboard/sandbox/inspect/not-found.tsx b/src/features/dashboard/sandbox/inspect/not-found.tsx index f70ae8b2e..55acaa472 100644 --- a/src/features/dashboard/sandbox/inspect/not-found.tsx +++ b/src/features/dashboard/sandbox/inspect/not-found.tsx @@ -1,14 +1,14 @@ 'use client' +import { ArrowLeft, ArrowUp, Home, RefreshCw } from 'lucide-react' +import { useParams, useRouter } from 'next/navigation' +import { useCallback, useEffect, useState, useTransition } from 'react' +import { serializeError } from 'serialize-error' import { PROTECTED_URLS } from '@/configs/urls' import { l } from '@/lib/clients/logger/logger' import { useSandboxInspectAnalytics } from '@/lib/hooks/use-analytics' import { cn } from '@/lib/utils' import { Button } from '@/ui/primitives/button' -import { ArrowLeft, ArrowUp, Home, RefreshCw } from 'lucide-react' -import { useParams, useRouter } from 'next/navigation' -import { useCallback, useEffect, useState, useTransition } from 'react' -import { serializeError } from 'serialize-error' import { useSandboxContext } from '../context' import SandboxInspectEmptyFrame from './empty' diff --git a/src/features/dashboard/sandbox/inspect/parent-dir-item.tsx b/src/features/dashboard/sandbox/inspect/parent-dir-item.tsx index e1aa55b7c..e2f6fb17c 100644 --- a/src/features/dashboard/sandbox/inspect/parent-dir-item.tsx +++ b/src/features/dashboard/sandbox/inspect/parent-dir-item.tsx @@ -1,11 +1,11 @@ 'use client' -import path from 'path' -import { cn } from '@/lib/utils' -import { DataTableRow } from '@/ui/data-table' import { FolderUp } from 'lucide-react' import { useRouter } from 'next/navigation' +import path from 'path' import { useTransition } from 'react' +import { cn } from '@/lib/utils' +import { DataTableRow } from '@/ui/data-table' interface SandboxInspectParentDirItemProps { rootPath: string diff --git a/src/features/dashboard/sandbox/inspect/root-path-input.tsx b/src/features/dashboard/sandbox/inspect/root-path-input.tsx index d00c8babf..54739602d 100644 --- a/src/features/dashboard/sandbox/inspect/root-path-input.tsx +++ b/src/features/dashboard/sandbox/inspect/root-path-input.tsx @@ -1,15 +1,15 @@ 'use client' +import { ArrowRight } from 'lucide-react' +import { useRouter } from 'next/navigation' +import { useEffect, useState, useTransition } from 'react' +import { serializeError } from 'serialize-error' import { l } from '@/lib/clients/logger/logger' import { useSandboxInspectAnalytics } from '@/lib/hooks/use-analytics' import { cn } from '@/lib/utils' import { Button } from '@/ui/primitives/button' import { Input } from '@/ui/primitives/input' import { Loader } from '@/ui/primitives/loader_d' -import { ArrowRight } from 'lucide-react' -import { useRouter } from 'next/navigation' -import { useEffect, useState, useTransition } from 'react' -import { serializeError } from 'serialize-error' interface RootPathInputProps { className?: string diff --git a/src/features/dashboard/sandbox/inspect/sandbox-manager.ts b/src/features/dashboard/sandbox/inspect/sandbox-manager.ts index a9041fe38..ff04ef507 100644 --- a/src/features/dashboard/sandbox/inspect/sandbox-manager.ts +++ b/src/features/dashboard/sandbox/inspect/sandbox-manager.ts @@ -1,9 +1,3 @@ -import { - determineFileContentState, - getParentPath, - joinPath, - normalizePath, -} from '@/lib/utils/filesystem' import { type EntryInfo, type FilesystemEvent, @@ -11,11 +5,17 @@ import { type Sandbox, type WatchHandle, } from 'e2b' +import { + determineFileContentState, + getParentPath, + joinPath, + normalizePath, +} from '@/lib/utils/filesystem' import { type FilesystemStore, MAX_VIEWABLE_FILE_SIZE_BYTES, } from './filesystem/store' -import { FilesystemNode } from './filesystem/types' +import type { FilesystemNode } from './filesystem/types' export const HANDLED_ERRORS = { 'signal timed out': 'The operation timed out. Please try again later.', diff --git a/src/features/dashboard/sandbox/inspect/stopped-banner.tsx b/src/features/dashboard/sandbox/inspect/stopped-banner.tsx index f0190a77c..f45fe6811 100644 --- a/src/features/dashboard/sandbox/inspect/stopped-banner.tsx +++ b/src/features/dashboard/sandbox/inspect/stopped-banner.tsx @@ -1,5 +1,8 @@ 'use client' +import { AlertTriangle } from 'lucide-react' +import { AnimatePresence, motion } from 'motion/react' +import { useMemo } from 'react' import { cn } from '@/lib/utils' import { CardDescription, @@ -7,9 +10,6 @@ import { CardTitle, cardVariants, } from '@/ui/primitives/card' -import { AlertTriangle } from 'lucide-react' -import { AnimatePresence, motion } from 'motion/react' -import { useMemo } from 'react' import { useSandboxContext } from '../context' import { useLastUpdated, useWatcherError } from './hooks/use-watcher' diff --git a/src/features/dashboard/sandbox/inspect/view.tsx b/src/features/dashboard/sandbox/inspect/view.tsx index ccc3f9867..0753795df 100644 --- a/src/features/dashboard/sandbox/inspect/view.tsx +++ b/src/features/dashboard/sandbox/inspect/view.tsx @@ -1,10 +1,10 @@ 'use client' +import type { EntryInfo } from 'e2b' import SandboxInspectProvider from '@/features/dashboard/sandbox/inspect/context' import SandboxInspectFilesystem from '@/features/dashboard/sandbox/inspect/filesystem' import SandboxInspectViewer from '@/features/dashboard/sandbox/inspect/viewer' import { cn } from '@/lib/utils' -import type { EntryInfo } from 'e2b' interface SandboxInspectViewProps { rootPath: string diff --git a/src/features/dashboard/sandbox/inspect/viewer-header.tsx b/src/features/dashboard/sandbox/inspect/viewer-header.tsx index 7a8c4fd55..34e5e1aab 100644 --- a/src/features/dashboard/sandbox/inspect/viewer-header.tsx +++ b/src/features/dashboard/sandbox/inspect/viewer-header.tsx @@ -1,8 +1,8 @@ -import CopyButton from '@/ui/copy-button' -import { Button } from '@/ui/primitives/button' import { Download, FileIcon, RefreshCcw, X } from 'lucide-react' import { motion } from 'motion/react' -import { FileContentState } from './filesystem/store' +import CopyButton from '@/ui/copy-button' +import { Button } from '@/ui/primitives/button' +import type { FileContentState } from './filesystem/store' interface SandboxInspectViewerHeaderProps { name: string diff --git a/src/features/dashboard/sandbox/inspect/viewer.tsx b/src/features/dashboard/sandbox/inspect/viewer.tsx index 0b19019ed..bed8b5606 100644 --- a/src/features/dashboard/sandbox/inspect/viewer.tsx +++ b/src/features/dashboard/sandbox/inspect/viewer.tsx @@ -1,15 +1,15 @@ 'use client' +import { AnimatePresence } from 'framer-motion' +import { Download } from 'lucide-react' +import { useEffect, useState } from 'react' +import ShikiHighlighter, { type Language } from 'react-shiki' import { useShikiTheme } from '@/configs/shiki' import { useIsMobile } from '@/lib/hooks/use-mobile' import { cn } from '@/lib/utils' import { Button } from '@/ui/primitives/button' import { Drawer, DrawerContent } from '@/ui/primitives/drawer' import { ScrollArea, ScrollBar } from '@/ui/primitives/scroll-area' -import { AnimatePresence } from 'framer-motion' -import { Download } from 'lucide-react' -import { useEffect, useState } from 'react' -import ShikiHighlighter, { Language } from 'react-shiki' import { MAX_VIEWABLE_FILE_SIZE_BYTES, diff --git a/src/features/dashboard/sandbox/layout.tsx b/src/features/dashboard/sandbox/layout.tsx index 68f94cf6d..2106c7acf 100644 --- a/src/features/dashboard/sandbox/layout.tsx +++ b/src/features/dashboard/sandbox/layout.tsx @@ -1,9 +1,9 @@ 'use client' +import { notFound } from 'next/navigation' import { SANDBOX_INSPECT_MINIMUM_ENVD_VERSION } from '@/configs/versioning' import { isVersionCompatible } from '@/lib/utils/version' import { DashboardTab, DashboardTabs } from '@/ui/dashboard-tabs' -import { notFound } from 'next/navigation' import { useSandboxContext } from './context' import SandboxInspectIncompatible from './inspect/incompatible' diff --git a/src/features/dashboard/sandboxes/list/empty.tsx b/src/features/dashboard/sandboxes/list/empty.tsx index 50260d08c..cd49ba8e9 100644 --- a/src/features/dashboard/sandboxes/list/empty.tsx +++ b/src/features/dashboard/sandboxes/list/empty.tsx @@ -1,5 +1,5 @@ -import DashboardEmptyFrame from '@/features/dashboard/common/empty-frame' import type { ReactNode } from 'react' +import DashboardEmptyFrame from '@/features/dashboard/common/empty-frame' interface SandboxesListEmptyProps { title: ReactNode diff --git a/src/features/dashboard/sandboxes/list/header.tsx b/src/features/dashboard/sandboxes/list/header.tsx index 3ce8b98ef..77d971b10 100644 --- a/src/features/dashboard/sandboxes/list/header.tsx +++ b/src/features/dashboard/sandboxes/list/header.tsx @@ -1,5 +1,5 @@ -import { PollingButton } from '@/ui/polling-button' import { Suspense } from 'react' +import { PollingButton } from '@/ui/polling-button' import { sandboxListPollingIntervals, useSandboxListTableStore, diff --git a/src/features/dashboard/sandboxes/list/hooks/use-sandboxes-metrics.tsx b/src/features/dashboard/sandboxes/list/hooks/use-sandboxes-metrics.tsx index eedb897d4..587d62bb4 100644 --- a/src/features/dashboard/sandboxes/list/hooks/use-sandboxes-metrics.tsx +++ b/src/features/dashboard/sandboxes/list/hooks/use-sandboxes-metrics.tsx @@ -1,11 +1,11 @@ 'use client' +import { useQuery } from '@tanstack/react-query' +import { useEffect, useMemo, useRef } from 'react' import { SANDBOXES_METRICS_POLLING_MS } from '@/configs/intervals' import { areStringArraysEqual } from '@/lib/utils/array' import { useTRPC } from '@/trpc/client' import type { Sandboxes } from '@/types/api.types' -import { useQuery } from '@tanstack/react-query' -import { useEffect, useMemo, useRef } from 'react' import { useDashboard } from '../../../context' import { useSandboxMetricsStore } from '../stores/metrics-store' diff --git a/src/features/dashboard/sandboxes/list/stores/metrics-store.ts b/src/features/dashboard/sandboxes/list/stores/metrics-store.ts index 8f764010a..d436ab01f 100644 --- a/src/features/dashboard/sandboxes/list/stores/metrics-store.ts +++ b/src/features/dashboard/sandboxes/list/stores/metrics-store.ts @@ -1,7 +1,7 @@ 'use client' -import { ClientSandboxesMetrics } from '@/types/sandboxes.types' import { create } from 'zustand' +import type { ClientSandboxesMetrics } from '@/types/sandboxes.types' // maximum number of sandbox metrics to keep in memory // this is to prevent the store from growing too large and causing performance issues diff --git a/src/features/dashboard/sandboxes/list/stores/table-store.ts b/src/features/dashboard/sandboxes/list/stores/table-store.ts index 434cda55a..8ae62ac09 100644 --- a/src/features/dashboard/sandboxes/list/stores/table-store.ts +++ b/src/features/dashboard/sandboxes/list/stores/table-store.ts @@ -1,10 +1,10 @@ 'use client' -import { areStringArraysEqual } from '@/lib/utils/array' -import { createHashStorage } from '@/lib/utils/store' import type { OnChangeFn, SortingState } from '@tanstack/react-table' import { create } from 'zustand' import { createJSONStorage, persist } from 'zustand/middleware' +import { areStringArraysEqual } from '@/lib/utils/array' +import { createHashStorage } from '@/lib/utils/store' import { trackSandboxListInteraction } from '../tracking' export const sandboxListPollingIntervals = [ diff --git a/src/features/dashboard/sandboxes/list/table-body.tsx b/src/features/dashboard/sandboxes/list/table-body.tsx index 5b7899583..62dd511c3 100644 --- a/src/features/dashboard/sandboxes/list/table-body.tsx +++ b/src/features/dashboard/sandboxes/list/table-body.tsx @@ -1,8 +1,8 @@ +import { ExternalLink, X } from 'lucide-react' +import type { RefObject } from 'react' import { useVirtualRows } from '@/lib/hooks/use-virtual-rows' import { DataTableBody } from '@/ui/data-table' import { Button } from '@/ui/primitives/button' -import { ExternalLink, X } from 'lucide-react' -import { type RefObject } from 'react' import SandboxesListEmpty from './empty' import { useSandboxesMetrics } from './hooks/use-sandboxes-metrics' import { useSandboxListTableStore } from './stores/table-store' diff --git a/src/features/dashboard/sandboxes/list/table-cells.tsx b/src/features/dashboard/sandboxes/list/table-cells.tsx index 31e5e87ac..61363d7f3 100644 --- a/src/features/dashboard/sandboxes/list/table-cells.tsx +++ b/src/features/dashboard/sandboxes/list/table-cells.tsx @@ -1,15 +1,15 @@ 'use client' +import type { CellContext } from '@tanstack/react-table' +import { ArrowUpRight } from 'lucide-react' +import { useRouter } from 'next/navigation' +import { useMemo } from 'react' import { PROTECTED_URLS } from '@/configs/urls' import ResourceUsage from '@/features/dashboard/common/resource-usage' import { useTemplateTableStore } from '@/features/dashboard/templates/list/stores/table-store' import { formatLocalLogStyleTimestamp } from '@/lib/utils/formatting' import { JsonPopover } from '@/ui/json-popover' import { Button } from '@/ui/primitives/button' -import type { CellContext } from '@tanstack/react-table' -import { ArrowUpRight } from 'lucide-react' -import { useRouter } from 'next/navigation' -import { useMemo } from 'react' import { useDashboard } from '../../context' import { useSandboxMetricsStore } from './stores/metrics-store' import type { SandboxListRow } from './table-config' diff --git a/src/features/dashboard/sandboxes/list/table-config.tsx b/src/features/dashboard/sandboxes/list/table-config.tsx index dc06ee9a8..b2fa5a0ca 100644 --- a/src/features/dashboard/sandboxes/list/table-config.tsx +++ b/src/features/dashboard/sandboxes/list/table-config.tsx @@ -1,10 +1,10 @@ 'use client' -import type { Sandbox } from '@/types/api.types' import { rankItem } from '@tanstack/match-sorter-utils' -import { ColumnDef, FilterFn, type Table } from '@tanstack/react-table' +import type { ColumnDef, FilterFn, Table } from '@tanstack/react-table' import { isWithinInterval } from 'date-fns' import type { DateRange } from 'react-day-picker' +import type { Sandbox } from '@/types/api.types' import { CpuUsageCell, diff --git a/src/features/dashboard/sandboxes/list/table-filters.tsx b/src/features/dashboard/sandboxes/list/table-filters.tsx index 447f20172..4d06a2e19 100644 --- a/src/features/dashboard/sandboxes/list/table-filters.tsx +++ b/src/features/dashboard/sandboxes/list/table-filters.tsx @@ -1,5 +1,9 @@ -import { useSandboxListTableStore } from '@/features/dashboard/sandboxes/list/stores/table-store' +import { ListFilter, Plus } from 'lucide-react' +import * as React from 'react' +import { memo, useCallback } from 'react' +import { useDebounceValue } from 'usehooks-ts' import type { SandboxStartedAtFilter } from '@/features/dashboard/sandboxes/list/stores/table-store' +import { useSandboxListTableStore } from '@/features/dashboard/sandboxes/list/stores/table-store' import { cn } from '@/lib/utils' import { formatCPUCores, formatMemory } from '@/lib/utils/formatting' import { NumberInput } from '@/ui/number-input' @@ -20,10 +24,6 @@ import { Input } from '@/ui/primitives/input' import { Label } from '@/ui/primitives/label' import { Separator } from '@/ui/primitives/separator' import { TableFilterButton } from '@/ui/table-filter-button' -import { ListFilter, Plus } from 'lucide-react' -import * as React from 'react' -import { memo, useCallback } from 'react' -import { useDebounceValue } from 'usehooks-ts' // Components const RunningSinceFilter = memo(function RunningSinceFilter() { diff --git a/src/features/dashboard/sandboxes/list/table-row.tsx b/src/features/dashboard/sandboxes/list/table-row.tsx index 8c78ee3ed..10af6f888 100644 --- a/src/features/dashboard/sandboxes/list/table-row.tsx +++ b/src/features/dashboard/sandboxes/list/table-row.tsx @@ -1,9 +1,9 @@ +import { flexRender, type Row } from '@tanstack/react-table' +import Link from 'next/link' +import { memo } from 'react' import { PROTECTED_URLS } from '@/configs/urls' import { useRouteParams } from '@/lib/hooks/use-route-params' import { DataTableCell, DataTableRow } from '@/ui/data-table' -import { type Row, flexRender } from '@tanstack/react-table' -import Link from 'next/link' -import { memo } from 'react' import type { SandboxListRow } from './table-config' interface SandboxesTableRowProps { diff --git a/src/features/dashboard/sandboxes/list/table-search.tsx b/src/features/dashboard/sandboxes/list/table-search.tsx index eb79e38dc..5402deb07 100644 --- a/src/features/dashboard/sandboxes/list/table-search.tsx +++ b/src/features/dashboard/sandboxes/list/table-search.tsx @@ -1,8 +1,8 @@ +import { useCallback, useRef } from 'react' import { useSandboxListTableStore } from '@/features/dashboard/sandboxes/list/stores/table-store' import useKeydown from '@/lib/hooks/use-keydown' import { DebouncedInput } from '@/ui/primitives/input' import { Kbd } from '@/ui/primitives/kbd' -import { useCallback, useRef } from 'react' export const SearchInput = () => { const globalFilter = useSandboxListTableStore((state) => state.globalFilter) diff --git a/src/features/dashboard/sandboxes/list/table.tsx b/src/features/dashboard/sandboxes/list/table.tsx index 1fcaf9b22..e230ab359 100644 --- a/src/features/dashboard/sandboxes/list/table.tsx +++ b/src/features/dashboard/sandboxes/list/table.tsx @@ -1,18 +1,5 @@ 'use client' -import { useSandboxListTableStore } from '@/features/dashboard/sandboxes/list/stores/table-store' -import { useColumnSizeVars } from '@/lib/hooks/use-column-size-vars' -import { useRouteParams } from '@/lib/hooks/use-route-params' -import { cn } from '@/lib/utils' -import { useTRPC } from '@/trpc/client' -import ClientOnly from '@/ui/client-only' -import { - DataTable, - DataTableHead, - DataTableHeader, - DataTableRow, -} from '@/ui/data-table' -import { SIDEBAR_TRANSITION_CLASSNAMES } from '@/ui/primitives/sidebar' import { keepPreviousData, useSuspenseQuery } from '@tanstack/react-query' import { type ColumnFiltersState, @@ -26,12 +13,25 @@ import { import { subHours } from 'date-fns' import { useEffect, useMemo, useRef } from 'react' import { useLocalStorage } from 'usehooks-ts' +import { useSandboxListTableStore } from '@/features/dashboard/sandboxes/list/stores/table-store' +import { useColumnSizeVars } from '@/lib/hooks/use-column-size-vars' +import { useRouteParams } from '@/lib/hooks/use-route-params' +import { cn } from '@/lib/utils' +import { useTRPC } from '@/trpc/client' +import ClientOnly from '@/ui/client-only' +import { + DataTable, + DataTableHead, + DataTableHeader, + DataTableRow, +} from '@/ui/data-table' +import { SIDEBAR_TRANSITION_CLASSNAMES } from '@/ui/primitives/sidebar' import { SandboxesHeader } from './header' -import { getSandboxListEffectiveSorting } from './stores/table-store' import type { SandboxStartedAtFilter } from './stores/table-store' +import { getSandboxListEffectiveSorting } from './stores/table-store' import { SandboxesTableBody } from './table-body' -import { sandboxIdFuzzyFilter, sandboxListColumns } from './table-config' import type { SandboxListRow } from './table-config' +import { sandboxIdFuzzyFilter, sandboxListColumns } from './table-config' const STARTED_AT_FILTER_HOURS: Record< Exclude, diff --git a/src/features/dashboard/sandboxes/live-counter.client.tsx b/src/features/dashboard/sandboxes/live-counter.client.tsx index 251a3d9fc..c35f0d658 100644 --- a/src/features/dashboard/sandboxes/live-counter.client.tsx +++ b/src/features/dashboard/sandboxes/live-counter.client.tsx @@ -1,8 +1,8 @@ 'use client' -import { getTeamMetrics } from '@/server/sandboxes/get-team-metrics' -import { InferSafeActionFnResult } from 'next-safe-action' -import { NonUndefined } from 'react-hook-form' +import type { InferSafeActionFnResult } from 'next-safe-action' +import type { NonUndefined } from 'react-hook-form' +import type { getTeamMetrics } from '@/server/sandboxes/get-team-metrics' import { LiveSandboxCounter } from './live-counter' import { useRecentMetrics } from './monitoring/hooks/use-recent-metrics' diff --git a/src/features/dashboard/sandboxes/live-counter.server.tsx b/src/features/dashboard/sandboxes/live-counter.server.tsx index cb7954985..5d0c6bd20 100644 --- a/src/features/dashboard/sandboxes/live-counter.server.tsx +++ b/src/features/dashboard/sandboxes/live-counter.server.tsx @@ -1,9 +1,9 @@ +import { Suspense } from 'react' import { l } from '@/lib/clients/logger/logger' import { cn } from '@/lib/utils' import { getNowMemo } from '@/lib/utils/server' import { getTeamMetrics } from '@/server/sandboxes/get-team-metrics' import { Skeleton } from '@/ui/primitives/skeleton' -import { Suspense } from 'react' import { LiveSandboxCounterClient } from './live-counter.client' interface LiveSandboxCounterServerProps { diff --git a/src/features/dashboard/sandboxes/monitoring/charts-context.tsx b/src/features/dashboard/sandboxes/monitoring/charts-context.tsx index 207cd9174..f2e6aeaf9 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts-context.tsx +++ b/src/features/dashboard/sandboxes/monitoring/charts-context.tsx @@ -1,8 +1,14 @@ 'use client' -import { TeamMetricsResponse } from '@/app/api/teams/[teamId]/metrics/types' -import { ReactNode, createContext, useContext, useMemo, useState } from 'react' +import { + createContext, + type ReactNode, + useContext, + useMemo, + useState, +} from 'react' import useSWR from 'swr' +import type { TeamMetricsResponse } from '@/app/api/teams/[teamId]/metrics/types' import { useDashboard } from '../../context' import { useTimeframe } from './hooks/use-timeframe' diff --git a/src/features/dashboard/sandboxes/monitoring/charts/animated-metric-display.tsx b/src/features/dashboard/sandboxes/monitoring/charts/animated-metric-display.tsx index 448253473..0541eb8aa 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/animated-metric-display.tsx +++ b/src/features/dashboard/sandboxes/monitoring/charts/animated-metric-display.tsx @@ -1,8 +1,8 @@ 'use client' -import { AnimatedNumber } from '@/ui/primitives/animated-number' import { AnimatePresence, motion } from 'motion/react' import { memo } from 'react' +import { AnimatedNumber } from '@/ui/primitives/animated-number' interface AnimatedMetricDisplayProps { value: string | number diff --git a/src/features/dashboard/sandboxes/monitoring/charts/charts.tsx b/src/features/dashboard/sandboxes/monitoring/charts/charts.tsx index 8e407784e..a858d5ede 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/charts.tsx +++ b/src/features/dashboard/sandboxes/monitoring/charts/charts.tsx @@ -1,7 +1,7 @@ +import { Suspense } from 'react' import { TEAM_METRICS_INITIAL_RANGE_MS } from '@/configs/intervals' import { getTeamMetrics } from '@/server/sandboxes/get-team-metrics' import { getTeamLimits } from '@/server/team/get-team-limits' -import { Suspense } from 'react' import { TeamMetricsChartsProvider } from '../charts-context' import ConcurrentChartClient from './concurrent-chart' import ChartFallback from './fallback' diff --git a/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/components/time-range-selector.tsx b/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/components/time-range-selector.tsx index cffec4ac3..9adb5eb50 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/components/time-range-selector.tsx +++ b/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/components/time-range-selector.tsx @@ -1,8 +1,8 @@ import { cn } from '@/lib/utils' import { TIME_RANGES, - type TimeRangeKey, type TimeframeState, + type TimeRangeKey, } from '@/lib/utils/timeframe' import { Button } from '@/ui/primitives/button' import { TimePicker } from '../../../time-picker' diff --git a/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/hooks.ts b/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/hooks.ts index 19a38a758..e61da8ceb 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/hooks.ts +++ b/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/hooks.ts @@ -1,7 +1,7 @@ +import { useMemo } from 'react' import type { TeamMetricsResponse } from '@/app/api/teams/[teamId]/metrics/types' import { formatCompactDate, formatNumber } from '@/lib/utils/formatting' import { formatTimeframeAsISO8601Interval } from '@/lib/utils/timeframe' -import { useMemo } from 'react' import { transformMetrics } from '../team-metrics-chart' import { calculateAverage } from '../team-metrics-chart/utils' import { findMatchingChartRange, findMatchingTimeOption } from './utils' diff --git a/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/index.tsx b/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/index.tsx index 9e5e3a7c6..e59b70be7 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/index.tsx +++ b/src/features/dashboard/sandboxes/monitoring/charts/concurrent-chart/index.tsx @@ -1,7 +1,7 @@ 'use client' -import { ReactiveLiveBadge } from '@/ui/live' import { useCallback, useRef } from 'react' +import { ReactiveLiveBadge } from '@/ui/live' import { useTeamMetricsCharts } from '../../charts-context' import { AnimatedMetricDisplay } from '../animated-metric-display' import TeamMetricsChart from '../team-metrics-chart' diff --git a/src/features/dashboard/sandboxes/monitoring/charts/startrate-chart/hooks.ts b/src/features/dashboard/sandboxes/monitoring/charts/startrate-chart/hooks.ts index 13f5d338d..ac3add85e 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/startrate-chart/hooks.ts +++ b/src/features/dashboard/sandboxes/monitoring/charts/startrate-chart/hooks.ts @@ -1,6 +1,6 @@ +import { useMemo } from 'react' import type { TeamMetricsResponse } from '@/app/api/teams/[teamId]/metrics/types' import { formatCompactDate, formatDecimal } from '@/lib/utils/formatting' -import { useMemo } from 'react' import { transformMetrics } from '../team-metrics-chart' import { calculateAverage } from '../team-metrics-chart/utils' diff --git a/src/features/dashboard/sandboxes/monitoring/charts/startrate-chart/index.tsx b/src/features/dashboard/sandboxes/monitoring/charts/startrate-chart/index.tsx index f62c9ae0e..296fbc102 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/startrate-chart/index.tsx +++ b/src/features/dashboard/sandboxes/monitoring/charts/startrate-chart/index.tsx @@ -1,7 +1,7 @@ 'use client' -import { ReactiveLiveBadge } from '@/ui/live' import { useCallback, useRef } from 'react' +import { ReactiveLiveBadge } from '@/ui/live' import { useTeamMetricsCharts } from '../../charts-context' import { AnimatedMetricDisplay } from '../animated-metric-display' import TeamMetricsChart from '../team-metrics-chart' diff --git a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/constants.ts b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/constants.ts index b8ba04933..e54805f89 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/constants.ts +++ b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/constants.ts @@ -1,4 +1,4 @@ -import { ChartType, TeamMetricChartConfig } from './types' +import type { ChartType, TeamMetricChartConfig } from './types' export const CHART_CONFIGS: Record = { concurrent: { diff --git a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/index.tsx b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/index.tsx index 31b7f8b82..d0ac1cbd5 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/index.tsx +++ b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/index.tsx @@ -1,9 +1,10 @@ 'use client' -import { useCssVars } from '@/lib/hooks/use-css-vars' -import { calculateAxisMax } from '@/lib/utils/chart' -import { EChartsOption, MarkPointComponentOption, SeriesOption } from 'echarts' -import ReactEChartsCore from 'echarts-for-react/lib/core' +import type { + EChartsOption, + MarkPointComponentOption, + SeriesOption, +} from 'echarts' import { LineChart } from 'echarts/charts' import { AxisPointerComponent, @@ -15,8 +16,11 @@ import { } from 'echarts/components' import * as echarts from 'echarts/core' import { CanvasRenderer } from 'echarts/renderers' +import ReactEChartsCore from 'echarts-for-react/lib/core' import { useTheme } from 'next-themes' import { memo, useCallback, useMemo, useRef } from 'react' +import { useCssVars } from '@/lib/hooks/use-css-vars' +import { calculateAxisMax } from '@/lib/utils/chart' import { CHART_CONFIGS, LIVE_PADDING_MULTIPLIER } from './constants' import type { TeamMetricsChartProps } from './types' import { diff --git a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/types.ts b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/types.ts index 1ba99173c..75dc33868 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/types.ts +++ b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/types.ts @@ -1,4 +1,4 @@ -import { ClientTeamMetric } from '@/types/sandboxes.types' +import type { ClientTeamMetric } from '@/types/sandboxes.types' export type ChartType = 'concurrent' | 'start-rate' diff --git a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/utils.ts b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/utils.ts index 96f4a259d..d058b18aa 100644 --- a/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/utils.ts +++ b/src/features/dashboard/sandboxes/monitoring/charts/team-metrics-chart/utils.ts @@ -1,5 +1,5 @@ import { formatAxisNumber } from '@/lib/utils/formatting' -import { ClientTeamMetric } from '@/types/sandboxes.types' +import type { ClientTeamMetric } from '@/types/sandboxes.types' import type { TeamMetricDataPoint } from './types' /** diff --git a/src/features/dashboard/sandboxes/monitoring/header.client.tsx b/src/features/dashboard/sandboxes/monitoring/header.client.tsx index f8732771e..098ec85e3 100644 --- a/src/features/dashboard/sandboxes/monitoring/header.client.tsx +++ b/src/features/dashboard/sandboxes/monitoring/header.client.tsx @@ -1,11 +1,11 @@ 'use client' +import type { InferSafeActionFnResult } from 'next-safe-action' +import { useMemo } from 'react' +import type { NonUndefined } from 'react-hook-form' import { formatDecimal, formatNumber } from '@/lib/utils/formatting' -import { getTeamMetrics } from '@/server/sandboxes/get-team-metrics' +import type { getTeamMetrics } from '@/server/sandboxes/get-team-metrics' import { AnimatedNumber } from '@/ui/primitives/animated-number' -import { InferSafeActionFnResult } from 'next-safe-action' -import { useMemo } from 'react' -import { NonUndefined } from 'react-hook-form' import { useRecentMetrics } from './hooks/use-recent-metrics' interface TeamMonitoringHeaderClientProps { diff --git a/src/features/dashboard/sandboxes/monitoring/header.tsx b/src/features/dashboard/sandboxes/monitoring/header.tsx index 5098c2da9..295b9efe3 100644 --- a/src/features/dashboard/sandboxes/monitoring/header.tsx +++ b/src/features/dashboard/sandboxes/monitoring/header.tsx @@ -1,3 +1,5 @@ +import { AlertTriangle } from 'lucide-react' +import { Suspense } from 'react' import { formatNumber } from '@/lib/utils/formatting' import { getNowMemo } from '@/lib/utils/server' import { getTeamMetrics } from '@/server/sandboxes/get-team-metrics' @@ -6,8 +8,6 @@ import { getTeamLimits } from '@/server/team/get-team-limits' import ErrorTooltip from '@/ui/error-tooltip' import { SemiLiveBadge } from '@/ui/live' import { Skeleton } from '@/ui/primitives/skeleton' -import { AlertTriangle } from 'lucide-react' -import { Suspense } from 'react' import { ConcurrentSandboxesClient, SandboxesStartRateClient, diff --git a/src/features/dashboard/sandboxes/monitoring/hooks/use-recent-metrics.ts b/src/features/dashboard/sandboxes/monitoring/hooks/use-recent-metrics.ts index a1c07fa37..e093eaaa7 100644 --- a/src/features/dashboard/sandboxes/monitoring/hooks/use-recent-metrics.ts +++ b/src/features/dashboard/sandboxes/monitoring/hooks/use-recent-metrics.ts @@ -1,13 +1,13 @@ 'use client' -import { TeamMetricsResponse } from '@/app/api/teams/[teamId]/metrics/types' -import { TEAM_METRICS_POLLING_INTERVAL_MS } from '@/configs/intervals' -import { SWR_KEYS } from '@/configs/keys' -import { useDashboard } from '@/features/dashboard/context' import { usePathname } from 'next/navigation' import { parseAsInteger, useQueryStates } from 'nuqs' import { useMemo } from 'react' import useSWR from 'swr' +import type { TeamMetricsResponse } from '@/app/api/teams/[teamId]/metrics/types' +import { TEAM_METRICS_POLLING_INTERVAL_MS } from '@/configs/intervals' +import { SWR_KEYS } from '@/configs/keys' +import { useDashboard } from '@/features/dashboard/context' import { calculateIsLive } from '../utils' interface UseRecentMetricsOptions { diff --git a/src/features/dashboard/sandboxes/monitoring/hooks/use-timeframe.ts b/src/features/dashboard/sandboxes/monitoring/hooks/use-timeframe.ts index 82e877fa1..fe66cd2c9 100644 --- a/src/features/dashboard/sandboxes/monitoring/hooks/use-timeframe.ts +++ b/src/features/dashboard/sandboxes/monitoring/hooks/use-timeframe.ts @@ -1,12 +1,12 @@ 'use client' +import { parseAsInteger, useQueryStates } from 'nuqs' +import { useCallback, useEffect, useMemo, useRef } from 'react' import { TEAM_METRICS_INITIAL_RANGE_MS, TEAM_METRICS_TIMEFRAME_UPDATE_MS, } from '@/configs/intervals' -import { TIME_RANGES, TimeRangeKey } from '@/lib/utils/timeframe' -import { parseAsInteger, useQueryStates } from 'nuqs' -import { useCallback, useEffect, useMemo, useRef } from 'react' +import { TIME_RANGES, type TimeRangeKey } from '@/lib/utils/timeframe' import { calculateIsLive } from '../utils' const MAX_DAYS_AGO = 31 * 24 * 60 * 60 * 1000 diff --git a/src/features/dashboard/sandboxes/monitoring/time-picker/hooks.ts b/src/features/dashboard/sandboxes/monitoring/time-picker/hooks.ts index 54d14e463..cc0c559aa 100644 --- a/src/features/dashboard/sandboxes/monitoring/time-picker/hooks.ts +++ b/src/features/dashboard/sandboxes/monitoring/time-picker/hooks.ts @@ -2,8 +2,8 @@ * Custom hooks for time picker state management */ -import type { TimeframeState } from '@/lib/utils/timeframe' import { useEffect, useRef, useState } from 'react' +import type { TimeframeState } from '@/lib/utils/timeframe' import { calculatePanelPosition, findMatchingTimeOption, diff --git a/src/features/dashboard/sandboxes/monitoring/time-picker/index.tsx b/src/features/dashboard/sandboxes/monitoring/time-picker/index.tsx index b1ca00007..b575a260c 100644 --- a/src/features/dashboard/sandboxes/monitoring/time-picker/index.tsx +++ b/src/features/dashboard/sandboxes/monitoring/time-picker/index.tsx @@ -2,7 +2,7 @@ import { AnimatePresence, motion } from 'framer-motion' import { ChevronRight } from 'lucide-react' -import { ReactNode, memo, useCallback, useEffect, useRef } from 'react' +import { memo, type ReactNode, useCallback, useEffect, useRef } from 'react' import { cn } from '@/lib/utils' import { tryParseDatetime } from '@/lib/utils/formatting' diff --git a/src/features/dashboard/sandboxes/monitoring/time-picker/time-panel.tsx b/src/features/dashboard/sandboxes/monitoring/time-picker/time-panel.tsx index 98f9f227f..f647e7d3b 100644 --- a/src/features/dashboard/sandboxes/monitoring/time-picker/time-panel.tsx +++ b/src/features/dashboard/sandboxes/monitoring/time-picker/time-panel.tsx @@ -14,7 +14,7 @@ import { useRef, useState, } from 'react' -import { UseFormReturn, useForm } from 'react-hook-form' +import { type UseFormReturn, useForm } from 'react-hook-form' import { parseDateTimeComponents, diff --git a/src/features/dashboard/sandboxes/monitoring/time-picker/validation.ts b/src/features/dashboard/sandboxes/monitoring/time-picker/validation.ts index caf36f7ef..89f904448 100644 --- a/src/features/dashboard/sandboxes/monitoring/time-picker/validation.ts +++ b/src/features/dashboard/sandboxes/monitoring/time-picker/validation.ts @@ -2,8 +2,8 @@ * Time picker form validation schema */ -import { combineDateTimeStrings } from '@/lib/utils/formatting' import { z } from 'zod' +import { combineDateTimeStrings } from '@/lib/utils/formatting' import { CLOCK_SKEW_TOLERANCE, MAX_DAYS_AGO, MIN_RANGE_MS } from './constants' export const customTimeFormSchema = z diff --git a/src/features/dashboard/settings/general/name-card.tsx b/src/features/dashboard/settings/general/name-card.tsx index 96a51a1d5..60219b59a 100644 --- a/src/features/dashboard/settings/general/name-card.tsx +++ b/src/features/dashboard/settings/general/name-card.tsx @@ -1,5 +1,8 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useHookFormOptimisticAction } from '@next-safe-action/adapter-react-hook-form/hooks' +import { AnimatePresence, motion } from 'motion/react' import { USER_MESSAGES } from '@/configs/user-messages' import { useDashboard } from '@/features/dashboard/context' import { @@ -26,9 +29,6 @@ import { FormMessage, } from '@/ui/primitives/form' import { Input } from '@/ui/primitives/input' -import { zodResolver } from '@hookform/resolvers/zod' -import { useHookFormOptimisticAction } from '@next-safe-action/adapter-react-hook-form/hooks' -import { AnimatePresence, motion } from 'motion/react' interface NameCardProps { className?: string diff --git a/src/features/dashboard/settings/general/profile-picture-card.tsx b/src/features/dashboard/settings/general/profile-picture-card.tsx index 5e96dd4f5..3505f1c41 100644 --- a/src/features/dashboard/settings/general/profile-picture-card.tsx +++ b/src/features/dashboard/settings/general/profile-picture-card.tsx @@ -1,5 +1,9 @@ 'use client' +import { AnimatePresence, motion } from 'framer-motion' +import { ChevronsUp, ImagePlusIcon, Loader2, Pencil } from 'lucide-react' +import { useAction } from 'next-safe-action/hooks' +import { useRef, useState } from 'react' import { USER_MESSAGES } from '@/configs/user-messages' import { useDashboard } from '@/features/dashboard/context' import { @@ -12,10 +16,6 @@ import { uploadTeamProfilePictureAction } from '@/server/team/team-actions' import { Avatar, AvatarFallback, AvatarImage } from '@/ui/primitives/avatar' import { Badge } from '@/ui/primitives/badge' import { cardVariants } from '@/ui/primitives/card' -import { AnimatePresence, motion } from 'framer-motion' -import { ChevronsUp, ImagePlusIcon, Loader2, Pencil } from 'lucide-react' -import { useAction } from 'next-safe-action/hooks' -import { useRef, useState } from 'react' interface ProfilePictureCardProps { className?: string diff --git a/src/features/dashboard/settings/keys/create-api-key-dialog.tsx b/src/features/dashboard/settings/keys/create-api-key-dialog.tsx index 98c48c3c1..27b83b745 100644 --- a/src/features/dashboard/settings/keys/create-api-key-dialog.tsx +++ b/src/features/dashboard/settings/keys/create-api-key-dialog.tsx @@ -1,5 +1,12 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'next/navigation' +import { useAction } from 'next-safe-action/hooks' +import { usePostHog } from 'posthog-js/react' +import { type FC, type ReactNode, useState } from 'react' +import { useForm } from 'react-hook-form' +import { z } from 'zod' import { defaultErrorToast, useToast } from '@/lib/hooks/use-toast' import { createApiKeyAction } from '@/server/keys/key-actions' import CopyButton from '@/ui/copy-button' @@ -24,13 +31,6 @@ import { } from '@/ui/primitives/form' import { Input } from '@/ui/primitives/input' import { Label } from '@/ui/primitives/label' -import { zodResolver } from '@hookform/resolvers/zod' -import { useAction } from 'next-safe-action/hooks' -import { useParams } from 'next/navigation' -import { usePostHog } from 'posthog-js/react' -import { FC, ReactNode, useState } from 'react' -import { useForm } from 'react-hook-form' -import { z } from 'zod' const formSchema = z.object({ name: z diff --git a/src/features/dashboard/settings/keys/table-row.tsx b/src/features/dashboard/settings/keys/table-row.tsx index ecc059770..fa81952ee 100644 --- a/src/features/dashboard/settings/keys/table-row.tsx +++ b/src/features/dashboard/settings/keys/table-row.tsx @@ -1,5 +1,9 @@ 'use client' +import { MoreHorizontal } from 'lucide-react' +import { motion } from 'motion/react' +import { useAction } from 'next-safe-action/hooks' +import { useState } from 'react' import { API_KEYS_LAST_USED_FIRST_COLLECTION_DATE } from '@/configs/versioning' import { useDashboard } from '@/features/dashboard/context' import { @@ -9,7 +13,7 @@ import { } from '@/lib/hooks/use-toast' import { exponentialSmoothing } from '@/lib/utils' import { deleteApiKeyAction } from '@/server/keys/key-actions' -import { TeamAPIKey } from '@/types/api.types' +import type { TeamAPIKey } from '@/types/api.types' import { AlertDialog } from '@/ui/alert-dialog' import { Button } from '@/ui/primitives/button' import { @@ -21,10 +25,6 @@ import { DropdownMenuTrigger, } from '@/ui/primitives/dropdown-menu' import { TableCell, TableRow } from '@/ui/primitives/table' -import { MoreHorizontal } from 'lucide-react' -import { motion } from 'motion/react' -import { useAction } from 'next-safe-action/hooks' -import { useState } from 'react' interface TableRowProps { apiKey: TeamAPIKey diff --git a/src/features/dashboard/settings/keys/table.tsx b/src/features/dashboard/settings/keys/table.tsx index 968f484bf..989e29d4c 100644 --- a/src/features/dashboard/settings/keys/table.tsx +++ b/src/features/dashboard/settings/keys/table.tsx @@ -1,3 +1,4 @@ +import { type FC, Suspense } from 'react' import { cn } from '@/lib/utils' import { Table, @@ -7,7 +8,6 @@ import { TableRow, } from '@/ui/primitives/table' import { TableLoader } from '@/ui/table-loader' -import { FC, Suspense } from 'react' import TableBodyContent from './table-body' interface ApiKeysTableProps { diff --git a/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx b/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx index b70070e42..96f129ba6 100644 --- a/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx +++ b/src/features/dashboard/settings/webhooks/add-edit-dialog-steps.tsx @@ -1,7 +1,11 @@ 'use client' +import { AnimatePresence, motion } from 'motion/react' +import { useEffect, useMemo, useState } from 'react' +import type { UseFormReturn } from 'react-hook-form' +import ShikiHighlighter from 'react-shiki' import { useShikiTheme } from '@/configs/shiki' -import { UpsertWebhookSchemaType } from '@/server/webhooks/schema' +import type { UpsertWebhookSchemaType } from '@/server/webhooks/schema' import { Button } from '@/ui/primitives/button' import { Checkbox } from '@/ui/primitives/checkbox' import { @@ -17,10 +21,6 @@ import { Label } from '@/ui/primitives/label' import { ScrollArea, ScrollBar } from '@/ui/primitives/scroll-area' import { Separator } from '@/ui/primitives/separator' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/ui/primitives/tabs' -import { AnimatePresence, motion } from 'motion/react' -import { useEffect, useMemo, useState } from 'react' -import { UseFormReturn } from 'react-hook-form' -import ShikiHighlighter from 'react-shiki' import { WEBHOOK_EVENTS, WEBHOOK_EXAMPLE_PAYLOAD, diff --git a/src/features/dashboard/settings/webhooks/add-edit-dialog.tsx b/src/features/dashboard/settings/webhooks/add-edit-dialog.tsx index be3974e0d..0c40d6de3 100644 --- a/src/features/dashboard/settings/webhooks/add-edit-dialog.tsx +++ b/src/features/dashboard/settings/webhooks/add-edit-dialog.tsx @@ -1,5 +1,9 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' +import { PlusIcon } from 'lucide-react' +import { useState } from 'react' import { defaultErrorToast, defaultSuccessToast, @@ -19,14 +23,10 @@ import { import { Form } from '@/ui/primitives/form' import { CheckIcon } from '@/ui/primitives/icons' import { Loader } from '@/ui/primitives/loader' -import { zodResolver } from '@hookform/resolvers/zod' -import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' -import { PlusIcon } from 'lucide-react' -import { useState } from 'react' import { useDashboard } from '../../context' import { WebhookAddEditDialogSteps } from './add-edit-dialog-steps' import { WEBHOOK_EVENTS } from './constants' -import { Webhook } from './types' +import type { Webhook } from './types' type WebhookAddEditDialogProps = | { diff --git a/src/features/dashboard/settings/webhooks/delete-dialog.tsx b/src/features/dashboard/settings/webhooks/delete-dialog.tsx index b830621b4..6ae4f5c13 100644 --- a/src/features/dashboard/settings/webhooks/delete-dialog.tsx +++ b/src/features/dashboard/settings/webhooks/delete-dialog.tsx @@ -1,5 +1,7 @@ 'use client' +import { useAction } from 'next-safe-action/hooks' +import { useState } from 'react' import { defaultErrorToast, defaultSuccessToast, @@ -11,9 +13,7 @@ import { TrashIcon } from '@/ui/primitives/icons' import { Input } from '@/ui/primitives/input' import { Label } from '@/ui/primitives/label' import { Loader } from '@/ui/primitives/loader' -import { useAction } from 'next-safe-action/hooks' -import { useState } from 'react' -import { Webhook } from './types' +import type { Webhook } from './types' interface WebhookDeleteDialogProps { children: React.ReactNode diff --git a/src/features/dashboard/settings/webhooks/edit-secret-dialog.tsx b/src/features/dashboard/settings/webhooks/edit-secret-dialog.tsx index 49cd336ae..954f1482c 100644 --- a/src/features/dashboard/settings/webhooks/edit-secret-dialog.tsx +++ b/src/features/dashboard/settings/webhooks/edit-secret-dialog.tsx @@ -1,5 +1,8 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' +import { useState } from 'react' import { defaultErrorToast, defaultSuccessToast, @@ -26,10 +29,7 @@ import { import { CheckIcon } from '@/ui/primitives/icons' import { Input } from '@/ui/primitives/input' import { Loader } from '@/ui/primitives/loader' -import { zodResolver } from '@hookform/resolvers/zod' -import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' -import { useState } from 'react' -import { Webhook } from './types' +import type { Webhook } from './types' interface WebhookEditSecretDialogProps { children: React.ReactNode diff --git a/src/features/dashboard/settings/webhooks/table-row.tsx b/src/features/dashboard/settings/webhooks/table-row.tsx index 669b438f1..780d5b347 100644 --- a/src/features/dashboard/settings/webhooks/table-row.tsx +++ b/src/features/dashboard/settings/webhooks/table-row.tsx @@ -1,5 +1,12 @@ 'use client' +import { + Lock, + MoreHorizontal, + Pencil, + Webhook as WebhookIcon, +} from 'lucide-react' +import { useState } from 'react' import { Badge } from '@/ui/primitives/badge' import { Button } from '@/ui/primitives/button' import { @@ -11,17 +18,10 @@ import { } from '@/ui/primitives/dropdown-menu' import { TrashIcon } from '@/ui/primitives/icons' import { TableCell, TableRow } from '@/ui/primitives/table' -import { - Lock, - MoreHorizontal, - Pencil, - Webhook as WebhookIcon, -} from 'lucide-react' -import { useState } from 'react' import WebhookAddEditDialog from './add-edit-dialog' import WebhookDeleteDialog from './delete-dialog' import WebhookEditSecretDialog from './edit-secret-dialog' -import { Webhook } from './types' +import type { Webhook } from './types' interface WebhookTableRowProps { webhook: Webhook diff --git a/src/features/dashboard/settings/webhooks/table.tsx b/src/features/dashboard/settings/webhooks/table.tsx index c99caa3a4..62384e58a 100644 --- a/src/features/dashboard/settings/webhooks/table.tsx +++ b/src/features/dashboard/settings/webhooks/table.tsx @@ -1,3 +1,4 @@ +import { type FC, Suspense } from 'react' import { cn } from '@/lib/utils' import { Table, @@ -7,7 +8,6 @@ import { TableRow, } from '@/ui/primitives/table' import { TableLoader } from '@/ui/table-loader' -import { FC, Suspense } from 'react' import TableBodyContent from './table-body' interface WebhooksTableProps { diff --git a/src/features/dashboard/settings/webhooks/types.ts b/src/features/dashboard/settings/webhooks/types.ts index 7650af2ab..974a80788 100644 --- a/src/features/dashboard/settings/webhooks/types.ts +++ b/src/features/dashboard/settings/webhooks/types.ts @@ -1,3 +1,3 @@ -import { components as ArgusComponents } from '@/types/argus-api.types' +import type { components as ArgusComponents } from '@/types/argus-api.types' export type Webhook = ArgusComponents['schemas']['WebhookDetail'] diff --git a/src/features/dashboard/sidebar/blocked-banner.tsx b/src/features/dashboard/sidebar/blocked-banner.tsx index 4ed2e4888..d4e9fdd90 100644 --- a/src/features/dashboard/sidebar/blocked-banner.tsx +++ b/src/features/dashboard/sidebar/blocked-banner.tsx @@ -1,12 +1,12 @@ 'use client' -import { PROTECTED_URLS } from '@/configs/urls' -import { cn, exponentialSmoothing } from '@/lib/utils' -import { SidebarMenuButton, SidebarMenuItem } from '@/ui/primitives/sidebar' import { AlertOctagonIcon } from 'lucide-react' import { AnimatePresence, motion } from 'motion/react' import { useRouter } from 'next/navigation' import { useMemo } from 'react' +import { PROTECTED_URLS } from '@/configs/urls' +import { cn, exponentialSmoothing } from '@/lib/utils' +import { SidebarMenuButton, SidebarMenuItem } from '@/ui/primitives/sidebar' import { useDashboard } from '../context' interface TeamBlockageAlertProps { diff --git a/src/features/dashboard/sidebar/command.tsx b/src/features/dashboard/sidebar/command.tsx index 7e766dee8..e151f166f 100644 --- a/src/features/dashboard/sidebar/command.tsx +++ b/src/features/dashboard/sidebar/command.tsx @@ -1,5 +1,8 @@ 'use client' +import { ChevronRight } from 'lucide-react' +import { useRouter } from 'next/navigation' +import { useState } from 'react' import { SIDEBAR_ALL_LINKS } from '@/configs/sidebar' import useKeydown from '@/lib/hooks/use-keydown' import { cn } from '@/lib/utils' @@ -17,9 +20,6 @@ import { SidebarMenuItem, useSidebar, } from '@/ui/primitives/sidebar' -import { ChevronRight } from 'lucide-react' -import { useRouter } from 'next/navigation' -import { useState } from 'react' import { useDashboard } from '../context' interface DashboardSidebarCommandProps { diff --git a/src/features/dashboard/sidebar/content.tsx b/src/features/dashboard/sidebar/content.tsx index fa2a099f9..cd9657f0e 100644 --- a/src/features/dashboard/sidebar/content.tsx +++ b/src/features/dashboard/sidebar/content.tsx @@ -1,11 +1,12 @@ 'use client' -import { SIDEBAR_MAIN_LINKS, SidebarNavItem } from '@/configs/sidebar' -import { cn } from '@/lib/utils' import micromatch from 'micromatch' +import { usePathname } from 'next/navigation' import { useMemo } from 'react' +import { SIDEBAR_MAIN_LINKS, type SidebarNavItem } from '@/configs/sidebar' import { useIsMobile } from '@/lib/hooks/use-mobile' +import { cn } from '@/lib/utils' import { HoverPrefetchLink } from '@/ui/hover-prefetch-link' import { SIDEBAR_TRANSITION_CLASSNAMES, @@ -17,7 +18,6 @@ import { SidebarMenuItem, useSidebar, } from '@/ui/primitives/sidebar' -import { usePathname } from 'next/navigation' import { useDashboard } from '../context' type GroupedLinks = { diff --git a/src/features/dashboard/sidebar/create-team-dialog.tsx b/src/features/dashboard/sidebar/create-team-dialog.tsx index 7c09a1505..5ba1759d7 100644 --- a/src/features/dashboard/sidebar/create-team-dialog.tsx +++ b/src/features/dashboard/sidebar/create-team-dialog.tsx @@ -1,5 +1,8 @@ 'use client' +import { zodResolver } from '@hookform/resolvers/zod' +import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' +import { useRouter } from 'next/navigation' import { PROTECTED_URLS } from '@/configs/urls' import { defaultErrorToast, @@ -26,9 +29,6 @@ import { FormMessage, } from '@/ui/primitives/form' import { Input } from '@/ui/primitives/input' -import { zodResolver } from '@hookform/resolvers/zod' -import { useHookFormAction } from '@next-safe-action/adapter-react-hook-form/hooks' -import { useRouter } from 'next/navigation' interface CreateTeamDialogProps { open: boolean diff --git a/src/features/dashboard/sidebar/footer.tsx b/src/features/dashboard/sidebar/footer.tsx index dd8af6120..8e06e7ec4 100644 --- a/src/features/dashboard/sidebar/footer.tsx +++ b/src/features/dashboard/sidebar/footer.tsx @@ -1,5 +1,7 @@ 'use client' +import { Book, Bug, Github, MessageSquarePlus } from 'lucide-react' +import Link from 'next/link' import { INCLUDE_DASHBOARD_FEEDBACK_SURVEY, INCLUDE_REPORT_ISSUE, @@ -15,8 +17,6 @@ import { SidebarMenuButton, SidebarMenuItem, } from '@/ui/primitives/sidebar' -import { Book, Bug, Github, MessageSquarePlus } from 'lucide-react' -import Link from 'next/link' import DashboardSurveyPopover from '../navbar/dashboard-survey-popover' import ReportIssuePopover from '../navbar/report-issue-popover' import TeamBlockageAlert from './blocked-banner' diff --git a/src/features/dashboard/sidebar/item.tsx b/src/features/dashboard/sidebar/item.tsx index e8a041ca8..e15df3ef7 100644 --- a/src/features/dashboard/sidebar/item.tsx +++ b/src/features/dashboard/sidebar/item.tsx @@ -1,9 +1,9 @@ 'use client' -import { cn } from '@/lib/utils' -import Dotted from '@/ui/dotted' import Link from 'next/link' import { usePathname } from 'next/navigation' +import { cn } from '@/lib/utils' +import Dotted from '@/ui/dotted' interface SidebarItemProps { label: React.ReactNode diff --git a/src/features/dashboard/sidebar/menu-teams.tsx b/src/features/dashboard/sidebar/menu-teams.tsx index 8bcaa46da..270910aaa 100644 --- a/src/features/dashboard/sidebar/menu-teams.tsx +++ b/src/features/dashboard/sidebar/menu-teams.tsx @@ -1,6 +1,10 @@ -import { UserTeamsResponse } from '@/app/api/teams/user/types' +import Link from 'next/link' +import { usePathname, useSearchParams } from 'next/navigation' +import { useCallback } from 'react' +import useSWR from 'swr' +import type { UserTeamsResponse } from '@/app/api/teams/user/types' import { useTeamCookieManager } from '@/lib/hooks/use-team' -import { ClientTeam } from '@/types/dashboard.types' +import type { ClientTeam } from '@/types/dashboard.types' import { Avatar, AvatarFallback, AvatarImage } from '@/ui/primitives/avatar' import { DropdownMenuItem, @@ -9,10 +13,6 @@ import { DropdownMenuRadioItem, } from '@/ui/primitives/dropdown-menu' import { Skeleton } from '@/ui/primitives/skeleton' -import Link from 'next/link' -import { usePathname, useSearchParams } from 'next/navigation' -import { useCallback } from 'react' -import useSWR from 'swr' import { useDashboard } from '../context' const PRESERVED_SEARCH_PARAMS = ['tab'] as const diff --git a/src/features/dashboard/sidebar/menu.tsx b/src/features/dashboard/sidebar/menu.tsx index 85e37abf4..2c5fa7158 100644 --- a/src/features/dashboard/sidebar/menu.tsx +++ b/src/features/dashboard/sidebar/menu.tsx @@ -1,5 +1,8 @@ 'use client' +import { ChevronsUpDown, LogOut, Plus, UserRoundCog } from 'lucide-react' +import Link from 'next/link' +import { useState } from 'react' import { PROTECTED_URLS } from '@/configs/urls' import { cn } from '@/lib/utils' import { signOutAction } from '@/server/auth/auth-actions' @@ -13,9 +16,6 @@ import { DropdownMenuTrigger, } from '@/ui/primitives/dropdown-menu' import { SidebarMenuButton, SidebarMenuItem } from '@/ui/primitives/sidebar' -import { ChevronsUpDown, LogOut, Plus, UserRoundCog } from 'lucide-react' -import Link from 'next/link' -import { useState } from 'react' import { useDashboard } from '../context' import { CreateTeamDialog } from './create-team-dialog' import DashboardSidebarMenuTeams from './menu-teams' diff --git a/src/features/dashboard/sidebar/sidebar-mobile.tsx b/src/features/dashboard/sidebar/sidebar-mobile.tsx index 2d6244262..de4201c1e 100644 --- a/src/features/dashboard/sidebar/sidebar-mobile.tsx +++ b/src/features/dashboard/sidebar/sidebar-mobile.tsx @@ -1,6 +1,6 @@ +import { Sidebar as SidebarIcon } from 'lucide-react' import { cn } from '@/lib/utils' import { Drawer, DrawerContent, DrawerTrigger } from '@/ui/primitives/drawer' -import { Sidebar as SidebarIcon } from 'lucide-react' import Sidebar from './sidebar' interface SidebarMobileProps { diff --git a/src/features/dashboard/sidebar/sidebar.tsx b/src/features/dashboard/sidebar/sidebar.tsx index 285371b8a..4d07501f6 100644 --- a/src/features/dashboard/sidebar/sidebar.tsx +++ b/src/features/dashboard/sidebar/sidebar.tsx @@ -1,4 +1,8 @@ -import { Sidebar, SidebarProps, SidebarRail } from '@/ui/primitives/sidebar' +import { + Sidebar, + type SidebarProps, + SidebarRail, +} from '@/ui/primitives/sidebar' import DashboardSidebarContent from './content' import DashboardSidebarFooter from './footer' import DashboardSidebarHeader from './header' diff --git a/src/features/dashboard/sidebar/toggle.tsx b/src/features/dashboard/sidebar/toggle.tsx index b4bb83864..75b8cb1d6 100644 --- a/src/features/dashboard/sidebar/toggle.tsx +++ b/src/features/dashboard/sidebar/toggle.tsx @@ -1,5 +1,7 @@ 'use client' +import { ArrowLeftToLine, ArrowRightFromLine } from 'lucide-react' +import { AnimatePresence, motion } from 'motion/react' import useKeydown from '@/lib/hooks/use-keydown' import { cn } from '@/lib/utils' import { E2BLogo } from '@/ui/brand' @@ -7,8 +9,6 @@ import ClientOnly from '@/ui/client-only' import { Button } from '@/ui/primitives/button' import { useSidebar } from '@/ui/primitives/sidebar' import ShortcutTooltip from '@/ui/shortcut-tooltip' -import { ArrowLeftToLine, ArrowRightFromLine } from 'lucide-react' -import { AnimatePresence, motion } from 'motion/react' export default function DashboardSidebarToggle() { const { toggleSidebar, open, openMobile } = useSidebar() diff --git a/src/features/dashboard/templates/builds/constants.ts b/src/features/dashboard/templates/builds/constants.ts index 5759af715..06afa860c 100644 --- a/src/features/dashboard/templates/builds/constants.ts +++ b/src/features/dashboard/templates/builds/constants.ts @@ -1,4 +1,4 @@ -import { BuildStatusDTO } from '@/server/api/models/builds.models' +import type { BuildStatusDTO } from '@/server/api/models/builds.models' export const LOG_RETENTION_MS = 7 * 24 * 60 * 60 * 1000 // 7 days diff --git a/src/features/dashboard/templates/builds/header.tsx b/src/features/dashboard/templates/builds/header.tsx index f827cddbf..3c99acab9 100644 --- a/src/features/dashboard/templates/builds/header.tsx +++ b/src/features/dashboard/templates/builds/header.tsx @@ -1,5 +1,6 @@ 'use client' +import { useEffect, useState } from 'react' import { cn } from '@/lib/utils' import type { BuildStatusDTO } from '@/server/api/models/builds.models' import { Button } from '@/ui/primitives/button' @@ -11,7 +12,6 @@ import { DropdownMenuTrigger, } from '@/ui/primitives/dropdown-menu' import { Input } from '@/ui/primitives/input' -import { useEffect, useState } from 'react' import { Status } from './table-cells' import useFilters from './use-filters' diff --git a/src/features/dashboard/templates/builds/table-cells.tsx b/src/features/dashboard/templates/builds/table-cells.tsx index 5872c20dc..92283d2fe 100644 --- a/src/features/dashboard/templates/builds/table-cells.tsx +++ b/src/features/dashboard/templates/builds/table-cells.tsx @@ -1,5 +1,8 @@ 'use client' +import { ArrowUpRight } from 'lucide-react' +import { useRouter } from 'next/navigation' +import { useEffect, useState } from 'react' import { PROTECTED_URLS } from '@/configs/urls' import { useTemplateTableStore } from '@/features/dashboard/templates/list/stores/table-store' import { useRouteParams } from '@/lib/hooks/use-route-params' @@ -17,9 +20,6 @@ import { Badge } from '@/ui/primitives/badge' import { Button } from '@/ui/primitives/button' import { CheckIcon, CloseIcon } from '@/ui/primitives/icons' import { Loader } from '@/ui/primitives/loader' -import { ArrowUpRight } from 'lucide-react' -import { useRouter } from 'next/navigation' -import { useEffect, useState } from 'react' export function BuildId({ id }: { id: string }) { return ( diff --git a/src/features/dashboard/templates/builds/table.tsx b/src/features/dashboard/templates/builds/table.tsx index 1588cd983..8af706a66 100644 --- a/src/features/dashboard/templates/builds/table.tsx +++ b/src/features/dashboard/templates/builds/table.tsx @@ -1,5 +1,13 @@ 'use client' +import { + keepPreviousData, + useInfiniteQuery, + useQuery, + useQueryClient, +} from '@tanstack/react-query' +import { useRouter } from 'next/navigation' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { PROTECTED_URLS } from '@/configs/urls' import { useRouteParams } from '@/lib/hooks/use-route-params' import { cn } from '@/lib/utils/ui' @@ -18,14 +26,6 @@ import { TableHeader, TableRow, } from '@/ui/primitives/table' -import { - keepPreviousData, - useInfiniteQuery, - useQuery, - useQueryClient, -} from '@tanstack/react-query' -import { useRouter } from 'next/navigation' -import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import BuildsEmpty from './empty' import { BackToTopButton, diff --git a/src/features/dashboard/templates/builds/use-filters.tsx b/src/features/dashboard/templates/builds/use-filters.tsx index e7837a900..7883507bf 100644 --- a/src/features/dashboard/templates/builds/use-filters.tsx +++ b/src/features/dashboard/templates/builds/use-filters.tsx @@ -1,9 +1,9 @@ 'use client' -import { BuildStatusDTO } from '@/server/api/models/builds.models' import { useQueryStates } from 'nuqs' import { useMemo } from 'react' import { useDebounceCallback } from 'usehooks-ts' +import type { BuildStatusDTO } from '@/server/api/models/builds.models' import { INITIAL_BUILD_STATUSES } from './constants' import { templateBuildsFilterParams } from './filter-params' diff --git a/src/features/dashboard/templates/list/header.tsx b/src/features/dashboard/templates/list/header.tsx index 15bebc263..92aeb678c 100644 --- a/src/features/dashboard/templates/list/header.tsx +++ b/src/features/dashboard/templates/list/header.tsx @@ -1,8 +1,8 @@ -import { Template } from '@/types/api.types' -import { Badge } from '@/ui/primitives/badge' -import { Table } from '@tanstack/react-table' +import type { Table } from '@tanstack/react-table' import { Hexagon, ListFilter } from 'lucide-react' import { Suspense } from 'react' +import type { Template } from '@/types/api.types' +import { Badge } from '@/ui/primitives/badge' import TemplatesTableFilters from './table-filters' import { SearchInput } from './table-search' diff --git a/src/features/dashboard/templates/list/stores/table-store.ts b/src/features/dashboard/templates/list/stores/table-store.ts index b5769dd5a..5efbd4705 100644 --- a/src/features/dashboard/templates/list/stores/table-store.ts +++ b/src/features/dashboard/templates/list/stores/table-store.ts @@ -1,7 +1,7 @@ -import { createHashStorage } from '@/lib/utils/store' -import { OnChangeFn, SortingState } from '@tanstack/react-table' +import type { OnChangeFn, SortingState } from '@tanstack/react-table' import { create } from 'zustand' import { createJSONStorage, persist } from 'zustand/middleware' +import { createHashStorage } from '@/lib/utils/store' import { trackTemplateTableInteraction } from '../table-config' interface TemplateTableState { diff --git a/src/features/dashboard/templates/list/table-body.tsx b/src/features/dashboard/templates/list/table-body.tsx index dad253863..6588119aa 100644 --- a/src/features/dashboard/templates/list/table-body.tsx +++ b/src/features/dashboard/templates/list/table-body.tsx @@ -1,11 +1,11 @@ +import { flexRender, Row, type Table } from '@tanstack/react-table' +import { ExternalLink, X } from 'lucide-react' +import type { RefObject } from 'react' import { useVirtualRows } from '@/lib/hooks/use-virtual-rows' -import { Template } from '@/types/api.types' +import type { Template } from '@/types/api.types' import { DataTableBody, DataTableCell, DataTableRow } from '@/ui/data-table' import Empty from '@/ui/empty' import { Button } from '@/ui/primitives/button' -import { Row, Table, flexRender } from '@tanstack/react-table' -import { ExternalLink, X } from 'lucide-react' -import { type RefObject } from 'react' import { useTemplateTableStore } from './stores/table-store' const ROW_HEIGHT_PX = 32 diff --git a/src/features/dashboard/templates/list/table-cells.tsx b/src/features/dashboard/templates/list/table-cells.tsx index c0fd5f482..8eeac4517 100644 --- a/src/features/dashboard/templates/list/table-cells.tsx +++ b/src/features/dashboard/templates/list/table-cells.tsx @@ -1,5 +1,9 @@ 'use client' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import type { CellContext } from '@tanstack/react-table' +import { Check, Copy, Lock, LockOpen, MoreVertical } from 'lucide-react' +import { useMemo, useState } from 'react' import { useClipboard } from '@/lib/hooks/use-clipboard' import { useRouteParams } from '@/lib/hooks/use-route-params' import { @@ -11,7 +15,7 @@ import { cn } from '@/lib/utils' import { formatLocalLogStyleTimestamp } from '@/lib/utils/formatting' import { isVersionCompatible } from '@/lib/utils/version' import { useTRPC } from '@/trpc/client' -import { DefaultTemplate, Template } from '@/types/api.types' +import type { DefaultTemplate, Template } from '@/types/api.types' import { AlertDialog } from '@/ui/alert-dialog' import { E2BBadge } from '@/ui/brand' import HelpTooltip from '@/ui/help-tooltip' @@ -27,10 +31,6 @@ import { DropdownMenuTrigger, } from '@/ui/primitives/dropdown-menu' import { Loader } from '@/ui/primitives/loader_d' -import { useMutation, useQueryClient } from '@tanstack/react-query' -import { CellContext } from '@tanstack/react-table' -import { Check, Copy, Lock, LockOpen, MoreVertical } from 'lucide-react' -import { useMemo, useState } from 'react' import ResourceUsage from '../../common/resource-usage' import { useDashboard } from '../../context' diff --git a/src/features/dashboard/templates/list/table-config.tsx b/src/features/dashboard/templates/list/table-config.tsx index 13e17d319..39f61b396 100644 --- a/src/features/dashboard/templates/list/table-config.tsx +++ b/src/features/dashboard/templates/list/table-config.tsx @@ -1,17 +1,17 @@ 'use client' -import { DefaultTemplate, Template } from '@/types/api.types' import { rankItem } from '@tanstack/match-sorter-utils' import { - ColumnDef, - FilterFn, - TableOptions, + type ColumnDef, + type FilterFn, getCoreRowModel, getFilteredRowModel, getSortedRowModel, + type TableOptions, } from '@tanstack/react-table' import posthog from 'posthog-js' import { useMemo } from 'react' +import type { DefaultTemplate, Template } from '@/types/api.types' import { ActionsCell, CpuCell, diff --git a/src/features/dashboard/templates/list/table-filters.tsx b/src/features/dashboard/templates/list/table-filters.tsx index 126df83a6..97c10932e 100644 --- a/src/features/dashboard/templates/list/table-filters.tsx +++ b/src/features/dashboard/templates/list/table-filters.tsx @@ -1,5 +1,8 @@ 'use client' +import { ListFilter } from 'lucide-react' +import * as React from 'react' +import { useDebounceValue } from 'usehooks-ts' import { cn } from '@/lib/utils' import { NumberInput } from '@/ui/number-input' import { Button } from '@/ui/primitives/button' @@ -18,9 +21,6 @@ import { import { Label } from '@/ui/primitives/label' import { Separator } from '@/ui/primitives/separator' import { TableFilterButton } from '@/ui/table-filter-button' -import { ListFilter } from 'lucide-react' -import * as React from 'react' -import { useDebounceValue } from 'usehooks-ts' import { useTemplateTableStore } from './stores/table-store' // Components diff --git a/src/features/dashboard/templates/list/table-search.tsx b/src/features/dashboard/templates/list/table-search.tsx index 47e9d2ae7..5362e7a96 100644 --- a/src/features/dashboard/templates/list/table-search.tsx +++ b/src/features/dashboard/templates/list/table-search.tsx @@ -1,9 +1,9 @@ 'use client' +import { useCallback, useRef } from 'react' import useKeydown from '@/lib/hooks/use-keydown' import { DebouncedInput } from '@/ui/primitives/input' import { Kbd } from '@/ui/primitives/kbd' -import { useCallback, useRef } from 'react' import { useTemplateTableStore } from './stores/table-store' export const SearchInput = () => { diff --git a/src/features/dashboard/templates/list/table.tsx b/src/features/dashboard/templates/list/table.tsx index fad6a5c80..c003348ee 100644 --- a/src/features/dashboard/templates/list/table.tsx +++ b/src/features/dashboard/templates/list/table.tsx @@ -1,10 +1,20 @@ 'use client' +import { useSuspenseQuery } from '@tanstack/react-query' +import { + type ColumnFiltersState, + type ColumnSizingState, + flexRender, + type TableOptions, + useReactTable, +} from '@tanstack/react-table' +import { useEffect, useMemo, useRef, useState } from 'react' +import { useLocalStorage } from 'usehooks-ts' import { useColumnSizeVars } from '@/lib/hooks/use-column-size-vars' import { useRouteParams } from '@/lib/hooks/use-route-params' import { cn } from '@/lib/utils' import { useTRPC } from '@/trpc/client' -import { Template } from '@/types/api.types' +import type { Template } from '@/types/api.types' import ClientOnly from '@/ui/client-only' import { DataTable, @@ -15,16 +25,6 @@ import { import ErrorBoundary from '@/ui/error' import HelpTooltip from '@/ui/help-tooltip' import { SIDEBAR_TRANSITION_CLASSNAMES } from '@/ui/primitives/sidebar' -import { useSuspenseQuery } from '@tanstack/react-query' -import { - ColumnFiltersState, - ColumnSizingState, - TableOptions, - flexRender, - useReactTable, -} from '@tanstack/react-table' -import { useEffect, useMemo, useRef, useState } from 'react' -import { useLocalStorage } from 'usehooks-ts' import TemplatesHeader from './header' import { useTemplateTableStore } from './stores/table-store' import { TemplatesTableBody as TableBody } from './table-body' diff --git a/src/features/dashboard/usage/compute-usage-chart/index.tsx b/src/features/dashboard/usage/compute-usage-chart/index.tsx index 4626aafc3..0e145ea8e 100644 --- a/src/features/dashboard/usage/compute-usage-chart/index.tsx +++ b/src/features/dashboard/usage/compute-usage-chart/index.tsx @@ -1,9 +1,6 @@ 'use client' -import { useCssVars } from '@/lib/hooks/use-css-vars' -import { calculateAxisMax } from '@/lib/utils/chart' -import { EChartsOption, SeriesOption } from 'echarts' -import ReactEChartsCore from 'echarts-for-react/lib/core' +import type { EChartsOption, SeriesOption } from 'echarts' import { BarChart } from 'echarts/charts' import { BrushComponent, @@ -13,8 +10,11 @@ import { } from 'echarts/components' import * as echarts from 'echarts/core' import { CanvasRenderer } from 'echarts/renderers' +import ReactEChartsCore from 'echarts-for-react/lib/core' import { useTheme } from 'next-themes' import { memo, useCallback, useMemo, useRef } from 'react' +import { useCssVars } from '@/lib/hooks/use-css-vars' +import { calculateAxisMax } from '@/lib/utils/chart' import { COMPUTE_CHART_CONFIGS } from '../constants' import type { ComputeUsageChartProps } from './types' diff --git a/src/features/dashboard/usage/compute-usage-chart/types.ts b/src/features/dashboard/usage/compute-usage-chart/types.ts index 5236d3ef4..4b0b6de9b 100644 --- a/src/features/dashboard/usage/compute-usage-chart/types.ts +++ b/src/features/dashboard/usage/compute-usage-chart/types.ts @@ -1,4 +1,4 @@ -import { ComputUsageAxisPoint, SamplingMode } from '../types' +import type { ComputUsageAxisPoint, SamplingMode } from '../types' export type ComputeChartType = 'cost' | 'ram' | 'vcpu' | 'sandboxes' diff --git a/src/features/dashboard/usage/constants.ts b/src/features/dashboard/usage/constants.ts index 16b2422bd..91c7441d6 100644 --- a/src/features/dashboard/usage/constants.ts +++ b/src/features/dashboard/usage/constants.ts @@ -1,6 +1,6 @@ import { formatAxisNumber } from '@/lib/utils/formatting' -import { TimeRangePreset } from '@/ui/time-range-presets' -import { +import type { TimeRangePreset } from '@/ui/time-range-presets' +import type { ComputeChartConfig, ComputeChartType, } from './compute-usage-chart/types' diff --git a/src/features/dashboard/usage/display-utils.ts b/src/features/dashboard/usage/display-utils.ts index da93ba35e..fa444f182 100644 --- a/src/features/dashboard/usage/display-utils.ts +++ b/src/features/dashboard/usage/display-utils.ts @@ -10,7 +10,7 @@ import { normalizeToEndOfSamplingPeriod, normalizeToStartOfSamplingPeriod, } from './sampling-utils' -import { +import type { DisplayValue, SampledDataPoint, SamplingMode, diff --git a/src/features/dashboard/usage/sampling-utils.ts b/src/features/dashboard/usage/sampling-utils.ts index f0c93ed77..4fd35581d 100644 --- a/src/features/dashboard/usage/sampling-utils.ts +++ b/src/features/dashboard/usage/sampling-utils.ts @@ -1,10 +1,10 @@ -import { UsageResponse } from '@/types/billing.types' import { startOfISOWeek } from 'date-fns' +import type { UsageResponse } from '@/types/billing.types' import { HOURLY_SAMPLING_THRESHOLD_DAYS, WEEKLY_SAMPLING_THRESHOLD_DAYS, } from './constants' -import { SampledDataPoint, SamplingMode, Timeframe } from './types' +import type { SampledDataPoint, SamplingMode, Timeframe } from './types' export function determineSamplingMode(timeframe: Timeframe): SamplingMode { const rangeDays = (timeframe.end - timeframe.start) / (24 * 60 * 60 * 1000) @@ -79,11 +79,12 @@ export function normalizeToEndOfSamplingPeriod( date.setHours(23, 59, 59, 999) return date.getTime() - case 'weekly': + case 'weekly': { const weekStart = startOfISOWeek(date) weekStart.setDate(weekStart.getDate() + 6) weekStart.setHours(23, 59, 59, 999) return weekStart.getTime() + } } } diff --git a/src/features/dashboard/usage/usage-charts-context.tsx b/src/features/dashboard/usage/usage-charts-context.tsx index 788c0bf96..93ede8ee4 100644 --- a/src/features/dashboard/usage/usage-charts-context.tsx +++ b/src/features/dashboard/usage/usage-charts-context.tsx @@ -1,16 +1,16 @@ 'use client' -import { fillTimeSeriesWithEmptyPoints } from '@/lib/utils/time-series' -import { UsageResponse } from '@/types/billing.types' import { parseAsInteger, useQueryStates } from 'nuqs' import { - ReactNode, createContext, + type ReactNode, useCallback, useContext, useMemo, useState, } from 'react' +import { fillTimeSeriesWithEmptyPoints } from '@/lib/utils/time-series' +import type { UsageResponse } from '@/types/billing.types' import { INITIAL_TIMEFRAME_FALLBACK_RANGE_MS } from './constants' import { calculateTotals, @@ -24,7 +24,7 @@ import { normalizeToEndOfSamplingPeriod, processUsageData, } from './sampling-utils' -import { +import type { ComputeUsageSeriesData, DisplayValue, MetricTotals, diff --git a/src/features/dashboard/usage/usage-metric-chart.tsx b/src/features/dashboard/usage/usage-metric-chart.tsx index d10fe1c60..761333fa6 100644 --- a/src/features/dashboard/usage/usage-metric-chart.tsx +++ b/src/features/dashboard/usage/usage-metric-chart.tsx @@ -1,5 +1,8 @@ 'use client' +import { DialogTitle } from '@radix-ui/react-dialog' +import { Maximize2 } from 'lucide-react' +import { useState } from 'react' import { AnimatedMetricDisplay } from '@/features/dashboard/sandboxes/monitoring/charts/animated-metric-display' import { cn } from '@/lib/utils' import { Button } from '@/ui/primitives/button' @@ -10,9 +13,6 @@ import { cardVariants, } from '@/ui/primitives/card' import { Dialog, DialogContent } from '@/ui/primitives/dialog' -import { DialogTitle } from '@radix-ui/react-dialog' -import { Maximize2 } from 'lucide-react' -import { useState } from 'react' import ComputeUsageChart from './compute-usage-chart' import { useUsageCharts } from './usage-charts-context' import { UsageTimeRangeControls } from './usage-time-range-controls' diff --git a/src/features/dashboard/usage/usage-time-range-controls.tsx b/src/features/dashboard/usage/usage-time-range-controls.tsx index 825d38180..10e5bf012 100644 --- a/src/features/dashboard/usage/usage-time-range-controls.tsx +++ b/src/features/dashboard/usage/usage-time-range-controls.tsx @@ -1,5 +1,7 @@ 'use client' +import { ChevronLeft, ChevronRight } from 'lucide-react' +import { useCallback, useMemo, useState } from 'react' import { cn } from '@/lib/utils' import { findMatchingPreset } from '@/lib/utils/time-range' import { formatTimeframeAsISO8601Interval } from '@/lib/utils/timeframe' @@ -13,8 +15,6 @@ import { import { Separator } from '@/ui/primitives/separator' import { TimeRangePicker, type TimeRangeValues } from '@/ui/time-range-picker' import { type TimeRangePreset, TimeRangePresets } from '@/ui/time-range-presets' -import { ChevronLeft, ChevronRight } from 'lucide-react' -import { useCallback, useMemo, useState } from 'react' import { TIME_RANGE_PRESETS } from './constants' import { determineSamplingMode, diff --git a/src/features/general-analytics-collector.tsx b/src/features/general-analytics-collector.tsx index 9c5260345..5ff52b619 100644 --- a/src/features/general-analytics-collector.tsx +++ b/src/features/general-analytics-collector.tsx @@ -1,8 +1,8 @@ 'use client' -import { supabase } from '@/lib/clients/supabase/client' import { usePostHog } from 'posthog-js/react' import { useEffect } from 'react' +import { supabase } from '@/lib/clients/supabase/client' export function GeneralAnalyticsCollector() { const posthog = usePostHog() diff --git a/src/features/posthog-provider.tsx b/src/features/posthog-provider.tsx index bd32848d4..525e03046 100644 --- a/src/features/posthog-provider.tsx +++ b/src/features/posthog-provider.tsx @@ -1,8 +1,6 @@ -import posthog, { Survey } from 'posthog-js' +import posthog, { type Survey } from 'posthog-js' import { PostHogProvider as PHProvider } from 'posthog-js/react' -import { useEffect, useState } from 'react' - -import { createContext, useContext } from 'react' +import { createContext, useContext, useEffect, useState } from 'react' interface AppPostHogContextValue { isInitialized: boolean diff --git a/src/lib/clients/action.ts b/src/lib/clients/action.ts index b517bd573..5d8269db9 100644 --- a/src/lib/clients/action.ts +++ b/src/lib/clients/action.ts @@ -1,14 +1,14 @@ +import { context, SpanStatusCode, trace } from '@opentelemetry/api' +import type { Session, User } from '@supabase/supabase-js' +import { unauthorized } from 'next/navigation' +import { createMiddleware, createSafeActionClient } from 'next-safe-action' +import { serializeError } from 'serialize-error' +import { z } from 'zod' import checkUserTeamAuthCached from '@/server/auth/check-user-team-auth-cached' import { getSessionInsecure } from '@/server/auth/get-session' import getUserByToken from '@/server/auth/get-user-by-token' import { getTeamIdFromSegment } from '@/server/team/get-team-id-from-segment' import { UnauthenticatedError, UnknownError } from '@/types/errors' -import { SpanStatusCode, context, trace } from '@opentelemetry/api' -import { Session, User } from '@supabase/supabase-js' -import { createMiddleware, createSafeActionClient } from 'next-safe-action' -import { unauthorized } from 'next/navigation' -import { serializeError } from 'serialize-error' -import { z } from 'zod' import { ActionError, flattenClientInputValue } from '../utils/action' import { l } from './logger/logger' import { createClient } from './supabase/server' diff --git a/src/lib/clients/api.ts b/src/lib/clients/api.ts index 97e1fae89..af4b3d05b 100644 --- a/src/lib/clients/api.ts +++ b/src/lib/clients/api.ts @@ -1,6 +1,6 @@ +import createClient from 'openapi-fetch' import type { paths as ArgusPaths } from '@/types/argus-api.types' import type { paths as InfraPaths } from '@/types/infra-api.types' -import createClient from 'openapi-fetch' type CombinedPaths = InfraPaths & ArgusPaths @@ -11,7 +11,7 @@ export const infra = createClient({ headers, body, method, - duplex: !!body ? 'half' : undefined, + duplex: body ? 'half' : undefined, ...options, } as RequestInit) }, diff --git a/src/lib/clients/logger/logger.ts b/src/lib/clients/logger/logger.ts index ed828728f..8bbe83528 100644 --- a/src/lib/clients/logger/logger.ts +++ b/src/lib/clients/logger/logger.ts @@ -6,8 +6,8 @@ * In Edge we fall back to the minimal JSON logger implemented in `logger.edge.ts`. */ -import pino, { Logger } from 'pino' -import { ErrorObject } from 'serialize-error' +import pino, { type Logger } from 'pino' +import type { ErrorObject } from 'serialize-error' /** * Represents platform-specific metadata that can be included in logs. diff --git a/src/lib/clients/storage.ts b/src/lib/clients/storage.ts index 13b5e3bdb..91618c883 100644 --- a/src/lib/clients/storage.ts +++ b/src/lib/clients/storage.ts @@ -1,5 +1,5 @@ +import type { FileObject } from '@supabase/storage-js' import { STORAGE_BUCKET_NAME } from '@/configs/storage' -import { FileObject } from '@supabase/storage-js' import { supabaseAdmin } from './supabase/admin' /** diff --git a/src/lib/clients/supabase/admin.ts b/src/lib/clients/supabase/admin.ts index ea5c02693..08df51274 100644 --- a/src/lib/clients/supabase/admin.ts +++ b/src/lib/clients/supabase/admin.ts @@ -1,7 +1,7 @@ import 'server-cli-only' -import { Database } from '@/types/database.types' import { createClient } from '@supabase/supabase-js' +import type { Database } from '@/types/database.types' export const supabaseAdmin = createClient( process.env.NEXT_PUBLIC_SUPABASE_URL, diff --git a/src/lib/clients/supabase/client.ts b/src/lib/clients/supabase/client.ts index a6b1eb54f..fad5b74c2 100644 --- a/src/lib/clients/supabase/client.ts +++ b/src/lib/clients/supabase/client.ts @@ -1,7 +1,7 @@ 'use client' -import { Database } from '@/types/database.types' import { createBrowserClient } from '@supabase/ssr' +import type { Database } from '@/types/database.types' export const supabase = createBrowserClient( process.env.NEXT_PUBLIC_SUPABASE_URL, diff --git a/src/lib/clients/supabase/server.ts b/src/lib/clients/supabase/server.ts index 24650e17c..a1a9fe844 100644 --- a/src/lib/clients/supabase/server.ts +++ b/src/lib/clients/supabase/server.ts @@ -1,6 +1,6 @@ -import { Database } from '@/types/database.types' import { createServerClient } from '@supabase/ssr' import { cookies } from 'next/headers' +import type { Database } from '@/types/database.types' export const createClient = async () => { const cookieStore = await cookies() diff --git a/src/lib/hooks/use-column-size-vars.tsx b/src/lib/hooks/use-column-size-vars.tsx index 11c3e1836..7a0e2aee4 100644 --- a/src/lib/hooks/use-column-size-vars.tsx +++ b/src/lib/hooks/use-column-size-vars.tsx @@ -1,4 +1,4 @@ -import { Table } from '@tanstack/react-table' +import type { Table } from '@tanstack/react-table' import { useRef } from 'react' /** diff --git a/src/lib/hooks/use-team.ts b/src/lib/hooks/use-team.ts index 796607c79..542056b5c 100644 --- a/src/lib/hooks/use-team.ts +++ b/src/lib/hooks/use-team.ts @@ -1,9 +1,9 @@ 'use client' -import { useDashboard } from '@/features/dashboard/context' -import { ClientTeam } from '@/types/dashboard.types' import { useEffect } from 'react' import { useDebounceCallback } from 'usehooks-ts' +import { useDashboard } from '@/features/dashboard/context' +import type { ClientTeam } from '@/types/dashboard.types' export const useTeamCookieManager = () => { const { team } = useDashboard() diff --git a/src/lib/hooks/use-toast.ts b/src/lib/hooks/use-toast.ts index e232d1342..bbf504189 100644 --- a/src/lib/hooks/use-toast.ts +++ b/src/lib/hooks/use-toast.ts @@ -1,8 +1,8 @@ 'use client' +import * as React from 'react' // Inspired by react-hot-toast library import type { ToastActionElement, ToastProps } from '@/ui/primitives/toast' -import * as React from 'react' const TOAST_LIMIT = 1 const TOAST_REMOVE_DELAY = 1000000 diff --git a/src/lib/hooks/use-user.ts b/src/lib/hooks/use-user.ts index 51c56a08f..7c616124c 100644 --- a/src/lib/hooks/use-user.ts +++ b/src/lib/hooks/use-user.ts @@ -1,6 +1,6 @@ 'use client' -import { User } from '@supabase/supabase-js' +import type { User } from '@supabase/supabase-js' import useSWR from 'swr' import { supabase } from '../clients/supabase/client' diff --git a/src/lib/hooks/use-virtual-rows.ts b/src/lib/hooks/use-virtual-rows.ts index 27d1b7dfa..cd39fb8a4 100644 --- a/src/lib/hooks/use-virtual-rows.ts +++ b/src/lib/hooks/use-virtual-rows.ts @@ -1,8 +1,8 @@ 'use client' -import { Row } from '@tanstack/react-table' -import { Virtualizer, useVirtualizer } from '@tanstack/react-virtual' -import { RefObject, useMemo } from 'react' +import type { Row } from '@tanstack/react-table' +import { useVirtualizer, type Virtualizer } from '@tanstack/react-virtual' +import { type RefObject, useMemo } from 'react' interface UseVirtualRowsParams { rows: Row[] diff --git a/src/lib/utils/auth.ts b/src/lib/utils/auth.ts index 9c8fa437b..deabc258a 100644 --- a/src/lib/utils/auth.ts +++ b/src/lib/utils/auth.ts @@ -1,4 +1,4 @@ -import { User } from '@supabase/supabase-js' +import type { User } from '@supabase/supabase-js' import { redirect } from 'next/navigation' /** diff --git a/src/lib/utils/cookies.ts b/src/lib/utils/cookies.ts index 7afc2ae40..a9a5d738d 100644 --- a/src/lib/utils/cookies.ts +++ b/src/lib/utils/cookies.ts @@ -1,5 +1,5 @@ -import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' import { cookies } from 'next/headers' +import { COOKIE_KEYS, COOKIE_OPTIONS } from '@/configs/cookies' /** * Sets the team ID and slug cookies for the dashboard. diff --git a/src/lib/utils/filesystem.ts b/src/lib/utils/filesystem.ts index e9a3bb658..2b7cece89 100644 --- a/src/lib/utils/filesystem.ts +++ b/src/lib/utils/filesystem.ts @@ -1,7 +1,6 @@ -import { FileContentState } from '@/features/dashboard/sandbox/inspect/filesystem/store' - // Leverage pathe (a tiny, browser-friendly path replacement) import { basename, dirname, join, normalize } from 'pathe' +import type { FileContentState } from '@/features/dashboard/sandbox/inspect/filesystem/store' /** * Normalize a path so that it: diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 8b6002545..127b9375b 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -1,4 +1,4 @@ -import { ClassValue } from 'class-variance-authority/types' +import type { ClassValue } from 'class-variance-authority/types' import { clsx } from 'clsx' import { twMerge } from 'tailwind-merge' diff --git a/src/lib/utils/redirects.ts b/src/lib/utils/redirects.ts index 5e630385d..e808238cc 100644 --- a/src/lib/utils/redirects.ts +++ b/src/lib/utils/redirects.ts @@ -1,4 +1,7 @@ -import { MIDDLEWARE_REDIRECTS, MiddlewareRedirect } from '@/configs/redirects' +import { + MIDDLEWARE_REDIRECTS, + type MiddlewareRedirect, +} from '@/configs/redirects' /** * Finds a middleware redirect configuration for the given pathname. diff --git a/src/lib/utils/rewrites.ts b/src/lib/utils/rewrites.ts index 4164a4ae2..7442ff758 100644 --- a/src/lib/utils/rewrites.ts +++ b/src/lib/utils/rewrites.ts @@ -1,11 +1,11 @@ +import * as cheerio from 'cheerio' +import { serializeError } from 'serialize-error' import { MIDDLEWARE_REWRITE_CONFIG, + type RewriteConfigType, ROUTE_REWRITE_CONFIG, - RewriteConfigType, } from '@/configs/rewrites' -import { RewriteConfig } from '@/types/rewrites.types' -import * as cheerio from 'cheerio' -import { serializeError } from 'serialize-error' +import type { RewriteConfig } from '@/types/rewrites.types' import { l } from '../clients/logger/logger' function getRewriteForPath( diff --git a/src/lib/utils/server.ts b/src/lib/utils/server.ts index 8b566869d..8a9bd7107 100644 --- a/src/lib/utils/server.ts +++ b/src/lib/utils/server.ts @@ -1,10 +1,10 @@ import 'server-only' -import { SUPABASE_AUTH_HEADERS } from '@/configs/api' -import { COOKIE_KEYS } from '@/configs/cookies' import { cookies } from 'next/headers' import { cache } from 'react' import { z } from 'zod' +import { SUPABASE_AUTH_HEADERS } from '@/configs/api' +import { COOKIE_KEYS } from '@/configs/cookies' import { infra } from '../clients/api' import { l } from '../clients/logger/logger' import { returnServerError } from './action' diff --git a/src/lib/utils/store.ts b/src/lib/utils/store.ts index af63d52ca..39dd5026f 100644 --- a/src/lib/utils/store.ts +++ b/src/lib/utils/store.ts @@ -1,4 +1,4 @@ -import { StateStorage } from 'zustand/middleware' +import type { StateStorage } from 'zustand/middleware' export const createHashStorage = ( initialState: T diff --git a/src/server/api/init.ts b/src/server/api/init.ts index 3ed24ebc4..44f9523dc 100644 --- a/src/server/api/init.ts +++ b/src/server/api/init.ts @@ -1,6 +1,6 @@ import { initTRPC } from '@trpc/server' import superjson from 'superjson' -import { ZodError, flattenError } from 'zod' +import { flattenError, ZodError } from 'zod' /** * TRPC Context Factory diff --git a/src/server/api/middlewares/auth.ts b/src/server/api/middlewares/auth.ts index 6d3205387..9c7ec3e8b 100644 --- a/src/server/api/middlewares/auth.ts +++ b/src/server/api/middlewares/auth.ts @@ -1,12 +1,12 @@ -import { getTracer } from '@/lib/clients/tracer' -import { getSessionInsecure } from '@/server/auth/get-session' -import getUserByToken from '@/server/auth/get-user-by-token' -import { SpanStatusCode, context, trace } from '@opentelemetry/api' +import { context, SpanStatusCode, trace } from '@opentelemetry/api' import { createServerClient, parseCookieHeader, serializeCookieHeader, } from '@supabase/ssr' +import { getTracer } from '@/lib/clients/tracer' +import { getSessionInsecure } from '@/server/auth/get-session' +import getUserByToken from '@/server/auth/get-user-by-token' import { unauthorizedUserError } from '../errors' import { t } from '../init' diff --git a/src/server/api/middlewares/telemetry.ts b/src/server/api/middlewares/telemetry.ts index e64b8552d..573a0a53b 100644 --- a/src/server/api/middlewares/telemetry.ts +++ b/src/server/api/middlewares/telemetry.ts @@ -1,18 +1,18 @@ -import { l } from '@/lib/clients/logger/logger' -import { getMeter } from '@/lib/clients/meter' -import { getTracer } from '@/lib/clients/tracer' -import { flattenClientInputValue } from '@/lib/utils/action' import type { Span } from '@opentelemetry/api' import { - Counter, - Histogram, - SpanStatusCode, + type Counter, context, + type Histogram, + SpanStatusCode, trace, } from '@opentelemetry/api' -import { User } from '@supabase/supabase-js' +import type { User } from '@supabase/supabase-js' import { TRPCError } from '@trpc/server' import { serializeError } from 'serialize-error' +import { l } from '@/lib/clients/logger/logger' +import { getMeter } from '@/lib/clients/meter' +import { getTracer } from '@/lib/clients/tracer' +import { flattenClientInputValue } from '@/lib/utils/action' import { internalServerError } from '../errors' import { t } from '../init' diff --git a/src/server/api/models/builds.models.ts b/src/server/api/models/builds.models.ts index 73212da92..375a200fe 100644 --- a/src/server/api/models/builds.models.ts +++ b/src/server/api/models/builds.models.ts @@ -1,6 +1,6 @@ +import z from 'zod' import { LOG_RETENTION_MS } from '@/features/dashboard/templates/builds/constants' import type { components } from '@/types/infra-api.types' -import z from 'zod' export const BuildStatusDTOSchema = z.enum(['building', 'failed', 'success']) diff --git a/src/server/api/procedures.ts b/src/server/api/procedures.ts index f36a9e319..e95e777b9 100644 --- a/src/server/api/procedures.ts +++ b/src/server/api/procedures.ts @@ -1,7 +1,7 @@ +import { context, SpanStatusCode, trace } from '@opentelemetry/api' +import z from 'zod' import { getTracer } from '@/lib/clients/tracer' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' -import { SpanStatusCode, context, trace } from '@opentelemetry/api' -import z from 'zod' import checkUserTeamAuthCached from '../auth/check-user-team-auth-cached' import { getTeamIdFromSegment } from '../team/get-team-id-from-segment' import { forbiddenTeamAccessError } from './errors' diff --git a/src/server/api/repositories/auth.repository.ts b/src/server/api/repositories/auth.repository.ts index c52f4728f..4f1c5182d 100644 --- a/src/server/api/repositories/auth.repository.ts +++ b/src/server/api/repositories/auth.repository.ts @@ -1,7 +1,7 @@ -import { l } from '@/lib/clients/logger/logger' -import { createClient } from '@/lib/clients/supabase/server' import { TRPCError } from '@trpc/server' import { serializeError } from 'serialize-error' +import { l } from '@/lib/clients/logger/logger' +import { createClient } from '@/lib/clients/supabase/server' import type { OtpType } from '../models/auth.models' interface VerifyOtpResult { diff --git a/src/server/api/repositories/builds.repository.ts b/src/server/api/repositories/builds.repository.ts index 1a7b4687e..6e3ced1d9 100644 --- a/src/server/api/repositories/builds.repository.ts +++ b/src/server/api/repositories/builds.repository.ts @@ -1,17 +1,17 @@ +import { TRPCError } from '@trpc/server' +import z from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { supabaseAdmin } from '@/lib/clients/supabase/admin' import type { Database } from '@/types/database.types' -import { TRPCError } from '@trpc/server' -import z from 'zod' import { apiError } from '../errors' import { type BuildStatusDB, - ListedBuildDTO, - type RunningBuildStatusDTO, + type ListedBuildDTO, mapDatabaseBuildReasonToListedBuildDTOStatusMessage, mapDatabaseBuildStatusToBuildStatusDTO, + type RunningBuildStatusDTO, } from '../models/builds.models' // helpers diff --git a/src/server/api/routers/billing.ts b/src/server/api/routers/billing.ts index 5e9904721..49bccddf7 100644 --- a/src/server/api/routers/billing.ts +++ b/src/server/api/routers/billing.ts @@ -1,10 +1,13 @@ +import { TRPCError } from '@trpc/server' +import { headers } from 'next/headers' +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { ADDON_500_SANDBOXES_ID, ADDON_PURCHASE_ACTION_ERRORS, } from '@/features/dashboard/billing/constants' import getTeamLimitsMemo from '@/server/team/get-team-limits-memo' -import { +import type { AddOnOrderConfirmResponse, AddOnOrderCreateResponse, BillingLimit, @@ -14,9 +17,6 @@ import { TeamItems, UsageResponse, } from '@/types/billing.types' -import { TRPCError } from '@trpc/server' -import { headers } from 'next/headers' -import { z } from 'zod' import { createTRPCRouter } from '../init' import { protectedTeamProcedure } from '../procedures' diff --git a/src/server/api/routers/builds.ts b/src/server/api/routers/builds.ts index aa2c94dcc..06363a741 100644 --- a/src/server/api/routers/builds.ts +++ b/src/server/api/routers/builds.ts @@ -1,10 +1,10 @@ -import { buildsRepo } from '@/server/api/repositories/builds.repository' import { z } from 'zod' +import { buildsRepo } from '@/server/api/repositories/builds.repository' import { createTRPCRouter } from '../init' import { - BuildDetailsDTO, - BuildLogDTO, - BuildLogsDTO, + type BuildDetailsDTO, + type BuildLogDTO, + type BuildLogsDTO, BuildStatusDTOSchema, checkIfBuildStillHasLogs, mapBuildStatusDTOToDatabaseBuildStatus, diff --git a/src/server/api/routers/sandboxes.ts b/src/server/api/routers/sandboxes.ts index 20299b1dd..8fcad8571 100644 --- a/src/server/api/routers/sandboxes.ts +++ b/src/server/api/routers/sandboxes.ts @@ -1,10 +1,11 @@ +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { USE_MOCK_DATA } from '@/configs/flags' import { + calculateTeamMetricsStep, MOCK_SANDBOXES_DATA, MOCK_TEAM_METRICS_DATA, MOCK_TEAM_METRICS_MAX_DATA, - calculateTeamMetricsStep, } from '@/configs/mock-data' import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' @@ -12,7 +13,6 @@ import { fillTeamMetricsWithZeros, transformMetricsToClientMetrics, } from '@/server/sandboxes/utils' -import { z } from 'zod' import { apiError } from '../errors' import { createTRPCRouter } from '../init' import { protectedTeamProcedure } from '../procedures' diff --git a/src/server/api/routers/support.ts b/src/server/api/routers/support.ts index 76e064067..8ecc0aa18 100644 --- a/src/server/api/routers/support.ts +++ b/src/server/api/routers/support.ts @@ -1,7 +1,7 @@ -import { l } from '@/lib/clients/logger/logger' import { PlainClient } from '@team-plain/typescript-sdk' import { TRPCError } from '@trpc/server' import { z } from 'zod' +import { l } from '@/lib/clients/logger/logger' import { createTRPCRouter } from '../init' import { protectedProcedure } from '../procedures' diff --git a/src/server/api/routers/templates.ts b/src/server/api/routers/templates.ts index 5b211b85d..8ed03f0ed 100644 --- a/src/server/api/routers/templates.ts +++ b/src/server/api/routers/templates.ts @@ -1,3 +1,6 @@ +import { TRPCError } from '@trpc/server' +import { cacheLife, cacheTag } from 'next/cache' +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { CACHE_TAGS } from '@/configs/cache' import { USE_MOCK_DATA } from '@/configs/flags' @@ -8,10 +11,7 @@ import { import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { supabaseAdmin } from '@/lib/clients/supabase/admin' -import { DefaultTemplate } from '@/types/api.types' -import { TRPCError } from '@trpc/server' -import { cacheLife, cacheTag } from 'next/cache' -import { z } from 'zod' +import type { DefaultTemplate } from '@/types/api.types' import { apiError } from '../errors' import { createTRPCRouter } from '../init' import { protectedProcedure, protectedTeamProcedure } from '../procedures' diff --git a/src/server/api/schemas/sandboxes.ts b/src/server/api/schemas/sandboxes.ts index 389d1843f..18b4d280c 100644 --- a/src/server/api/schemas/sandboxes.ts +++ b/src/server/api/schemas/sandboxes.ts @@ -1,5 +1,5 @@ -import { MAX_DAYS_AGO } from '@/features/dashboard/sandboxes/monitoring/time-picker/constants' import { z } from 'zod' +import { MAX_DAYS_AGO } from '@/features/dashboard/sandboxes/monitoring/time-picker/constants' // PRIVATE diff --git a/src/server/auth/auth-actions.ts b/src/server/auth/auth-actions.ts index 3e7e0678a..ed00d4e10 100644 --- a/src/server/auth/auth-actions.ts +++ b/src/server/auth/auth-actions.ts @@ -1,5 +1,9 @@ 'use server' +import { headers } from 'next/headers' +import { redirect } from 'next/navigation' +import { returnValidationErrors } from 'next-safe-action' +import { z } from 'zod' import { CAPTCHA_REQUIRED_SERVER } from '@/configs/flags' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' import { USER_MESSAGES } from '@/configs/user-messages' @@ -14,10 +18,6 @@ import { shouldWarnAboutAlternateEmail, validateEmail, } from '@/server/auth/validate-email' -import { returnValidationErrors } from 'next-safe-action' -import { headers } from 'next/headers' -import { redirect } from 'next/navigation' -import { z } from 'zod' import { forgotPasswordSchema, signInSchema, signUpSchema } from './auth.types' async function validateCaptcha(captchaToken: string | undefined) { diff --git a/src/server/auth/auth.types.ts b/src/server/auth/auth.types.ts index 8c929b0cb..98f0e3a81 100644 --- a/src/server/auth/auth.types.ts +++ b/src/server/auth/auth.types.ts @@ -1,6 +1,6 @@ +import { z } from 'zod' import { CAPTCHA_REQUIRED_CLIENT } from '@/configs/flags' import { relativeUrlSchema } from '@/lib/schemas/url' -import { z } from 'zod' export const emailSchema = z.email('Valid email is required') diff --git a/src/server/auth/check-user-team-auth-cached.ts b/src/server/auth/check-user-team-auth-cached.ts index a9c3f1fce..9d088f5c5 100644 --- a/src/server/auth/check-user-team-auth-cached.ts +++ b/src/server/auth/check-user-team-auth-cached.ts @@ -1,10 +1,10 @@ import 'server-only' +import { cacheTag } from 'next/cache' +import { serializeError } from 'serialize-error' import { CACHE_TAGS } from '@/configs/cache' import { l } from '@/lib/clients/logger/logger' import { supabaseAdmin } from '@/lib/clients/supabase/admin' -import { cacheTag } from 'next/cache' -import { serializeError } from 'serialize-error' export async function checkUserTeamAuth(userId: string, teamId: string) { const { data: userTeamsRelationData, error: userTeamsRelationError } = diff --git a/src/server/auth/get-default-team.ts b/src/server/auth/get-default-team.ts index b7bf51b9b..f3820d68f 100644 --- a/src/server/auth/get-default-team.ts +++ b/src/server/auth/get-default-team.ts @@ -1,8 +1,8 @@ import 'server-cli-only' +import { serializeError } from 'serialize-error' import { l } from '@/lib/clients/logger/logger' import { supabaseAdmin } from '@/lib/clients/supabase/admin' -import { serializeError } from 'serialize-error' export async function getDefaultTeamRelation(userId: string) { const { data, error } = await supabaseAdmin diff --git a/src/server/auth/get-session.ts b/src/server/auth/get-session.ts index 67bb1e848..3623d6459 100644 --- a/src/server/auth/get-session.ts +++ b/src/server/auth/get-session.ts @@ -33,7 +33,7 @@ export async function getSessionInsecure( ] // Override console.warn to filter out specific warnings - console.warn = function (...args) { + console.warn = (...args) => { if ( !args.some( (arg) => @@ -46,7 +46,7 @@ export async function getSessionInsecure( } // Override console.log to filter out specific warnings - console.log = function (...args) { + console.log = (...args) => { if ( !args.some( (arg) => diff --git a/src/server/auth/get-user-by-token.ts b/src/server/auth/get-user-by-token.ts index 1fea14d58..02d43d4ce 100644 --- a/src/server/auth/get-user-by-token.ts +++ b/src/server/auth/get-user-by-token.ts @@ -1,8 +1,8 @@ import 'server-only' -import { supabaseAdmin } from '@/lib/clients/supabase/admin' import { AuthSessionMissingError } from '@supabase/supabase-js' import { cache } from 'react' +import { supabaseAdmin } from '@/lib/clients/supabase/admin' /** * Retrieves a user from Supabase using their access token. diff --git a/src/server/auth/validate-email.ts b/src/server/auth/validate-email.ts index 637a6d169..bf32b9f42 100644 --- a/src/server/auth/validate-email.ts +++ b/src/server/auth/validate-email.ts @@ -1,7 +1,7 @@ -import { KV_KEYS } from '@/configs/keys' -import { l } from '@/lib/clients/logger/logger' import { kv } from '@vercel/kv' import { serializeError } from 'serialize-error' +import { KV_KEYS } from '@/configs/keys' +import { l } from '@/lib/clients/logger/logger' /** * Response type from the ZeroBounce email validation API diff --git a/src/server/keys/get-api-keys.ts b/src/server/keys/get-api-keys.ts index 949d93432..14b519152 100644 --- a/src/server/keys/get-api-keys.ts +++ b/src/server/keys/get-api-keys.ts @@ -1,5 +1,7 @@ import 'server-only' +import { cacheLife, cacheTag } from 'next/cache' +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { CACHE_TAGS } from '@/configs/cache' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' @@ -7,8 +9,6 @@ import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { handleDefaultInfraError } from '@/lib/utils/action' -import { cacheLife, cacheTag } from 'next/cache' -import { z } from 'zod' const GetApiKeysSchema = z.object({ teamIdOrSlug: TeamIdOrSlugSchema, diff --git a/src/server/keys/key-actions.ts b/src/server/keys/key-actions.ts index 5fd1436c1..d5c410feb 100644 --- a/src/server/keys/key-actions.ts +++ b/src/server/keys/key-actions.ts @@ -1,5 +1,7 @@ 'use server' +import { revalidatePath, updateTag } from 'next/cache' +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { CACHE_TAGS } from '@/configs/cache' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' @@ -7,8 +9,6 @@ import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { returnServerError } from '@/lib/utils/action' -import { revalidatePath, updateTag } from 'next/cache' -import { z } from 'zod' // Create API Key diff --git a/src/server/proxy.ts b/src/server/proxy.ts index bfd74fd0c..18fd217ad 100644 --- a/src/server/proxy.ts +++ b/src/server/proxy.ts @@ -1,7 +1,7 @@ import 'server-cli-only' +import { type NextRequest, NextResponse } from 'next/server' import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' -import { NextRequest, NextResponse } from 'next/server' export function isAuthRoute(pathname: string): boolean { return ( diff --git a/src/server/sandboxes/get-sandbox-details.ts b/src/server/sandboxes/get-sandbox-details.ts index f8028c8a2..8acfdc4e3 100644 --- a/src/server/sandboxes/get-sandbox-details.ts +++ b/src/server/sandboxes/get-sandbox-details.ts @@ -1,10 +1,10 @@ +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { handleDefaultInfraError, returnServerError } from '@/lib/utils/action' -import { z } from 'zod' export const GetSandboxDetailsSchema = z.object({ teamIdOrSlug: TeamIdOrSlugSchema, diff --git a/src/server/sandboxes/get-sandbox-root.ts b/src/server/sandboxes/get-sandbox-root.ts index 220b49ae0..453d60779 100644 --- a/src/server/sandboxes/get-sandbox-root.ts +++ b/src/server/sandboxes/get-sandbox-root.ts @@ -1,10 +1,10 @@ +import Sandbox, { NotFoundError } from 'e2b' +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' import { l } from '@/lib/clients/logger/logger' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { returnServerError } from '@/lib/utils/action' -import Sandbox, { NotFoundError } from 'e2b' -import { z } from 'zod' export const GetSandboxRootSchema = z.object({ teamIdOrSlug: TeamIdOrSlugSchema, diff --git a/src/server/sandboxes/get-team-metrics-core.ts b/src/server/sandboxes/get-team-metrics-core.ts index a49e503cc..67262e638 100644 --- a/src/server/sandboxes/get-team-metrics-core.ts +++ b/src/server/sandboxes/get-team-metrics-core.ts @@ -1,17 +1,17 @@ import 'server-only' +import { cache } from 'react' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { USE_MOCK_DATA } from '@/configs/flags' import { - MOCK_TEAM_METRICS_DATA, calculateTeamMetricsStep, + MOCK_TEAM_METRICS_DATA, } from '@/configs/mock-data' import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { handleDefaultInfraError } from '@/lib/utils/action' import { fillTeamMetricsWithZeros } from '@/server/sandboxes/utils' -import { ClientTeamMetrics } from '@/types/sandboxes.types' -import { cache } from 'react' +import type { ClientTeamMetrics } from '@/types/sandboxes.types' interface GetTeamMetricsCoreParams { accessToken: string diff --git a/src/server/sandboxes/get-team-metrics-max.ts b/src/server/sandboxes/get-team-metrics-max.ts index b8ee405d8..74d629e6d 100644 --- a/src/server/sandboxes/get-team-metrics-max.ts +++ b/src/server/sandboxes/get-team-metrics-max.ts @@ -1,5 +1,6 @@ import 'server-only' +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { USE_MOCK_DATA } from '@/configs/flags' import { MOCK_TEAM_METRICS_MAX_DATA } from '@/configs/mock-data' @@ -9,7 +10,6 @@ import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { handleDefaultInfraError } from '@/lib/utils/action' -import { z } from 'zod' export const GetTeamMetricsMaxSchema = z .object({ diff --git a/src/server/sandboxes/get-team-metrics.ts b/src/server/sandboxes/get-team-metrics.ts index fd8eb4375..ec99273a7 100644 --- a/src/server/sandboxes/get-team-metrics.ts +++ b/src/server/sandboxes/get-team-metrics.ts @@ -1,10 +1,10 @@ import 'server-only' +import { z } from 'zod' import { MAX_DAYS_AGO } from '@/features/dashboard/sandboxes/monitoring/time-picker/constants' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { returnServerError } from '@/lib/utils/action' -import { z } from 'zod' import { getTeamMetricsCore } from './get-team-metrics-core' export const GetTeamMetricsSchema = z diff --git a/src/server/sandboxes/sandbox-actions.ts b/src/server/sandboxes/sandbox-actions.ts index 06c13dc90..c01315e4b 100644 --- a/src/server/sandboxes/sandbox-actions.ts +++ b/src/server/sandboxes/sandbox-actions.ts @@ -1,5 +1,7 @@ 'use server' +import { updateTag } from 'next/cache' +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { CACHE_TAGS } from '@/configs/cache' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' @@ -7,8 +9,6 @@ import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { returnServerError } from '@/lib/utils/action' -import { updateTag } from 'next/cache' -import { z } from 'zod' const KillSandboxSchema = z.object({ teamIdOrSlug: TeamIdOrSlugSchema, diff --git a/src/server/sandboxes/utils.ts b/src/server/sandboxes/utils.ts index 242907937..96e5622b7 100644 --- a/src/server/sandboxes/utils.ts +++ b/src/server/sandboxes/utils.ts @@ -1,6 +1,6 @@ import { TEAM_METRICS_BACKEND_COLLECTION_INTERVAL_MS } from '@/configs/intervals' -import { SandboxesMetricsRecord } from '@/types/api.types' -import { +import type { SandboxesMetricsRecord } from '@/types/api.types' +import type { ClientSandboxesMetrics, ClientTeamMetrics, } from '@/types/sandboxes.types' diff --git a/src/server/team/get-team-id-from-segment.ts b/src/server/team/get-team-id-from-segment.ts index bb94c3cb9..c01a4d1f7 100644 --- a/src/server/team/get-team-id-from-segment.ts +++ b/src/server/team/get-team-id-from-segment.ts @@ -1,13 +1,13 @@ import 'server-only' -import { CACHE_TAGS } from '@/configs/cache' -import { l } from '@/lib/clients/logger/logger' -import { supabaseAdmin } from '@/lib/clients/supabase/admin' -import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { cacheLife } from 'next/dist/server/use-cache/cache-life' import { cacheTag } from 'next/dist/server/use-cache/cache-tag' import { serializeError } from 'serialize-error' import z from 'zod' +import { CACHE_TAGS } from '@/configs/cache' +import { l } from '@/lib/clients/logger/logger' +import { supabaseAdmin } from '@/lib/clients/supabase/admin' +import { TeamIdOrSlugSchema } from '@/lib/schemas/team' export const getTeamIdFromSegment = async (segment: string) => { 'use cache' diff --git a/src/server/team/get-team-limits-memo.ts b/src/server/team/get-team-limits-memo.ts index e0b2b1052..20d2ee6a8 100644 --- a/src/server/team/get-team-limits-memo.ts +++ b/src/server/team/get-team-limits-memo.ts @@ -1,9 +1,9 @@ import 'server-cli-only' -import { l } from '@/lib/clients/logger/logger' -import { supabaseAdmin } from '@/lib/clients/supabase/admin' import { cache } from 'react' import { serializeError } from 'serialize-error' +import { l } from '@/lib/clients/logger/logger' +import { supabaseAdmin } from '@/lib/clients/supabase/admin' import type { TeamLimits } from './get-team-limits' /** diff --git a/src/server/team/get-team-limits.ts b/src/server/team/get-team-limits.ts index 5ded24bc4..1e70b6b91 100644 --- a/src/server/team/get-team-limits.ts +++ b/src/server/team/get-team-limits.ts @@ -1,10 +1,10 @@ import 'server-only' +import { z } from 'zod' import { USE_MOCK_DATA } from '@/configs/flags' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { returnServerError } from '@/lib/utils/action' -import { z } from 'zod' import getTeamLimitsMemo from './get-team-limits-memo' export interface TeamLimits { diff --git a/src/server/team/get-team-members.ts b/src/server/team/get-team-members.ts index 811531ad4..b0b7270db 100644 --- a/src/server/team/get-team-members.ts +++ b/src/server/team/get-team-members.ts @@ -1,11 +1,11 @@ import 'server-only' +import type { User } from '@supabase/supabase-js' +import { z } from 'zod' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' import { supabaseAdmin } from '@/lib/clients/supabase/admin' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' -import { User } from '@supabase/supabase-js' -import { z } from 'zod' -import { TeamMemberInfo } from './types' +import type { TeamMemberInfo } from './types' const GetTeamMembersSchema = z.object({ teamIdOrSlug: TeamIdOrSlugSchema, diff --git a/src/server/team/get-team-pure.ts b/src/server/team/get-team-pure.ts index cac21806a..cb28d7859 100644 --- a/src/server/team/get-team-pure.ts +++ b/src/server/team/get-team-pure.ts @@ -2,7 +2,7 @@ import 'server-cli-only' import { supabaseAdmin } from '@/lib/clients/supabase/admin' import { returnServerError } from '@/lib/utils/action' -import { ClientTeam } from '@/types/dashboard.types' +import type { ClientTeam } from '@/types/dashboard.types' export const getTeamPure = async (userId: string, teamId: string) => { const { data: userTeamsRelationData, error: userTeamsRelationError } = diff --git a/src/server/team/get-team.ts b/src/server/team/get-team.ts index e924928fd..a16e453bf 100644 --- a/src/server/team/get-team.ts +++ b/src/server/team/get-team.ts @@ -1,9 +1,9 @@ import 'server-cli-only' +import { z } from 'zod' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { returnServerError } from '@/lib/utils/action' -import { z } from 'zod' import getTeamMemo from './get-team-memo' import getUserTeamsMemo from './get-user-teams-memo' diff --git a/src/server/team/get-user-teams.ts b/src/server/team/get-user-teams.ts index 88d4b4767..2aa93c51a 100644 --- a/src/server/team/get-user-teams.ts +++ b/src/server/team/get-user-teams.ts @@ -1,10 +1,10 @@ import 'server-cli-only' +import type { User } from '@supabase/supabase-js' +import { serializeError } from 'serialize-error' import { l } from '@/lib/clients/logger/logger' import { supabaseAdmin } from '@/lib/clients/supabase/admin' -import { ClientTeam } from '@/types/dashboard.types' -import { User } from '@supabase/supabase-js' -import { serializeError } from 'serialize-error' +import type { ClientTeam } from '@/types/dashboard.types' export async function getUserTeams(user: User): Promise { const { data: usersTeamsData, error } = await supabaseAdmin diff --git a/src/server/team/resolve-user-team.ts b/src/server/team/resolve-user-team.ts index ea56efdc5..edb5fcd03 100644 --- a/src/server/team/resolve-user-team.ts +++ b/src/server/team/resolve-user-team.ts @@ -1,12 +1,12 @@ import 'server-only' +import { cookies } from 'next/headers' +import { serializeError } from 'serialize-error' import { COOKIE_KEYS } from '@/configs/cookies' import { l } from '@/lib/clients/logger/logger' import { supabaseAdmin } from '@/lib/clients/supabase/admin' -import { cookies } from 'next/headers' -import { serializeError } from 'serialize-error' import { checkUserTeamAuth } from '../auth/check-user-team-auth-cached' -import { ResolvedTeam } from './types' +import type { ResolvedTeam } from './types' /** * Resolves team ID and slug for a user using this priority: diff --git a/src/server/team/team-actions.ts b/src/server/team/team-actions.ts index d1f407c55..677010ced 100644 --- a/src/server/team/team-actions.ts +++ b/src/server/team/team-actions.ts @@ -1,5 +1,12 @@ 'use server' +import { fileTypeFromBuffer } from 'file-type' +import { revalidatePath, revalidateTag } from 'next/cache' +import { after } from 'next/server' +import { returnValidationErrors } from 'next-safe-action' +import { serializeError } from 'serialize-error' +import { z } from 'zod' +import { zfd } from 'zod-form-data' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { CACHE_TAGS } from '@/configs/cache' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' @@ -9,14 +16,7 @@ import { supabaseAdmin } from '@/lib/clients/supabase/admin' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { handleDefaultInfraError, returnServerError } from '@/lib/utils/action' import { CreateTeamSchema, UpdateTeamNameSchema } from '@/server/team/types' -import { CreateTeamsResponse } from '@/types/billing.types' -import { fileTypeFromBuffer } from 'file-type' -import { returnValidationErrors } from 'next-safe-action' -import { revalidatePath, revalidateTag } from 'next/cache' -import { after } from 'next/server' -import { serializeError } from 'serialize-error' -import { z } from 'zod' -import { zfd } from 'zod-form-data' +import type { CreateTeamsResponse } from '@/types/billing.types' export const updateTeamNameAction = authActionClient .schema(UpdateTeamNameSchema) diff --git a/src/server/team/types.ts b/src/server/team/types.ts index c193747c2..da7e90574 100644 --- a/src/server/team/types.ts +++ b/src/server/team/types.ts @@ -1,6 +1,6 @@ -import { TeamIdOrSlugSchema } from '@/lib/schemas/team' -import { Database } from '@/types/database.types' import { z } from 'zod' +import { TeamIdOrSlugSchema } from '@/lib/schemas/team' +import type { Database } from '@/types/database.types' export type TeamMemberInfo = { id: string @@ -23,7 +23,7 @@ export const TeamNameSchema = z .trim() .min(1, { message: 'Team name cannot be empty' }) .max(32, { message: 'Team name cannot be longer than 32 characters' }) - .regex(/^[a-zA-Z0-9]+(?:[ _.\-][a-zA-Z0-9]+)*$/, { + .regex(/^[a-zA-Z0-9]+(?:[ _.-][a-zA-Z0-9]+)*$/, { message: 'Names can only contain letters and numbers, separated by spaces, underscores, hyphens, or dots', }) diff --git a/src/server/usage/get-usage.ts b/src/server/usage/get-usage.ts index 39786c391..ac4449afa 100644 --- a/src/server/usage/get-usage.ts +++ b/src/server/usage/get-usage.ts @@ -1,13 +1,13 @@ import 'server-only' +import { cacheLife, cacheTag } from 'next/cache' +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { CACHE_TAGS } from '@/configs/cache' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { returnServerError } from '@/lib/utils/action' -import { UsageResponse } from '@/types/billing.types' -import { cacheLife, cacheTag } from 'next/cache' -import { z } from 'zod' +import type { UsageResponse } from '@/types/billing.types' const GetUsageAuthActionSchema = z.object({ teamIdOrSlug: TeamIdOrSlugSchema, diff --git a/src/server/user/user-actions.ts b/src/server/user/user-actions.ts index d26e3f14e..dd230abd5 100644 --- a/src/server/user/user-actions.ts +++ b/src/server/user/user-actions.ts @@ -1,11 +1,11 @@ 'use server' -import { authActionClient } from '@/lib/clients/action' -import { generateE2BUserAccessToken } from '@/lib/utils/server' -import { returnValidationErrors } from 'next-safe-action' import { revalidatePath } from 'next/cache' import { headers } from 'next/headers' +import { returnValidationErrors } from 'next-safe-action' import { z } from 'zod' +import { authActionClient } from '@/lib/clients/action' +import { generateE2BUserAccessToken } from '@/lib/utils/server' const UpdateUserSchema = z .object({ diff --git a/src/server/webhooks/get-webhooks.ts b/src/server/webhooks/get-webhooks.ts index f58ec8cba..53fedc0c2 100644 --- a/src/server/webhooks/get-webhooks.ts +++ b/src/server/webhooks/get-webhooks.ts @@ -1,12 +1,12 @@ import 'server-only' +import { z } from 'zod' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { handleDefaultInfraError } from '@/lib/utils/action' -import { z } from 'zod' const GetWebhooksSchema = z.object({ teamIdOrSlug: TeamIdOrSlugSchema, diff --git a/src/server/webhooks/schema.ts b/src/server/webhooks/schema.ts index 1b4a906e2..1ec7cb946 100644 --- a/src/server/webhooks/schema.ts +++ b/src/server/webhooks/schema.ts @@ -1,5 +1,5 @@ -import { TeamIdOrSlugSchema } from '@/lib/schemas/team' import { z } from 'zod' +import { TeamIdOrSlugSchema } from '@/lib/schemas/team' const WebhookUrlSchema = z.httpUrl('Must be a valid URL').trim() const WebhookSecretSchema = z diff --git a/src/server/webhooks/webhooks-actions.ts b/src/server/webhooks/webhooks-actions.ts index 3d86c23d2..85e410b7f 100644 --- a/src/server/webhooks/webhooks-actions.ts +++ b/src/server/webhooks/webhooks-actions.ts @@ -1,13 +1,13 @@ 'use server' +import { revalidatePath } from 'next/cache' +import { cookies } from 'next/headers' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { COOKIE_KEYS } from '@/configs/cookies' import { authActionClient, withTeamIdResolution } from '@/lib/clients/action' import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' import { handleDefaultInfraError } from '@/lib/utils/action' -import { revalidatePath } from 'next/cache' -import { cookies } from 'next/headers' import { DeleteWebhookSchema, UpdateWebhookSecretSchema, diff --git a/src/styles/theme.css b/src/styles/theme.css index 8de22e67e..c58a72729 100644 --- a/src/styles/theme.css +++ b/src/styles/theme.css @@ -105,7 +105,12 @@ --graph-area-accent-main-from: rgba(229, 111, 0, 0.16); --graph-area-accent-main-to: rgba(250, 250, 250, 0.16); - --graph-area-accent-positive-from: rgba(0, 166, 112, 0.16); /* Success/positive area gradient */ + --graph-area-accent-positive-from: rgba( + 0, + 166, + 112, + 0.16 + ); /* Success/positive area gradient */ --graph-area-accent-positive-to: rgba(250, 250, 250, 0.2); --graph-area-fg-from: rgba(108, 108, 108, 0.2); @@ -120,10 +125,20 @@ --graph-area-3-from: rgba(226, 124, 29, 0.18); /* Dark orange area gradient */ --graph-area-3-to: rgba(250, 250, 250, 0.2); - --graph-area-4-from: rgba(192, 155, 184, 0.18); /* Pastel purple-peach area gradient */ + --graph-area-4-from: rgba( + 192, + 155, + 184, + 0.18 + ); /* Pastel purple-peach area gradient */ --graph-area-4-to: rgba(250, 250, 250, 0.2); - --graph-area-5-from: rgba(166, 127, 169, 0.18); /* Pastel purple area gradient */ + --graph-area-5-from: rgba( + 166, + 127, + 169, + 0.18 + ); /* Pastel purple area gradient */ --graph-area-5-to: rgba(250, 250, 250, 0.2); --graph-area-6-from: rgba(140, 92, 165, 0.18); /* Purple area gradient */ @@ -189,7 +204,12 @@ --graph-area-accent-main-from: rgba(255, 136, 0, 0.22); --graph-area-accent-main-to: rgba(10, 10, 10, 0.2); - --graph-area-accent-positive-from: rgba(0, 217, 146, 0.22); /* Success/positive area gradient */ + --graph-area-accent-positive-from: rgba( + 0, + 217, + 146, + 0.22 + ); /* Success/positive area gradient */ --graph-area-accent-positive-to: rgba(10, 10, 10, 0.2); --graph-area-1-from: rgba(252, 232, 216, 0.35); /* Peachy area gradient */ @@ -204,10 +224,20 @@ --graph-area-fg-from: rgba(108, 108, 108, 0.2); --graph-area-fg-to: rgba(10, 10, 10, 0.2); - --graph-area-4-from: rgba(212, 176, 204, 0.25); /* Pastel purple-peach area gradient */ + --graph-area-4-from: rgba( + 212, + 176, + 204, + 0.25 + ); /* Pastel purple-peach area gradient */ --graph-area-4-to: rgba(10, 10, 10, 0.2); - --graph-area-5-from: rgba(186, 148, 189, 0.25); /* Pastel purple area gradient */ + --graph-area-5-from: rgba( + 186, + 148, + 189, + 0.25 + ); /* Pastel purple area gradient */ --graph-area-5-to: rgba(10, 10, 10, 0.2); --graph-area-6-from: rgba(162, 117, 187, 0.25); /* Purple area gradient */ @@ -289,38 +319,41 @@ --color-chart-5: var(--accent-error-highlight); /* Shadows */ - --shadow-xs: 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)), + --shadow-xs: + 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 1px 1px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --shadow-sm: 0 1px 3px hsl(from var(--shadow) h s l / var(--shadow-strength)), + --shadow-sm: + 0 1px 3px hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --shadow-md: 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)), + --shadow-md: + 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 2px 4px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --shadow-lg: 0 10px 15px - hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 4px 6px - hsl(from var(--shadow) h s l / var(--shadow-strength)); - --shadow-xl: 0 20px 25px - hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 8px 10px - hsl(from var(--shadow) h s l / var(--shadow-strength)); + --shadow-lg: + 0 10px 15px hsl(from var(--shadow) h s l / var(--shadow-strength)), + 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)); + --shadow-xl: + 0 20px 25px hsl(from var(--shadow) h s l / var(--shadow-strength)), + 0 8px 10px hsl(from var(--shadow) h s l / var(--shadow-strength)); --shadow-2xl: 0 25px 50px hsl(from var(--shadow) h s l / var(--shadow-strength)); --shadow-inner: inset 0 2px 4px hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-xs: 0 1px 2px - hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 1px 1px - hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-sm: 0 1px 3px - hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 1px 2px - hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-md: 0 4px 6px - hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 2px 4px - hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-lg: 0 10px 15px - hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 4px 6px - hsl(from var(--shadow) h s l / var(--shadow-strength)); - --drop-shadow-xl: 0 20px 25px - hsl(from var(--shadow) h s l / var(--shadow-strength)), 0 8px 10px - hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-xs: + 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)), + 0 1px 1px hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-sm: + 0 1px 3px hsl(from var(--shadow) h s l / var(--shadow-strength)), + 0 1px 2px hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-md: + 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)), + 0 2px 4px hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-lg: + 0 10px 15px hsl(from var(--shadow) h s l / var(--shadow-strength)), + 0 4px 6px hsl(from var(--shadow) h s l / var(--shadow-strength)); + --drop-shadow-xl: + 0 20px 25px hsl(from var(--shadow) h s l / var(--shadow-strength)), + 0 8px 10px hsl(from var(--shadow) h s l / var(--shadow-strength)); --drop-shadow-2xl: 0 25px 50px hsl(from var(--shadow) h s l / var(--shadow-strength)); @@ -329,8 +362,9 @@ "IBM Plex Sans", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --font-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, - Consolas, "Liberation Mono", "Courier New", monospace; + --font-mono: + "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; --font-fira-code: "Fira Code", monospace; /* Animations */ diff --git a/src/trpc/client.tsx b/src/trpc/client.tsx index 40ba72c3d..362435c67 100644 --- a/src/trpc/client.tsx +++ b/src/trpc/client.tsx @@ -1,14 +1,14 @@ 'use client' -import type { TRPCAppRouter } from '@/server/api/routers' import type { QueryClient } from '@tanstack/react-query' import { QueryClientProvider } from '@tanstack/react-query' import { ReactQueryDevtools } from '@tanstack/react-query-devtools' import { createTRPCClient, httpBatchStreamLink, loggerLink } from '@trpc/client' -import { inferRouterInputs, inferRouterOutputs } from '@trpc/server' +import type { inferRouterInputs, inferRouterOutputs } from '@trpc/server' import { createTRPCContext } from '@trpc/tanstack-react-query' import { useState } from 'react' import SuperJSON from 'superjson' +import type { TRPCAppRouter } from '@/server/api/routers' import { createQueryClient } from './query-client' export const { TRPCProvider, useTRPC, useTRPCClient } = diff --git a/src/trpc/query-client.ts b/src/trpc/query-client.ts index f51b4f222..9e3a0d65f 100644 --- a/src/trpc/query-client.ts +++ b/src/trpc/query-client.ts @@ -1,4 +1,4 @@ -import { QueryClient, defaultShouldDehydrateQuery } from '@tanstack/react-query' +import { defaultShouldDehydrateQuery, QueryClient } from '@tanstack/react-query' import SuperJSON from 'superjson' export const createQueryClient = () => diff --git a/src/trpc/server.tsx b/src/trpc/server.tsx index 3b35ccfc8..941427cce 100644 --- a/src/trpc/server.tsx +++ b/src/trpc/server.tsx @@ -1,9 +1,9 @@ import 'server-only' -import { HydrationBoundary, dehydrate } from '@tanstack/react-query' +import { dehydrate, HydrationBoundary } from '@tanstack/react-query' import { - TRPCQueryOptions, createTRPCOptionsProxy, + type TRPCQueryOptions, } from '@trpc/tanstack-react-query' import { headers } from 'next/headers' import { cache } from 'react' diff --git a/src/types/api.types.ts b/src/types/api.types.ts index f13dddeb5..a01590613 100644 --- a/src/types/api.types.ts +++ b/src/types/api.types.ts @@ -1,4 +1,4 @@ -import { components as InfraComponents } from '@/types/infra-api.types' +import type { components as InfraComponents } from '@/types/infra-api.types' type Sandbox = InfraComponents['schemas']['ListedSandbox'] diff --git a/src/types/billing.types.ts b/src/types/billing.types.ts index ae28e127b..e7318dbd1 100644 --- a/src/types/billing.types.ts +++ b/src/types/billing.types.ts @@ -1,4 +1,4 @@ -import { ADDON_500_SANDBOXES_ID } from '@/features/dashboard/billing/constants' +import type { ADDON_500_SANDBOXES_ID } from '@/features/dashboard/billing/constants' interface Invoice { cost: number diff --git a/src/types/dashboard.types.ts b/src/types/dashboard.types.ts index b3e952725..974496149 100644 --- a/src/types/dashboard.types.ts +++ b/src/types/dashboard.types.ts @@ -1,4 +1,4 @@ -import { Database } from './database.types' +import type { Database } from './database.types' export type ClientTeam = Database['public']['Tables']['teams']['Row'] & { is_default?: boolean diff --git a/src/types/sandboxes.types.ts b/src/types/sandboxes.types.ts index 7f0abab70..fd3382d9c 100644 --- a/src/types/sandboxes.types.ts +++ b/src/types/sandboxes.types.ts @@ -1,4 +1,4 @@ -import { TeamMetric } from './api.types' +import type { TeamMetric } from './api.types' export type ClientSandboxMetric = { cpuCount: number diff --git a/src/ui/alert-dialog.tsx b/src/ui/alert-dialog.tsx index 26b84292b..41f71ecb2 100644 --- a/src/ui/alert-dialog.tsx +++ b/src/ui/alert-dialog.tsx @@ -1,7 +1,7 @@ 'use client' +import type { FC } from 'react' import { cn } from '@/lib/utils' -import { FC } from 'react' import { Button } from './primitives/button' import { Dialog, diff --git a/src/ui/alert-popover.tsx b/src/ui/alert-popover.tsx index 107bf017c..7dc106671 100644 --- a/src/ui/alert-popover.tsx +++ b/src/ui/alert-popover.tsx @@ -1,6 +1,6 @@ 'use client' -import { FC } from 'react' +import type { FC } from 'react' import { Button } from './primitives/button' import { Popover, PopoverContent, PopoverTrigger } from './primitives/popover' diff --git a/src/ui/brand.tsx b/src/ui/brand.tsx index 1dbe6b0ab..5cfeeca36 100644 --- a/src/ui/brand.tsx +++ b/src/ui/brand.tsx @@ -1,5 +1,5 @@ import { cn } from '@/lib/utils' -import { Badge, BadgeProps } from '@/ui/primitives/badge' +import { Badge, type BadgeProps } from '@/ui/primitives/badge' export const E2BLogo = ({ className, diff --git a/src/ui/chart-placeholder.tsx b/src/ui/chart-placeholder.tsx index 7581b8340..3b3a7e4de 100644 --- a/src/ui/chart-placeholder.tsx +++ b/src/ui/chart-placeholder.tsx @@ -1,12 +1,12 @@ 'use client' +import { Area, AreaChart } from 'recharts' import { cn } from '@/lib/utils' import { ChartContainer, ChartTooltip, ChartTooltipContent, } from '@/ui/primitives/chart' -import { Area, AreaChart } from 'recharts' import { Card } from './primitives/card' interface ChartPlaceholderProps { diff --git a/src/ui/client-only.tsx b/src/ui/client-only.tsx index ada44e5ad..a4fe92e0e 100644 --- a/src/ui/client-only.tsx +++ b/src/ui/client-only.tsx @@ -1,7 +1,7 @@ 'use client' -import useIsMounted from '@/lib/hooks/use-is-mounted' import { AnimatePresence, motion } from 'motion/react' +import useIsMounted from '@/lib/hooks/use-is-mounted' export interface ClientOnlyProps { children: React.ReactNode diff --git a/src/ui/code-block.tsx b/src/ui/code-block.tsx index 5df0986e9..82631ad52 100644 --- a/src/ui/code-block.tsx +++ b/src/ui/code-block.tsx @@ -1,17 +1,16 @@ 'use client' +import type { ScrollAreaViewportProps } from '@radix-ui/react-scroll-area' import { + forwardRef, type HTMLAttributes, type ReactNode, - forwardRef, useCallback, useRef, } from 'react' - +import ShikiHighlighter from 'react-shiki' import { useShikiTheme } from '@/configs/shiki' import { useClipboard } from '@/lib/hooks/use-clipboard' import { cn } from '@/lib/utils' -import type { ScrollAreaViewportProps } from '@radix-ui/react-scroll-area' -import ShikiHighlighter from 'react-shiki' import CopyButton from './copy-button' import { ScrollArea, ScrollBar, ScrollViewport } from './primitives/scroll-area' diff --git a/src/ui/copy-button-inline.tsx b/src/ui/copy-button-inline.tsx index f11499901..303a06f45 100644 --- a/src/ui/copy-button-inline.tsx +++ b/src/ui/copy-button-inline.tsx @@ -1,6 +1,6 @@ +import { useRef, useState } from 'react' import { useClipboard } from '@/lib/hooks/use-clipboard' import { cn } from '@/lib/utils/ui' -import { useRef, useState } from 'react' export default function CopyButtonInline({ value, diff --git a/src/ui/copy-button.tsx b/src/ui/copy-button.tsx index f814e4bcb..af27dad71 100644 --- a/src/ui/copy-button.tsx +++ b/src/ui/copy-button.tsx @@ -1,9 +1,9 @@ 'use client' -import { useClipboard } from '@/lib/hooks/use-clipboard' -import { Button, ButtonProps } from '@/ui/primitives/button' import { CheckIcon } from 'lucide-react' -import { FC } from 'react' +import type { FC } from 'react' +import { useClipboard } from '@/lib/hooks/use-clipboard' +import { Button, type ButtonProps } from '@/ui/primitives/button' import { CopyIcon } from './primitives/icons' interface CopyButtonProps extends ButtonProps { diff --git a/src/ui/dashboard-tabs.tsx b/src/ui/dashboard-tabs.tsx index 85cc9871c..41d7ea210 100644 --- a/src/ui/dashboard-tabs.tsx +++ b/src/ui/dashboard-tabs.tsx @@ -1,10 +1,16 @@ 'use client' -import { cn } from '@/lib/utils' -import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/ui/primitives/tabs' import Link from 'next/link' import { usePathname, useSearchParams } from 'next/navigation' -import { ReactElement, ReactNode, memo, useCallback, useMemo } from 'react' +import { + memo, + type ReactElement, + type ReactNode, + useCallback, + useMemo, +} from 'react' +import { cn } from '@/lib/utils' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/ui/primitives/tabs' type DashboardTabElement = ReactElement diff --git a/src/ui/data-table.tsx b/src/ui/data-table.tsx index f26402b35..7059a12bd 100644 --- a/src/ui/data-table.tsx +++ b/src/ui/data-table.tsx @@ -1,3 +1,10 @@ +import type { Cell, Header } from '@tanstack/react-table' +import { + ArrowDownWideNarrow, + ArrowUpDown, + ArrowUpNarrowWide, +} from 'lucide-react' +import * as React from 'react' import { cn } from '@/lib/utils' import { Button } from '@/ui/primitives/button' import { @@ -8,13 +15,6 @@ import { SelectValue, } from '@/ui/primitives/select' import { Separator } from '@/ui/primitives/separator' -import { Cell, Header } from '@tanstack/react-table' -import { - ArrowDownWideNarrow, - ArrowUpDown, - ArrowUpNarrowWide, -} from 'lucide-react' -import * as React from 'react' interface DataTableColumnHeaderProps extends React.HTMLAttributes { diff --git a/src/ui/docs-code-block.tsx b/src/ui/docs-code-block.tsx index 50c1f4205..b4f0f9d6d 100644 --- a/src/ui/docs-code-block.tsx +++ b/src/ui/docs-code-block.tsx @@ -1,17 +1,16 @@ 'use client' +import type { ScrollAreaViewportProps } from '@radix-ui/react-scroll-area' import { Check, Copy } from 'lucide-react' import { type ButtonHTMLAttributes, + forwardRef, type HTMLAttributes, type ReactNode, - forwardRef, useCallback, useRef, } from 'react' - import { useClipboard } from '@/lib/hooks/use-clipboard' import { cn } from '@/lib/utils' -import type { ScrollAreaViewportProps } from '@radix-ui/react-scroll-area' import { buttonVariants } from './primitives/button' import { ScrollArea, ScrollBar, ScrollViewport } from './primitives/scroll-area' diff --git a/src/ui/docs-tabs.tsx b/src/ui/docs-tabs.tsx index bea8ab20b..7158f3f29 100644 --- a/src/ui/docs-tabs.tsx +++ b/src/ui/docs-tabs.tsx @@ -1,7 +1,5 @@ 'use client' -import { IconsMap } from '@/configs/docs' -import { cn } from '@/lib/utils' import type { TabsProps as BaseProps, TabsContentProps, @@ -16,6 +14,8 @@ import { useRef, useState, } from 'react' +import { IconsMap } from '@/configs/docs' +import { cn } from '@/lib/utils' import * as Primitive from './primitives/tabs' export { Primitive } diff --git a/src/ui/drawer-css-provider.tsx b/src/ui/drawer-css-provider.tsx index 8f6a46685..5531c6f43 100644 --- a/src/ui/drawer-css-provider.tsx +++ b/src/ui/drawer-css-provider.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react' +import type { ReactNode } from 'react' export const DrawerCSSProvider = ({ children }: { children: ReactNode }) => { return ( diff --git a/src/ui/empty.tsx b/src/ui/empty.tsx index da7d6d8f0..f9e6f7594 100644 --- a/src/ui/empty.tsx +++ b/src/ui/empty.tsx @@ -1,5 +1,5 @@ +import type { ReactNode } from 'react' import { cn } from '@/lib/utils' -import { ReactNode } from 'react' import { Card, CardContent, diff --git a/src/ui/error-indicator.tsx b/src/ui/error-indicator.tsx index 02f65577a..22542bd59 100644 --- a/src/ui/error-indicator.tsx +++ b/src/ui/error-indicator.tsx @@ -1,9 +1,9 @@ 'use client' -import { cn } from '@/lib/utils' import { RefreshCcw } from 'lucide-react' import { useRouter } from 'next/navigation' import { useTransition } from 'react' +import { cn } from '@/lib/utils' import { Button } from './primitives/button' import { Card, diff --git a/src/ui/error.tsx b/src/ui/error.tsx index 029e7ebf1..f51c67434 100644 --- a/src/ui/error.tsx +++ b/src/ui/error.tsx @@ -1,10 +1,10 @@ 'use client' -import { l } from '@/lib/clients/logger/logger' -import { cn } from '@/lib/utils' import { useEffect } from 'react' import { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary' import { serializeError } from 'serialize-error' +import { l } from '@/lib/clients/logger/logger' +import { cn } from '@/lib/utils' import { ErrorIndicator } from './error-indicator' import Frame from './frame' diff --git a/src/ui/external-icon.tsx b/src/ui/external-icon.tsx index 347ad2415..840268e2f 100644 --- a/src/ui/external-icon.tsx +++ b/src/ui/external-icon.tsx @@ -1,5 +1,5 @@ -import { cn } from '@/lib/utils' import { ChevronRight } from 'lucide-react' +import { cn } from '@/lib/utils' interface ExternalIconProps { className?: string diff --git a/src/ui/help-tooltip.tsx b/src/ui/help-tooltip.tsx index 1c2a42b84..1e994cf9c 100644 --- a/src/ui/help-tooltip.tsx +++ b/src/ui/help-tooltip.tsx @@ -1,5 +1,5 @@ -import { cn } from '@/lib/utils' import { InfoIcon } from 'lucide-react' +import { cn } from '@/lib/utils' import { Tooltip, TooltipContent, diff --git a/src/ui/hover-prefetch-link.tsx b/src/ui/hover-prefetch-link.tsx index f7065427d..80e7f6176 100644 --- a/src/ui/hover-prefetch-link.tsx +++ b/src/ui/hover-prefetch-link.tsx @@ -1,6 +1,6 @@ 'use client' -import Link, { LinkProps } from 'next/link' +import Link, { type LinkProps } from 'next/link' import { forwardRef, useState } from 'react' export const HoverPrefetchLink = forwardRef< diff --git a/src/ui/icons.tsx b/src/ui/icons.tsx index eb42352b0..4e02ce4f4 100644 --- a/src/ui/icons.tsx +++ b/src/ui/icons.tsx @@ -1,8 +1,8 @@ -import { cn } from '@/lib/utils' import type { LucideIcon } from 'lucide-react' import { TerminalIcon } from 'lucide-react' -import { type HTMLAttributes } from 'react' -import { IconBaseProps } from 'react-icons/lib' +import type { HTMLAttributes } from 'react' +import type { IconBaseProps } from 'react-icons/lib' +import { cn } from '@/lib/utils' export function IconContainer({ icon: Icon, diff --git a/src/ui/json-popover.tsx b/src/ui/json-popover.tsx index e3c70b24f..24192ab5b 100644 --- a/src/ui/json-popover.tsx +++ b/src/ui/json-popover.tsx @@ -1,5 +1,7 @@ 'use client' +import { useState } from 'react' +import ShikiHighlighter from 'react-shiki' import { useShikiTheme } from '@/configs/shiki' import { cn } from '@/lib/utils' import { @@ -7,8 +9,6 @@ import { PopoverContent, PopoverTrigger, } from '@/ui/primitives/popover' -import { useState } from 'react' -import ShikiHighlighter from 'react-shiki' import { Button } from './primitives/button' import { ScrollArea, ScrollBar } from './primitives/scroll-area' diff --git a/src/ui/live.tsx b/src/ui/live.tsx index 169c4586c..29af56f85 100644 --- a/src/ui/live.tsx +++ b/src/ui/live.tsx @@ -3,7 +3,7 @@ import { TEAM_METRICS_POLLING_INTERVAL_MS } from '@/configs/intervals' import { cn } from '@/lib/utils' import HelpTooltip from './help-tooltip' -import { Badge, BadgeProps } from './primitives/badge' +import { Badge, type BadgeProps } from './primitives/badge' interface LiveDotProps { classNames?: { diff --git a/src/ui/not-found.tsx b/src/ui/not-found.tsx index 60e1bd74e..7906e5bfc 100644 --- a/src/ui/not-found.tsx +++ b/src/ui/not-found.tsx @@ -1,8 +1,8 @@ 'use client' -import { PROTECTED_URLS } from '@/configs/urls' import { ArrowLeft, HomeIcon, LayoutDashboard } from 'lucide-react' import Link from 'next/link' +import { PROTECTED_URLS } from '@/configs/urls' import { Button } from './primitives/button' import { Card, diff --git a/src/ui/number-input.tsx b/src/ui/number-input.tsx index 3ec915cf4..73c72fa34 100644 --- a/src/ui/number-input.tsx +++ b/src/ui/number-input.tsx @@ -1,8 +1,8 @@ 'use client' -import { cn } from '@/lib/utils' import { ChevronDown, ChevronUp } from 'lucide-react' import * as React from 'react' +import { cn } from '@/lib/utils' import { Button } from './primitives/button' import { Input } from './primitives/input' diff --git a/src/ui/polling-button.tsx b/src/ui/polling-button.tsx index 718b165f8..69c7b9f5d 100644 --- a/src/ui/polling-button.tsx +++ b/src/ui/polling-button.tsx @@ -1,3 +1,4 @@ +import { RefreshCw } from 'lucide-react' import { usePolling } from '@/lib/hooks/use-polling' import { cn } from '@/lib/utils' import { Button } from '@/ui/primitives/button' @@ -8,7 +9,6 @@ import { SelectTrigger, } from '@/ui/primitives/select' import { Separator } from '@/ui/primitives/separator' -import { RefreshCw } from 'lucide-react' export interface PollingInterval { value: number diff --git a/src/ui/primitives/alert.tsx b/src/ui/primitives/alert.tsx index 388897266..b866733d7 100644 --- a/src/ui/primitives/alert.tsx +++ b/src/ui/primitives/alert.tsx @@ -1,6 +1,6 @@ -import { cn } from '@/lib/utils' -import { type VariantProps, cva } from 'class-variance-authority' +import { cva, type VariantProps } from 'class-variance-authority' import * as React from 'react' +import { cn } from '@/lib/utils' const alertVariants = cva( 'relative w-full border-solid p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-fg', diff --git a/src/ui/primitives/animated-number.tsx b/src/ui/primitives/animated-number.tsx index 5d6660406..713fb2828 100644 --- a/src/ui/primitives/animated-number.tsx +++ b/src/ui/primitives/animated-number.tsx @@ -1,8 +1,8 @@ 'use client' -import { cn } from '@/lib/utils' import { AnimatePresence, motion } from 'motion/react' import { memo, useEffect, useRef, useState } from 'react' +import { cn } from '@/lib/utils' interface AnimatedNumberProps { value: string | number diff --git a/src/ui/primitives/avatar.tsx b/src/ui/primitives/avatar.tsx index 9901dcd80..c70e9049b 100644 --- a/src/ui/primitives/avatar.tsx +++ b/src/ui/primitives/avatar.tsx @@ -1,8 +1,8 @@ 'use client' -import { cn } from '@/lib/utils' import * as AvatarPrimitive from '@radix-ui/react-avatar' import * as React from 'react' +import { cn } from '@/lib/utils' const Avatar = React.forwardRef< React.ElementRef, diff --git a/src/ui/primitives/badge.tsx b/src/ui/primitives/badge.tsx index ba5492dd8..e65cc848b 100644 --- a/src/ui/primitives/badge.tsx +++ b/src/ui/primitives/badge.tsx @@ -1,7 +1,7 @@ -import { cn } from '@/lib/utils/index' import { Slot } from '@radix-ui/react-slot' -import { type VariantProps, cva } from 'class-variance-authority' -import * as React from 'react' +import { cva, type VariantProps } from 'class-variance-authority' +import type * as React from 'react' +import { cn } from '@/lib/utils/index' const badgeVariants = cva( 'inline-flex items-center cursor-default justify-center focus-visible:ring-1 w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 [&>svg]:pointer-events-none ![&>svg]:pl-0.75 aria-invalid:ring-accent-error-highlight/20 aria-invalid:border-accent-error-highlight transition-[color,box-shadow] overflow-hidden', diff --git a/src/ui/primitives/button.tsx b/src/ui/primitives/button.tsx index 17b849f4b..4b6a0d05e 100644 --- a/src/ui/primitives/button.tsx +++ b/src/ui/primitives/button.tsx @@ -1,7 +1,7 @@ -import { cn } from '@/lib/utils/index' import { Slot } from '@radix-ui/react-slot' -import { type VariantProps, cva } from 'class-variance-authority' +import { cva, type VariantProps } from 'class-variance-authority' import * as React from 'react' +import { cn } from '@/lib/utils/index' import { Loader } from './loader_d' const buttonVariants = cva( diff --git a/src/ui/primitives/calendar.tsx b/src/ui/primitives/calendar.tsx index 351dc3671..1db9e5630 100644 --- a/src/ui/primitives/calendar.tsx +++ b/src/ui/primitives/calendar.tsx @@ -6,7 +6,11 @@ import { ChevronRightIcon, } from 'lucide-react' import * as React from 'react' -import { DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker' +import { + type DayButton, + DayPicker, + getDefaultClassNames, +} from 'react-day-picker' import { cn } from '@/lib/utils/index' import { Button, buttonVariants } from '@/ui/primitives/button' diff --git a/src/ui/primitives/card.tsx b/src/ui/primitives/card.tsx index 3b1fa2ade..140ba8ceb 100644 --- a/src/ui/primitives/card.tsx +++ b/src/ui/primitives/card.tsx @@ -1,6 +1,6 @@ -import { cn } from '@/lib/utils' -import { VariantProps, cva } from 'class-variance-authority' +import { cva, type VariantProps } from 'class-variance-authority' import * as React from 'react' +import { cn } from '@/lib/utils' export const cardVariants = cva('', { variants: { diff --git a/src/ui/primitives/checkbox.tsx b/src/ui/primitives/checkbox.tsx index f10c7b95c..839b79091 100644 --- a/src/ui/primitives/checkbox.tsx +++ b/src/ui/primitives/checkbox.tsx @@ -1,10 +1,9 @@ 'use client' -import { CheckIcon } from '@/ui/primitives/icons' import * as CheckboxPrimitive from '@radix-ui/react-checkbox' -import * as React from 'react' - +import type * as React from 'react' import { cn } from '@/lib/utils/ui' +import { CheckIcon } from '@/ui/primitives/icons' function Checkbox({ className, diff --git a/src/ui/primitives/dialog.tsx b/src/ui/primitives/dialog.tsx index 5153e5932..64e939735 100644 --- a/src/ui/primitives/dialog.tsx +++ b/src/ui/primitives/dialog.tsx @@ -2,7 +2,7 @@ import * as DialogPrimitive from '@radix-ui/react-dialog' import { XIcon } from 'lucide-react' -import * as React from 'react' +import type * as React from 'react' import { cn } from '@/lib/utils' diff --git a/src/ui/primitives/drawer.tsx b/src/ui/primitives/drawer.tsx index b8fbfa18b..1b06bb35f 100644 --- a/src/ui/primitives/drawer.tsx +++ b/src/ui/primitives/drawer.tsx @@ -1,6 +1,6 @@ 'use client' -import * as React from 'react' +import type * as React from 'react' import { Drawer as DrawerPrimitive } from 'vaul' import { cn } from '@/lib/utils' diff --git a/src/ui/primitives/dropdown-menu.tsx b/src/ui/primitives/dropdown-menu.tsx index 7fe288e7c..054d04032 100644 --- a/src/ui/primitives/dropdown-menu.tsx +++ b/src/ui/primitives/dropdown-menu.tsx @@ -1,11 +1,10 @@ 'use client' import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' +import type { VariantProps } from 'class-variance-authority' +import { ChevronRight } from 'lucide-react' import * as React from 'react' - import { cn } from '@/lib/utils' -import { VariantProps } from 'class-variance-authority' -import { ChevronRight } from 'lucide-react' import { Checkbox } from './checkbox' import { CheckIcon } from './icons' import { diff --git a/src/ui/primitives/form.tsx b/src/ui/primitives/form.tsx index 43475a3dd..5a2d49414 100644 --- a/src/ui/primitives/form.tsx +++ b/src/ui/primitives/form.tsx @@ -1,13 +1,13 @@ 'use client' -import * as LabelPrimitive from '@radix-ui/react-label' +import type * as LabelPrimitive from '@radix-ui/react-label' import { Slot } from '@radix-ui/react-slot' import * as React from 'react' import { Controller, - ControllerProps, - FieldPath, - FieldValues, + type ControllerProps, + type FieldPath, + type FieldValues, FormProvider, useFormContext, } from 'react-hook-form' diff --git a/src/ui/primitives/icons.tsx b/src/ui/primitives/icons.tsx index c23459b26..f77994d9a 100644 --- a/src/ui/primitives/icons.tsx +++ b/src/ui/primitives/icons.tsx @@ -1,5 +1,5 @@ +import type React from 'react' import { cn } from '@/lib/utils/index' -import React from 'react' const DEFAULT_CLASS_NAMES = 'size-6' diff --git a/src/ui/primitives/input.tsx b/src/ui/primitives/input.tsx index 3af085c65..7ce2f37e7 100644 --- a/src/ui/primitives/input.tsx +++ b/src/ui/primitives/input.tsx @@ -1,9 +1,8 @@ 'use client' import * as React from 'react' - -import { cn } from '@/lib/utils' import { useEffect, useState } from 'react' +import { cn } from '@/lib/utils' export interface InputProps extends React.InputHTMLAttributes {} diff --git a/src/ui/primitives/kbd.tsx b/src/ui/primitives/kbd.tsx index 956b64271..38002fa49 100644 --- a/src/ui/primitives/kbd.tsx +++ b/src/ui/primitives/kbd.tsx @@ -1,10 +1,10 @@ 'use client' -import { cn } from '@/lib/utils' import * as React from 'react' import { useEffect, useState } from 'react' -import ClientOnly, { ClientOnlyProps } from '../client-only' -import { Badge, BadgeProps } from './badge' +import { cn } from '@/lib/utils' +import ClientOnly, { type ClientOnlyProps } from '../client-only' +import { Badge, type BadgeProps } from './badge' export interface KbdProps { keys: string[] diff --git a/src/ui/primitives/label.tsx b/src/ui/primitives/label.tsx index 605918f80..e118cac4b 100644 --- a/src/ui/primitives/label.tsx +++ b/src/ui/primitives/label.tsx @@ -1,8 +1,8 @@ 'use client' -import { cn } from '@/lib/utils' import * as LabelPrimitive from '@radix-ui/react-label' import * as React from 'react' +import { cn } from '@/lib/utils' const Label = React.forwardRef< React.ElementRef, diff --git a/src/ui/primitives/loader_d.tsx b/src/ui/primitives/loader_d.tsx index 3b442ecb1..3c5806dbb 100644 --- a/src/ui/primitives/loader_d.tsx +++ b/src/ui/primitives/loader_d.tsx @@ -1,5 +1,5 @@ -import { cn } from '@/lib/utils' import * as React from 'react' +import { cn } from '@/lib/utils' interface LoaderProps extends React.HTMLAttributes { size?: 'sm' | 'md' | 'lg' | 'xl' diff --git a/src/ui/primitives/radio-group.tsx b/src/ui/primitives/radio-group.tsx index 180127254..92f428b05 100644 --- a/src/ui/primitives/radio-group.tsx +++ b/src/ui/primitives/radio-group.tsx @@ -1,8 +1,8 @@ 'use client' -import { cn } from '@/lib/utils' import * as RadioGroupPrimitive from '@radix-ui/react-radio-group' -import * as React from 'react' +import type * as React from 'react' +import { cn } from '@/lib/utils' function RadioGroup({ className, diff --git a/src/ui/primitives/select.tsx b/src/ui/primitives/select.tsx index 99a5db0cf..cda0b6fdf 100644 --- a/src/ui/primitives/select.tsx +++ b/src/ui/primitives/select.tsx @@ -1,10 +1,9 @@ 'use client' import * as SelectPrimitive from '@radix-ui/react-select' +import { ChevronsUpDown } from 'lucide-react' import * as React from 'react' - import { cn } from '@/lib/utils' -import { ChevronsUpDown } from 'lucide-react' import { menuContentStyles, menuGroupStyles, diff --git a/src/ui/primitives/shared-menu-styles.ts b/src/ui/primitives/shared-menu-styles.ts index 8fd33bebd..445cd40b8 100644 --- a/src/ui/primitives/shared-menu-styles.ts +++ b/src/ui/primitives/shared-menu-styles.ts @@ -1,6 +1,6 @@ +import { cva } from 'class-variance-authority' import { cn } from '@/lib/utils' import { cardVariants } from '@/ui/primitives/card' -import { cva } from 'class-variance-authority' export const menuItemVariants = cva( [ diff --git a/src/ui/primitives/sheet.tsx b/src/ui/primitives/sheet.tsx index 189e90344..895c3ae57 100644 --- a/src/ui/primitives/sheet.tsx +++ b/src/ui/primitives/sheet.tsx @@ -1,7 +1,7 @@ 'use client' import * as SheetPrimitive from '@radix-ui/react-dialog' -import { type VariantProps, cva } from 'class-variance-authority' +import { cva, type VariantProps } from 'class-variance-authority' import { X } from 'lucide-react' import * as React from 'react' diff --git a/src/ui/primitives/sidebar.tsx b/src/ui/primitives/sidebar.tsx index 0dfd1e9b7..53cc6ae3e 100644 --- a/src/ui/primitives/sidebar.tsx +++ b/src/ui/primitives/sidebar.tsx @@ -1,7 +1,7 @@ 'use client' import { Slot } from '@radix-ui/react-slot' -import { VariantProps, cva } from 'class-variance-authority' +import { cva, type VariantProps } from 'class-variance-authority' import { PanelLeftIcon } from 'lucide-react' import * as React from 'react' diff --git a/src/ui/primitives/sonner.tsx b/src/ui/primitives/sonner.tsx index 4fd44bfc9..8cd22d9f5 100644 --- a/src/ui/primitives/sonner.tsx +++ b/src/ui/primitives/sonner.tsx @@ -1,7 +1,7 @@ 'use client' import { useTheme } from 'next-themes' -import { Toaster as Sonner, ToasterProps } from 'sonner' +import { Toaster as Sonner, type ToasterProps } from 'sonner' const Toaster = ({ toastOptions, ...props }: ToasterProps) => { const { theme = 'system' } = useTheme() diff --git a/src/ui/primitives/tabs.tsx b/src/ui/primitives/tabs.tsx index 96b7e71e0..665980080 100644 --- a/src/ui/primitives/tabs.tsx +++ b/src/ui/primitives/tabs.tsx @@ -1,10 +1,9 @@ 'use client' import * as TabsPrimitive from '@radix-ui/react-tabs' +import { motion } from 'motion/react' import * as React from 'react' - import { cn, exponentialSmoothing } from '@/lib/utils' -import { motion } from 'motion/react' const TabsContext = React.createContext<{ value?: string diff --git a/src/ui/primitives/textarea.tsx b/src/ui/primitives/textarea.tsx index 78286ceb1..4b0651b34 100644 --- a/src/ui/primitives/textarea.tsx +++ b/src/ui/primitives/textarea.tsx @@ -1,4 +1,4 @@ -import * as React from 'react' +import type * as React from 'react' import { cn } from '@/lib/utils' diff --git a/src/ui/primitives/toast.tsx b/src/ui/primitives/toast.tsx index 48aa2046c..82dad21aa 100644 --- a/src/ui/primitives/toast.tsx +++ b/src/ui/primitives/toast.tsx @@ -1,7 +1,7 @@ 'use client' import * as ToastPrimitives from '@radix-ui/react-toast' -import { type VariantProps, cva } from 'class-variance-authority' +import { cva, type VariantProps } from 'class-variance-authority' import { X } from 'lucide-react' import * as React from 'react' diff --git a/src/ui/primitives/toaster.tsx b/src/ui/primitives/toaster.tsx index df3649f34..77491791a 100644 --- a/src/ui/primitives/toaster.tsx +++ b/src/ui/primitives/toaster.tsx @@ -15,20 +15,16 @@ export function Toaster() { return ( - {toasts.map(function ({ id, title, description, action, ...props }) { - return ( - -
- {title && {title}} - {description && ( - {description} - )} -
- {action} - -
- ) - })} + {toasts.map(({ id, title, description, action, ...props }) => ( + +
+ {title && {title}} + {description && {description}} +
+ {action} + +
+ ))}
) diff --git a/src/ui/primitives/tooltip.tsx b/src/ui/primitives/tooltip.tsx index e9d88f224..0d4c5e988 100644 --- a/src/ui/primitives/tooltip.tsx +++ b/src/ui/primitives/tooltip.tsx @@ -1,7 +1,7 @@ 'use client' import * as TooltipPrimitive from '@radix-ui/react-tooltip' -import * as React from 'react' +import type * as React from 'react' import { cn } from '@/lib/utils' import { cardVariants } from './card' diff --git a/src/ui/shortcut-tooltip.tsx b/src/ui/shortcut-tooltip.tsx index f93e86303..77a4febb6 100644 --- a/src/ui/shortcut-tooltip.tsx +++ b/src/ui/shortcut-tooltip.tsx @@ -1,8 +1,8 @@ 'use client' +import type { ReactNode } from 'react' import { cn } from '@/lib/utils' -import { ReactNode } from 'react' -import { Kbd, KbdProps } from './primitives/kbd' +import { Kbd, type KbdProps } from './primitives/kbd' import { Separator } from './primitives/separator' import { Tooltip, TooltipContent, TooltipTrigger } from './primitives/tooltip' diff --git a/src/ui/skeletons.tsx b/src/ui/skeletons.tsx index 60a022d02..a56a277d2 100644 --- a/src/ui/skeletons.tsx +++ b/src/ui/skeletons.tsx @@ -1,4 +1,4 @@ -import { Column } from '@tanstack/react-table' +import type { Column } from '@tanstack/react-table' import { DataTableRow } from './data-table' import { Skeleton } from './primitives/skeleton' diff --git a/src/ui/survey.tsx b/src/ui/survey.tsx index 80f5c3c11..142c128ba 100644 --- a/src/ui/survey.tsx +++ b/src/ui/survey.tsx @@ -1,3 +1,14 @@ +import type { + SurveyQuestion as PostHogSurveyQuestion, + Survey, +} from 'posthog-js' +import { useCallback, useMemo, useState } from 'react' +import { + PiSmileyAngryFill, + PiSmileyFill, + PiSmileyMehFill, + PiSmileySadFill, +} from 'react-icons/pi' import { cn } from '@/lib/utils' import { Button } from '@/ui/primitives/button' import { @@ -8,14 +19,6 @@ import { } from '@/ui/primitives/card' import { Loader } from '@/ui/primitives/loader_d' import { Textarea } from '@/ui/primitives/textarea' -import { SurveyQuestion as PostHogSurveyQuestion, Survey } from 'posthog-js' -import { useCallback, useMemo, useState } from 'react' -import { - PiSmileyAngryFill, - PiSmileyFill, - PiSmileyMehFill, - PiSmileySadFill, -} from 'react-icons/pi' import { PiSmileyStarEyesFill } from './icons' const EMOJI_SIZE = '38px' diff --git a/src/ui/theme-switcher.tsx b/src/ui/theme-switcher.tsx index 3b6bc2763..bf0f7a7c2 100644 --- a/src/ui/theme-switcher.tsx +++ b/src/ui/theme-switcher.tsx @@ -1,5 +1,7 @@ 'use client' +import { Laptop, Moon, Sun } from 'lucide-react' +import { useTheme } from 'next-themes' import useIsMounted from '@/lib/hooks/use-is-mounted' import { Button } from '@/ui/primitives/button' import { @@ -9,8 +11,6 @@ import { DropdownMenuRadioItem, DropdownMenuTrigger, } from '@/ui/primitives/dropdown-menu' -import { Laptop, Moon, Sun } from 'lucide-react' -import { useTheme } from 'next-themes' interface ThemeSwitcherProps { className?: string diff --git a/src/ui/time-range-presets.tsx b/src/ui/time-range-presets.tsx index 803c60fa8..8ff38b990 100644 --- a/src/ui/time-range-presets.tsx +++ b/src/ui/time-range-presets.tsx @@ -5,8 +5,8 @@ 'use client' -import { cn } from '@/lib/utils' import { useCallback } from 'react' +import { cn } from '@/lib/utils' import { Label } from './primitives/label' import { RadioGroup, RadioGroupItem } from './primitives/radio-group' import { ScrollArea } from './primitives/scroll-area' From fc68e31643bb3126479b79f1b7a88b21039f3e7e Mon Sep 17 00:00:00 2001 From: ben-fornefeld Date: Fri, 27 Feb 2026 11:35:10 -0800 Subject: [PATCH 3/7] format: after merge --- .../integration/inspect-sandbox.test.ts | 8 +- src/features/dashboard/build/logs-cells.tsx | 9 +- src/features/dashboard/build/logs.tsx | 14 +- .../dashboard/build/use-build-logs.ts | 3 +- .../dashboard/common/log-viewer-ui.tsx | 12 +- .../dashboard/sandbox/header/controls.tsx | 2 +- .../dashboard/sandbox/logs/logs-cells.tsx | 5 +- src/features/dashboard/sandbox/logs/logs.tsx | 30 +- .../sandbox/logs/sandbox-logs-store.ts | 4 +- .../sandbox/logs/use-sandbox-logs.ts | 7 +- .../dashboard/sandboxes/list/table.tsx | 10 +- .../api/repositories/builds.repository.ts | 6 +- .../api/repositories/sandboxes.repository.ts | 2 +- src/server/api/routers/sandbox.ts | 4 +- src/types/infra-api.types.ts | 5661 +++++++++-------- 15 files changed, 2896 insertions(+), 2881 deletions(-) diff --git a/src/__test__/integration/inspect-sandbox.test.ts b/src/__test__/integration/inspect-sandbox.test.ts index 12624b5c7..c45c9981e 100644 --- a/src/__test__/integration/inspect-sandbox.test.ts +++ b/src/__test__/integration/inspect-sandbox.test.ts @@ -1,11 +1,9 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { - SUPABASE_TEAM_HEADER, - SUPABASE_TOKEN_HEADER, -} from '@/configs/api' -import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' + import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { SUPABASE_TEAM_HEADER, SUPABASE_TOKEN_HEADER } from '@/configs/api' +import { AUTH_URLS, PROTECTED_URLS } from '@/configs/urls' // ============================================================================ // MOCKS SETUP diff --git a/src/features/dashboard/build/logs-cells.tsx b/src/features/dashboard/build/logs-cells.tsx index 3c5f31235..b42f9e47a 100644 --- a/src/features/dashboard/build/logs-cells.tsx +++ b/src/features/dashboard/build/logs-cells.tsx @@ -1,9 +1,12 @@ +import { format } from 'date-fns' +import { enUS } from 'date-fns/locale/en-US' +import { + LogLevelBadge, + LogMessage, +} from '@/features/dashboard/common/log-cells' import { formatDurationCompact } from '@/lib/utils/formatting' -import { LogLevelBadge, LogMessage } from '@/features/dashboard/common/log-cells' import type { BuildLogDTO } from '@/server/api/models/builds.models' import CopyButtonInline from '@/ui/copy-button-inline' -import { format } from 'date-fns' -import { enUS } from 'date-fns/locale/en-US' import { Badge, type BadgeProps } from '@/ui/primitives/badge' export const LogLevel = ({ level }: { level: BuildLogDTO['level'] }) => { diff --git a/src/features/dashboard/build/logs.tsx b/src/features/dashboard/build/logs.tsx index 3ded36a92..6b15c15e8 100644 --- a/src/features/dashboard/build/logs.tsx +++ b/src/features/dashboard/build/logs.tsx @@ -13,18 +13,18 @@ import { useRef, useState, } from 'react' -import { cn } from '@/lib/utils' import { LOG_LEVEL_LEFT_BORDER_CLASS, type LogLevelValue, } from '@/features/dashboard/common/log-cells' import { + LogStatusCell, LogsEmptyBody, LogsLoaderBody, LogsTableHeader, - LogStatusCell, LogVirtualRow, } from '@/features/dashboard/common/log-viewer-ui' +import { cn } from '@/lib/utils' import type { BuildDetailsDTO, BuildLogDTO, @@ -230,9 +230,7 @@ function EmptyBody({ hasRetainedLogs }: EmptyBodyProps) { ? undefined : `This build has exceeded the ${LOG_RETENTION_MS / 24 / 60 / 60 / 1000} day retention limit.` - return ( - - ) + return } interface LevelFilterProps { @@ -623,7 +621,11 @@ function StatusRow({ isFetchingNextPage, }: StatusRowProps) { return ( - + {isFetchingNextPage ? ( diff --git a/src/features/dashboard/build/use-build-logs.ts b/src/features/dashboard/build/use-build-logs.ts index e76577b27..243330d5d 100644 --- a/src/features/dashboard/build/use-build-logs.ts +++ b/src/features/dashboard/build/use-build-logs.ts @@ -65,7 +65,8 @@ export function useBuildLogs({ if (prevIsBuildingRef.current) { isDraining.current = true - drainUntilTimestampMs.current = Date.now() + DRAIN_AFTER_BUILD_STOP_WINDOW_MS + drainUntilTimestampMs.current = + Date.now() + DRAIN_AFTER_BUILD_STOP_WINDOW_MS consecutiveEmptyDrainPolls.current = 0 } diff --git a/src/features/dashboard/common/log-viewer-ui.tsx b/src/features/dashboard/common/log-viewer-ui.tsx index 966975a19..c62a62209 100644 --- a/src/features/dashboard/common/log-viewer-ui.tsx +++ b/src/features/dashboard/common/log-viewer-ui.tsx @@ -1,3 +1,5 @@ +import type { VirtualItem, Virtualizer } from '@tanstack/react-virtual' +import type { CSSProperties, ReactNode } from 'react' import { cn } from '@/lib/utils' import { ArrowDownIcon, ListIcon } from '@/ui/primitives/icons' import { Loader } from '@/ui/primitives/loader' @@ -8,8 +10,6 @@ import { TableHeader, TableRow, } from '@/ui/primitives/table' -import type { VirtualItem, Virtualizer } from '@tanstack/react-virtual' -import type { CSSProperties, ReactNode } from 'react' interface LogsTableHeaderProps { timestampWidth: number @@ -35,7 +35,9 @@ export function LogsTableHeader({ > Timestamp{' '}

No logs found

- {description ?

{description}

: null} + {description ? ( +

{description}

+ ) : null}
diff --git a/src/features/dashboard/sandbox/header/controls.tsx b/src/features/dashboard/sandbox/header/controls.tsx index 174aa26a4..e159301aa 100644 --- a/src/features/dashboard/sandbox/header/controls.tsx +++ b/src/features/dashboard/sandbox/header/controls.tsx @@ -1,5 +1,5 @@ -import { COOKIE_KEYS } from '@/configs/cookies' import { cookies } from 'next/headers' +import { COOKIE_KEYS } from '@/configs/cookies' import KillButton from './kill-button' import RefreshControl from './refresh' diff --git a/src/features/dashboard/sandbox/logs/logs-cells.tsx b/src/features/dashboard/sandbox/logs/logs-cells.tsx index 56c279618..031fb903d 100644 --- a/src/features/dashboard/sandbox/logs/logs-cells.tsx +++ b/src/features/dashboard/sandbox/logs/logs-cells.tsx @@ -1,4 +1,7 @@ -import { LogLevelBadge, LogMessage } from '@/features/dashboard/common/log-cells' +import { + LogLevelBadge, + LogMessage, +} from '@/features/dashboard/common/log-cells' import type { SandboxLogDTO } from '@/server/api/models/sandboxes.models' import CopyButtonInline from '@/ui/copy-button-inline' diff --git a/src/features/dashboard/sandbox/logs/logs.tsx b/src/features/dashboard/sandbox/logs/logs.tsx index 44409e527..ab994420f 100644 --- a/src/features/dashboard/sandbox/logs/logs.tsx +++ b/src/features/dashboard/sandbox/logs/logs.tsx @@ -1,32 +1,32 @@ 'use client' +import { + useVirtualizer, + type VirtualItem, + type Virtualizer, +} from '@tanstack/react-virtual' +import { + useCallback, + useEffect, + useLayoutEffect, + useRef, + useState, +} from 'react' import { LOG_RETENTION_MS } from '@/configs/logs' import { LOG_LEVEL_LEFT_BORDER_CLASS, type LogLevelValue, } from '@/features/dashboard/common/log-cells' import { + LogStatusCell, LogsEmptyBody, LogsLoaderBody, LogsTableHeader, - LogStatusCell, LogVirtualRow, } from '@/features/dashboard/common/log-viewer-ui' import type { SandboxLogDTO } from '@/server/api/models/sandboxes.models' import { Loader } from '@/ui/primitives/loader' import { Table, TableBody, TableCell } from '@/ui/primitives/table' -import { - useVirtualizer, - VirtualItem, - Virtualizer, -} from '@tanstack/react-virtual' -import { - useCallback, - useEffect, - useLayoutEffect, - useRef, - useState, -} from 'react' import { useSandboxContext } from '../context' import { LogLevel, Message, Timestamp } from './logs-cells' import { useSandboxLogs } from './use-sandbox-logs' @@ -178,9 +178,7 @@ function EmptyBody({ hasRetainedLogs, errorMessage }: EmptyBodyProps) { ? `This sandbox has exceeded the ${LOG_RETENTION_DAYS} day retention limit.` : 'Sandbox logs will appear here once available.' - return ( - - ) + return } interface VirtualizedLogsBodyProps { diff --git a/src/features/dashboard/sandbox/logs/sandbox-logs-store.ts b/src/features/dashboard/sandbox/logs/sandbox-logs-store.ts index 580370697..e0790fe36 100644 --- a/src/features/dashboard/sandbox/logs/sandbox-logs-store.ts +++ b/src/features/dashboard/sandbox/logs/sandbox-logs-store.ts @@ -1,9 +1,9 @@ 'use client' -import type { SandboxLogDTO } from '@/server/api/models/sandboxes.models' -import type { useTRPCClient } from '@/trpc/client' import { create } from 'zustand' import { immer } from 'zustand/middleware/immer' +import type { SandboxLogDTO } from '@/server/api/models/sandboxes.models' +import type { useTRPCClient } from '@/trpc/client' import { countLeadingAtTimestamp, countTrailingAtTimestamp, diff --git a/src/features/dashboard/sandbox/logs/use-sandbox-logs.ts b/src/features/dashboard/sandbox/logs/use-sandbox-logs.ts index 78ffeac20..e9330f899 100644 --- a/src/features/dashboard/sandbox/logs/use-sandbox-logs.ts +++ b/src/features/dashboard/sandbox/logs/use-sandbox-logs.ts @@ -1,9 +1,9 @@ 'use client' -import { useTRPCClient } from '@/trpc/client' import { useQuery } from '@tanstack/react-query' import { useCallback, useEffect, useRef } from 'react' import { useStore } from 'zustand' +import { useTRPCClient } from '@/trpc/client' import { createSandboxLogsStore, type SandboxLogsStore, @@ -35,7 +35,10 @@ export function useSandboxLogs({ const logs = useStore(store, (s) => s.logs) const isInitialized = useStore(store, (s) => s.isInitialized) - const hasCompletedInitialLoad = useStore(store, (s) => s.hasCompletedInitialLoad) + const hasCompletedInitialLoad = useStore( + store, + (s) => s.hasCompletedInitialLoad + ) const initialLoadError = useStore(store, (s) => s.initialLoadError) const hasMoreBackwards = useStore(store, (s) => s.hasMoreBackwards) const isLoadingBackwards = useStore(store, (s) => s.isLoadingBackwards) diff --git a/src/features/dashboard/sandboxes/list/table.tsx b/src/features/dashboard/sandboxes/list/table.tsx index 2954dfecb..857a43efc 100644 --- a/src/features/dashboard/sandboxes/list/table.tsx +++ b/src/features/dashboard/sandboxes/list/table.tsx @@ -197,8 +197,8 @@ export default function SandboxesTable() { sorting={tableSorting.find((s) => s.id === header.id)?.desc} align={ header.id === 'cpuUsage' || - header.id === 'ramUsage' || - header.id === 'diskUsage' + header.id === 'ramUsage' || + header.id === 'diskUsage' ? 'right' : 'left' } @@ -207,9 +207,9 @@ export default function SandboxesTable() { {header.isPlaceholder ? null : flexRender( - header.column.columnDef.header, - header.getContext() - )} + header.column.columnDef.header, + header.getContext() + )}
))} diff --git a/src/server/api/repositories/builds.repository.ts b/src/server/api/repositories/builds.repository.ts index 1461f4992..6e3ced1d9 100644 --- a/src/server/api/repositories/builds.repository.ts +++ b/src/server/api/repositories/builds.repository.ts @@ -134,9 +134,9 @@ async function listBuilds( data: trimmedBuilds.map(mapRpcBuildToListedBuildDTO), nextCursor: hasMore ? encodeCursor( - trimmedBuilds[trimmedBuilds.length - 1]!.created_at, - trimmedBuilds[trimmedBuilds.length - 1]!.id - ) + trimmedBuilds[trimmedBuilds.length - 1]!.created_at, + trimmedBuilds[trimmedBuilds.length - 1]!.id + ) : null, } } diff --git a/src/server/api/repositories/sandboxes.repository.ts b/src/server/api/repositories/sandboxes.repository.ts index d8937c417..4cd934c58 100644 --- a/src/server/api/repositories/sandboxes.repository.ts +++ b/src/server/api/repositories/sandboxes.repository.ts @@ -1,7 +1,7 @@ +import { TRPCError } from '@trpc/server' import { SUPABASE_AUTH_HEADERS } from '@/configs/api' import { infra } from '@/lib/clients/api' import { l } from '@/lib/clients/logger/logger' -import { TRPCError } from '@trpc/server' import { apiError } from '../errors' // get sandbox logs diff --git a/src/server/api/routers/sandbox.ts b/src/server/api/routers/sandbox.ts index 728ce615c..c53a76463 100644 --- a/src/server/api/routers/sandbox.ts +++ b/src/server/api/routers/sandbox.ts @@ -2,8 +2,8 @@ import { z } from 'zod' import { createTRPCRouter } from '../init' import { mapInfraSandboxLogToDTO, - SandboxLogDTO, - SandboxLogsDTO, + type SandboxLogDTO, + type SandboxLogsDTO, } from '../models/sandboxes.models' import { protectedTeamProcedure } from '../procedures' import { sandboxesRepo } from '../repositories/sandboxes.repository' diff --git a/src/types/infra-api.types.ts b/src/types/infra-api.types.ts index 7b1e800f5..76cd47427 100644 --- a/src/types/infra-api.types.ts +++ b/src/types/infra-api.types.ts @@ -4,2838 +4,2841 @@ */ export interface paths { - "/health": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Health check */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Request was successful */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all teams */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all teams */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Team"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams/{teamID}/metrics": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get metrics for the team */ - get: { - parameters: { - query?: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number; - end?: number; - }; - header?: never; - path: { - teamID: components["parameters"]["teamID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the team metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamMetric"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/teams/{teamID}/metrics/max": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get the maximum metrics for the team in the given interval */ - get: { - parameters: { - query: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number; - end?: number; - /** @description Metric to retrieve the maximum value for */ - metric: "concurrent_sandboxes" | "sandbox_start_rate"; - }; - header?: never; - path: { - teamID: components["parameters"]["teamID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the team metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["MaxTeamMetric"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 403: components["responses"]["403"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all running sandboxes */ - get: { - parameters: { - query?: { - /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ - metadata?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all running sandboxes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ListedSandbox"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Create a sandbox from the template */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewSandbox"]; - }; - }; - responses: { - /** @description The sandbox was created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/sandboxes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all sandboxes */ - get: { - parameters: { - query?: { - /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ - metadata?: string; - /** @description Filter sandboxes by one or more states */ - state?: components["schemas"]["SandboxState"][]; - /** @description Cursor to start the list from */ - nextToken?: components["parameters"]["paginationNextToken"]; - /** @description Maximum number of items to return per page */ - limit?: components["parameters"]["paginationLimit"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all running sandboxes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ListedSandbox"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/metrics": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List metrics for given sandboxes */ - get: { - parameters: { - query: { - /** @description Comma-separated list of sandbox IDs to get metrics for */ - sandbox_ids: string[]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all running sandboxes with metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxesWithMetrics"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get sandbox logs */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - start?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - }; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox logs */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxLogs"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/sandboxes/{sandboxID}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get sandbox logs (v2) */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - cursor?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - direction?: components["schemas"]["LogsDirection"]; - }; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox logs */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxLogsV2Response"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get a sandbox by id */ - get: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxDetail"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - /** @description Kill a sandbox */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The sandbox was killed successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/metrics": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get sandbox metrics */ - get: { - parameters: { - query?: { - /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ - start?: number; - end?: number; - }; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the sandbox metrics */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SandboxMetric"][]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/pause": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Pause the sandbox */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The sandbox was paused successfully and can be resumed */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 409: components["responses"]["409"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/resume": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * @deprecated - * @description Resume the sandbox - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ResumedSandbox"]; - }; - }; - responses: { - /** @description The sandbox was resumed successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 409: components["responses"]["409"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/connect": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ConnectSandbox"]; - }; - }; - responses: { - /** @description The sandbox was already running */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - /** @description The sandbox was resumed successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Sandbox"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/timeout": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** - * Format: int32 - * @description Timeout in seconds from the current time after which the sandbox should expire - */ - timeout: number; - }; - }; - }; - responses: { - /** @description Successfully set the sandbox timeout */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/sandboxes/{sandboxID}/refreshes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Refresh the sandbox extending its time to live */ - post: { - parameters: { - query?: never; - header?: never; - path: { - sandboxID: components["parameters"]["sandboxID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** @description Duration for which the sandbox should be kept alive in seconds */ - duration?: number; - }; - }; - }; - responses: { - /** @description Successfully refreshed the sandbox */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v3/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Create a new template */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequestV3"]; - }; - }; - responses: { - /** @description The build was requested successfully */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateRequestResponseV3"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * @deprecated - * @description Create a new template - */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequestV2"]; - }; - }; - responses: { - /** @description The build was requested successfully */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateLegacy"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/files/{hash}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get an upload link for a tar file containing build layer files */ - get: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - hash: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The upload link where to upload the tar file */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateBuildFileUpload"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all templates */ - get: { - parameters: { - query?: { - teamID?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all templates */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Template"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** - * @deprecated - * @description Create a new template - */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequest"]; - }; - }; - responses: { - /** @description The build was accepted */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateLegacy"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all builds for a template */ - get: { - parameters: { - query?: { - /** @description Cursor to start the list from */ - nextToken?: components["parameters"]["paginationNextToken"]; - /** @description Maximum number of items to return per page */ - limit?: components["parameters"]["paginationLimit"]; - }; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template with its builds */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateWithBuilds"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** - * @deprecated - * @description Rebuild an template - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildRequest"]; - }; - }; - responses: { - /** @description The build was accepted */ - 202: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateLegacy"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - /** @description Delete a template */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The template was deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - /** - * @deprecated - * @description Update template - */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateUpdateRequest"]; - }; - }; - responses: { - /** @description The template was updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; - "/templates/{templateID}/builds/{buildID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * @deprecated - * @description Start the build - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The build has started */ - 202: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/templates/{templateID}/builds/{buildID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Start the build */ - post: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateBuildStartV2"]; - }; - }; - responses: { - /** @description The build has started */ - 202: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v2/templates/{templateID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** @description Update template */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TemplateUpdateRequest"]; - }; - }; - responses: { - /** @description The template was updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateUpdateResponse"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; - "/templates/{templateID}/builds/{buildID}/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get template build info */ - get: { - parameters: { - query?: { - /** @description Index of the starting build log that should be returned with the template */ - logsOffset?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - level?: components["schemas"]["LogLevel"]; - }; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateBuildInfo"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/{templateID}/builds/{buildID}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get template build logs */ - get: { - parameters: { - query?: { - /** @description Starting timestamp of the logs that should be returned in milliseconds */ - cursor?: number; - /** @description Maximum number of logs that should be returned */ - limit?: number; - direction?: components["schemas"]["LogsDirection"]; - level?: components["schemas"]["LogLevel"]; - /** @description Source of the logs that should be returned from */ - source?: components["schemas"]["LogsSource"]; - }; - header?: never; - path: { - templateID: components["parameters"]["templateID"]; - buildID: components["parameters"]["buildID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the template build logs */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateBuildLogsResponse"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/tags": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Assign tag(s) to a template build */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AssignTemplateTagsRequest"]; - }; - }; - responses: { - /** @description Tag assigned successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AssignedTemplateTags"]; - }; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - /** @description Delete multiple tags from templates */ - delete: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["DeleteTemplateTagsRequest"]; - }; - }; - responses: { - /** @description Tags deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 400: components["responses"]["400"]; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/templates/aliases/{alias}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Check if template with given alias exists */ - get: { - parameters: { - query?: never; - header?: never; - path: { - alias: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully queried template by alias */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TemplateAliasResponse"]; - }; - }; - 400: components["responses"]["400"]; - 403: components["responses"]["403"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/nodes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all nodes */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all nodes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Node"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/nodes/{nodeID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Get node info */ - get: { - parameters: { - query?: { - /** @description Identifier of the cluster */ - clusterID?: string; - }; - header?: never; - path: { - nodeID: components["parameters"]["nodeID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned the node */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["NodeDetail"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Change status of a node */ - post: { - parameters: { - query?: never; - header?: never; - path: { - nodeID: components["parameters"]["nodeID"]; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": components["schemas"]["NodeStatusChange"]; - }; - }; - responses: { - /** @description The node status was changed successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/admin/teams/{teamID}/sandboxes/kill": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Kill all sandboxes for a team - * @description Kills all sandboxes for the specified team - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Team ID */ - teamID: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully killed sandboxes */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["AdminSandboxKillResult"]; - }; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/access-tokens": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** @description Create a new access token */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewAccessToken"]; - }; - }; - responses: { - /** @description Access token created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["CreatedAccessToken"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/access-tokens/{accessTokenID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** @description Delete an access token */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - accessTokenID: components["parameters"]["accessTokenID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Access token deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api-keys": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description List all team API keys */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully returned all team API keys */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["TeamAPIKey"][]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - put?: never; - /** @description Create a new team API key */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["NewTeamAPIKey"]; - }; - }; - responses: { - /** @description Team API key created successfully */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["CreatedTeamAPIKey"]; - }; - }; - 401: components["responses"]["401"]; - 500: components["responses"]["500"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api-keys/{apiKeyID}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** @description Delete a team API key */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - apiKeyID: components["parameters"]["apiKeyID"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Team API key deleted successfully */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - options?: never; - head?: never; - /** @description Update a team API key */ - patch: { - parameters: { - query?: never; - header?: never; - path: { - apiKeyID: components["parameters"]["apiKeyID"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateTeamAPIKey"]; - }; - }; - responses: { - /** @description Team API key updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - 401: components["responses"]["401"]; - 404: components["responses"]["404"]; - 500: components["responses"]["500"]; - }; - }; - trace?: never; - }; -} -export type webhooks = Record; -export interface components { - schemas: { - Team: { - /** @description Identifier of the team */ - teamID: string; - /** @description Name of the team */ - name: string; - /** @description API key for the team */ - apiKey: string; - /** @description Whether the team is the default team */ - isDefault: boolean; - }; - TeamUser: { - /** - * Format: uuid - * @description Identifier of the user - */ - id: string; - /** @description Email of the user */ - email: string; - }; - TemplateUpdateRequest: { - /** @description Whether the template is public or only accessible by the team */ - public?: boolean; - }; - TemplateUpdateResponse: { - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[]; - }; - /** - * Format: int32 - * @description CPU cores for the sandbox - */ - CPUCount: number; - /** - * Format: int32 - * @description Memory for the sandbox in MiB - */ - MemoryMB: number; - /** - * Format: int32 - * @description Disk size for the sandbox in MiB - */ - DiskSizeMB: number; - /** @description Version of the envd running in the sandbox */ - EnvdVersion: string; - SandboxMetadata: { - [key: string]: string; - }; - /** - * @description State of the sandbox - * @enum {string} - */ - SandboxState: "running" | "paused"; - EnvVars: { - [key: string]: string; - }; - /** @description MCP configuration for the sandbox */ - Mcp: { - [key: string]: unknown; - } | null; - SandboxNetworkConfig: { - /** - * @description Specify if the sandbox URLs should be accessible only with authentication. - * @default true - */ - allowPublicTraffic: boolean; - /** @description List of allowed CIDR blocks or IP addresses for egress traffic. Allowed addresses always take precedence over blocked addresses. */ - allowOut?: string[]; - /** @description List of denied CIDR blocks or IP addresses for egress traffic */ - denyOut?: string[]; - /** @description Specify host mask which will be used for all sandbox requests */ - maskRequestHost?: string; - }; - /** @description Log entry with timestamp and line */ - SandboxLog: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string; - /** @description Log line content */ - line: string; - }; - SandboxLogEntry: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string; - /** @description Log message content */ - message: string; - level: components["schemas"]["LogLevel"]; - fields: { - [key: string]: string; - }; - }; - SandboxLogs: { - /** @description Logs of the sandbox */ - logs: components["schemas"]["SandboxLog"][]; - /** @description Structured logs of the sandbox */ - logEntries: components["schemas"]["SandboxLogEntry"][]; - }; - SandboxLogsV2Response: { - /** - * @description Sandbox logs structured - * @default [] - */ - logs: components["schemas"]["SandboxLogEntry"][]; - }; - /** @description Metric entry with timestamp and line */ - SandboxMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string; - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number; - /** - * Format: int32 - * @description Number of CPU cores - */ - cpuCount: number; - /** - * Format: float - * @description CPU usage percentage - */ - cpuUsedPct: number; - /** - * Format: int64 - * @description Memory used in bytes - */ - memUsed: number; - /** - * Format: int64 - * @description Total memory in bytes - */ - memTotal: number; - /** - * Format: int64 - * @description Disk used in bytes - */ - diskUsed: number; - /** - * Format: int64 - * @description Total disk space in bytes - */ - diskTotal: number; - }; - Sandbox: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** @description Alias of the template */ - alias?: string; - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string; - envdVersion: components["schemas"]["EnvdVersion"]; - /** @description Access token used for envd communication */ - envdAccessToken?: string; - /** @description Token required for accessing sandbox via proxy. */ - trafficAccessToken?: string | null; - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null; - }; - SandboxDetail: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Alias of the template */ - alias?: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string; - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string; - /** - * Format: date-time - * @description Time when the sandbox will expire - */ - endAt: string; - envdVersion: components["schemas"]["EnvdVersion"]; - /** @description Access token used for envd communication */ - envdAccessToken?: string; - /** @description Base domain where the sandbox traffic is accessible */ - domain?: string | null; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - metadata?: components["schemas"]["SandboxMetadata"]; - state: components["schemas"]["SandboxState"]; - }; - ListedSandbox: { - /** @description Identifier of the template from which is the sandbox created */ - templateID: string; - /** @description Alias of the template */ - alias?: string; - /** @description Identifier of the sandbox */ - sandboxID: string; - /** - * @deprecated - * @description Identifier of the client - */ - clientID: string; - /** - * Format: date-time - * @description Time when the sandbox was started - */ - startedAt: string; - /** - * Format: date-time - * @description Time when the sandbox will expire - */ - endAt: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - metadata?: components["schemas"]["SandboxMetadata"]; - state: components["schemas"]["SandboxState"]; - envdVersion: components["schemas"]["EnvdVersion"]; - }; - SandboxesWithMetrics: { - sandboxes: { - [key: string]: components["schemas"]["SandboxMetric"]; - }; - }; - NewSandbox: { - /** @description Identifier of the required template */ - templateID: string; - /** - * Format: int32 - * @description Time to live for the sandbox in seconds. - * @default 15 - */ - timeout: number; - /** - * @description Automatically pauses the sandbox after the timeout - * @default false - */ - autoPause: boolean; - /** @description Secure all system communication with sandbox */ - secure?: boolean; - /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ - allow_internet_access?: boolean; - network?: components["schemas"]["SandboxNetworkConfig"]; - metadata?: components["schemas"]["SandboxMetadata"]; - envVars?: components["schemas"]["EnvVars"]; - mcp?: components["schemas"]["Mcp"]; - }; - ResumedSandbox: { - /** - * Format: int32 - * @description Time to live for the sandbox in seconds. - * @default 15 - */ - timeout: number; - /** - * @deprecated - * @description Automatically pauses the sandbox after the timeout - */ - autoPause?: boolean; - }; - ConnectSandbox: { + '/health': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Health check */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Request was successful */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all teams */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all teams */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Team'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams/{teamID}/metrics': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get metrics for the team */ + get: { + parameters: { + query?: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number + end?: number + } + header?: never + path: { + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the team metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamMetric'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/teams/{teamID}/metrics/max': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get the maximum metrics for the team in the given interval */ + get: { + parameters: { + query: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number + end?: number + /** @description Metric to retrieve the maximum value for */ + metric: 'concurrent_sandboxes' | 'sandbox_start_rate' + } + header?: never + path: { + teamID: components['parameters']['teamID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the team metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['MaxTeamMetric'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 403: components['responses']['403'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all running sandboxes */ + get: { + parameters: { + query?: { + /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ + metadata?: string + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all running sandboxes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ListedSandbox'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Create a sandbox from the template */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewSandbox'] + } + } + responses: { + /** @description The sandbox was created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/sandboxes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all sandboxes */ + get: { + parameters: { + query?: { + /** @description Metadata query used to filter the sandboxes (e.g. "user=abc&app=prod"). Each key and values must be URL encoded. */ + metadata?: string + /** @description Filter sandboxes by one or more states */ + state?: components['schemas']['SandboxState'][] + /** @description Cursor to start the list from */ + nextToken?: components['parameters']['paginationNextToken'] + /** @description Maximum number of items to return per page */ + limit?: components['parameters']['paginationLimit'] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all running sandboxes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ListedSandbox'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/metrics': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List metrics for given sandboxes */ + get: { + parameters: { + query: { + /** @description Comma-separated list of sandbox IDs to get metrics for */ + sandbox_ids: string[] + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all running sandboxes with metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxesWithMetrics'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/logs': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get sandbox logs */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + start?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + } + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox logs */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxLogs'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/sandboxes/{sandboxID}/logs': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get sandbox logs (v2) */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + cursor?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + direction?: components['schemas']['LogsDirection'] + } + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox logs */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxLogsV2Response'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get a sandbox by id */ + get: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxDetail'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + /** @description Kill a sandbox */ + delete: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The sandbox was killed successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/metrics': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get sandbox metrics */ + get: { + parameters: { + query?: { + /** @description Unix timestamp for the start of the interval, in seconds, for which the metrics */ + start?: number + end?: number + } + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the sandbox metrics */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SandboxMetric'][] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/pause': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Pause the sandbox */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The sandbox was paused successfully and can be resumed */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 409: components['responses']['409'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/resume': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * @deprecated + * @description Resume the sandbox + */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['ResumedSandbox'] + } + } + responses: { + /** @description The sandbox was resumed successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 409: components['responses']['409'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/connect': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Returns sandbox details. If the sandbox is paused, it will be resumed. TTL is only extended. */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['ConnectSandbox'] + } + } + responses: { + /** @description The sandbox was already running */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + /** @description The sandbox was resumed successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Sandbox'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/timeout': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Set the timeout for the sandbox. The sandbox will expire x seconds from the time of the request. Calling this method multiple times overwrites the TTL, each time using the current timestamp as the starting point to measure the timeout duration. */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': { /** * Format: int32 * @description Timeout in seconds from the current time after which the sandbox should expire */ - timeout: number; - }; - /** @description Team metric with timestamp */ - TeamMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string; - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number; - /** - * Format: int32 - * @description The number of concurrent sandboxes for the team - */ - concurrentSandboxes: number; - /** - * Format: float - * @description Number of sandboxes started per second - */ - sandboxStartRate: number; - }; - /** @description Team metric with timestamp */ - MaxTeamMetric: { - /** - * Format: date-time - * @deprecated - * @description Timestamp of the metric entry - */ - timestamp: string; - /** - * Format: int64 - * @description Timestamp of the metric entry in Unix time (seconds since epoch) - */ - timestampUnix: number; - /** @description The maximum value of the requested metric in the given interval */ - value: number; - }; - AdminSandboxKillResult: { - /** @description Number of sandboxes successfully killed */ - killedCount: number; - /** @description Number of sandboxes that failed to kill */ - failedCount: number; - }; - Template: { - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the last successful build for given template */ - buildID: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[]; - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[]; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string; - createdBy: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number; - /** - * Format: int32 - * @description Number of times the template was built - */ - buildCount: number; - envdVersion: components["schemas"]["EnvdVersion"]; - buildStatus: components["schemas"]["TemplateBuildStatus"]; - }; - TemplateRequestResponseV3: { - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the last successful build for given template */ - buildID: string; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** @description Names of the template */ - names: string[]; - /** @description Tags assigned to the template build */ - tags: string[]; - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[]; - }; - TemplateLegacy: { - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the last successful build for given template */ - buildID: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB: components["schemas"]["DiskSizeMB"]; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** @description Aliases of the template */ - aliases: string[]; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string; - createdBy: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number; - /** - * Format: int32 - * @description Number of times the template was built - */ - buildCount: number; - envdVersion: components["schemas"]["EnvdVersion"]; - }; - TemplateBuild: { - /** - * Format: uuid - * @description Identifier of the build - */ - buildID: string; - status: components["schemas"]["TemplateBuildStatus"]; - /** - * Format: date-time - * @description Time when the build was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the build was last updated - */ - updatedAt: string; - /** - * Format: date-time - * @description Time when the build was finished - */ - finishedAt?: string; - cpuCount: components["schemas"]["CPUCount"]; - memoryMB: components["schemas"]["MemoryMB"]; - diskSizeMB?: components["schemas"]["DiskSizeMB"]; - envdVersion?: components["schemas"]["EnvdVersion"]; - }; - TemplateWithBuilds: { - /** @description Identifier of the template */ - templateID: string; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - /** - * @deprecated - * @description Aliases of the template - */ - aliases: string[]; - /** @description Names of the template (namespace/alias format when namespaced) */ - names: string[]; - /** - * Format: date-time - * @description Time when the template was created - */ - createdAt: string; - /** - * Format: date-time - * @description Time when the template was last updated - */ - updatedAt: string; - /** - * Format: date-time - * @description Time when the template was last used - */ - lastSpawnedAt: string | null; - /** - * Format: int64 - * @description Number of times the template was used - */ - spawnCount: number; - /** @description List of builds for the template */ - builds: components["schemas"]["TemplateBuild"][]; - }; - TemplateAliasResponse: { - /** @description Identifier of the template */ - templateID: string; - /** @description Whether the template is public or only accessible by the team */ - public: boolean; - }; - TemplateBuildRequest: { - /** @description Alias of the template */ - alias?: string; - /** @description Dockerfile for the template */ - dockerfile: string; - /** @description Identifier of the team */ - teamID?: string; - /** @description Start command to execute in the template after the build */ - startCmd?: string; - /** @description Ready check command to execute in the template after the build */ - readyCmd?: string; - cpuCount?: components["schemas"]["CPUCount"]; - memoryMB?: components["schemas"]["MemoryMB"]; - }; - /** @description Step in the template build process */ - TemplateStep: { - /** @description Type of the step */ - type: string; - /** - * @description Arguments for the step - * @default [] - */ - args: string[]; - /** @description Hash of the files used in the step */ - filesHash?: string; - /** - * @description Whether the step should be forced to run regardless of the cache - * @default false - */ - force: boolean; - }; - TemplateBuildRequestV3: { - /** @description Name of the template. Can include a tag with colon separator (e.g. "my-template" or "my-template:v1"). If tag is included, it will be treated as if the tag was provided in the tags array. */ - name?: string; - /** @description Tags to assign to the template build */ - tags?: string[]; - /** - * @deprecated - * @description Alias of the template. Deprecated, use name instead. - */ - alias?: string; - /** - * @deprecated - * @description Identifier of the team - */ - teamID?: string; - cpuCount?: components["schemas"]["CPUCount"]; - memoryMB?: components["schemas"]["MemoryMB"]; - }; - TemplateBuildRequestV2: { - /** @description Alias of the template */ - alias: string; - /** - * @deprecated - * @description Identifier of the team - */ - teamID?: string; - cpuCount?: components["schemas"]["CPUCount"]; - memoryMB?: components["schemas"]["MemoryMB"]; - }; - FromImageRegistry: components["schemas"]["AWSRegistry"] | components["schemas"]["GCPRegistry"] | components["schemas"]["GeneralRegistry"]; - AWSRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "aws"; - /** @description AWS Access Key ID for ECR authentication */ - awsAccessKeyId: string; - /** @description AWS Secret Access Key for ECR authentication */ - awsSecretAccessKey: string; - /** @description AWS Region where the ECR registry is located */ - awsRegion: string; - }; - GCPRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "gcp"; - /** @description Service Account JSON for GCP authentication */ - serviceAccountJson: string; - }; - GeneralRegistry: { - /** - * @description Type of registry authentication (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "registry"; - /** @description Username to use for the registry */ - username: string; - /** @description Password to use for the registry */ - password: string; - }; - TemplateBuildStartV2: { - /** @description Image to use as a base for the template build */ - fromImage?: string; - /** @description Template to use as a base for the template build */ - fromTemplate?: string; - fromImageRegistry?: components["schemas"]["FromImageRegistry"]; - /** - * @description Whether the whole build should be forced to run regardless of the cache - * @default false - */ - force: boolean; - /** - * @description List of steps to execute in the template build - * @default [] - */ - steps: components["schemas"]["TemplateStep"][]; - /** @description Start command to execute in the template after the build */ - startCmd?: string; - /** @description Ready check command to execute in the template after the build */ - readyCmd?: string; - }; - TemplateBuildFileUpload: { - /** @description Whether the file is already present in the cache */ - present: boolean; - /** @description Url where the file should be uploaded to */ - url?: string; - }; - /** - * @description State of the sandbox - * @enum {string} - */ - LogLevel: "debug" | "info" | "warn" | "error"; - BuildLogEntry: { - /** - * Format: date-time - * @description Timestamp of the log entry - */ - timestamp: string; - /** @description Log message content */ - message: string; - level: components["schemas"]["LogLevel"]; - /** @description Step in the build process related to the log entry */ - step?: string; - }; - BuildStatusReason: { - /** @description Message with the status reason, currently reporting only for error status */ - message: string; - /** @description Step that failed */ - step?: string; - /** - * @description Log entries related to the status reason - * @default [] - */ - logEntries: components["schemas"]["BuildLogEntry"][]; - }; - /** - * @description Status of the template build - * @enum {string} - */ - TemplateBuildStatus: "building" | "waiting" | "ready" | "error"; - TemplateBuildInfo: { - /** - * @description Build logs - * @default [] - */ - logs: string[]; - /** - * @description Build logs structured - * @default [] - */ - logEntries: components["schemas"]["BuildLogEntry"][]; - /** @description Identifier of the template */ - templateID: string; - /** @description Identifier of the build */ - buildID: string; - status: components["schemas"]["TemplateBuildStatus"]; - reason?: components["schemas"]["BuildStatusReason"]; - }; - TemplateBuildLogsResponse: { - /** - * @description Build logs structured - * @default [] - */ - logs: components["schemas"]["BuildLogEntry"][]; - }; - /** - * @description Direction of the logs that should be returned - * @enum {string} - */ - LogsDirection: "forward" | "backward"; - /** - * @description Source of the logs that should be returned - * @enum {string} - */ - LogsSource: "temporary" | "persistent"; - /** - * @description Status of the node - * @enum {string} - */ - NodeStatus: "ready" | "draining" | "connecting" | "unhealthy"; - NodeStatusChange: { - /** - * Format: uuid - * @description Identifier of the cluster - */ - clusterID?: string; - status: components["schemas"]["NodeStatus"]; - }; - DiskMetrics: { - /** @description Mount point of the disk */ - mountPoint: string; - /** @description Device name */ - device: string; - /** @description Filesystem type (e.g., ext4, xfs) */ - filesystemType: string; - /** - * Format: uint64 - * @description Used space in bytes - */ - usedBytes: number; - /** - * Format: uint64 - * @description Total space in bytes - */ - totalBytes: number; - }; - /** @description Node metrics */ - NodeMetrics: { - /** - * Format: uint32 - * @description Number of allocated CPU cores - */ - allocatedCPU: number; - /** - * Format: uint32 - * @description Node CPU usage percentage - */ - cpuPercent: number; - /** - * Format: uint32 - * @description Total number of CPU cores on the node - */ - cpuCount: number; - /** - * Format: uint64 - * @description Amount of allocated memory in bytes - */ - allocatedMemoryBytes: number; - /** - * Format: uint64 - * @description Node memory used in bytes - */ - memoryUsedBytes: number; - /** - * Format: uint64 - * @description Total node memory in bytes - */ - memoryTotalBytes: number; - /** @description Detailed metrics for each disk/mount point */ - disks: components["schemas"]["DiskMetrics"][]; - }; - MachineInfo: { - /** @description CPU family of the node */ - cpuFamily: string; - /** @description CPU model of the node */ - cpuModel: string; - /** @description CPU model name of the node */ - cpuModelName: string; - /** @description CPU architecture of the node */ - cpuArchitecture: string; - }; - Node: { - /** @description Version of the orchestrator */ - version: string; - /** @description Commit of the orchestrator */ - commit: string; - /** - * @deprecated - * @description Identifier of the nomad node - */ - nodeID: string; - /** @description Identifier of the node */ - id: string; - /** @description Service instance identifier of the node */ - serviceInstanceID: string; - /** @description Identifier of the cluster */ - clusterID: string; - machineInfo: components["schemas"]["MachineInfo"]; - status: components["schemas"]["NodeStatus"]; - /** - * Format: uint32 - * @description Number of sandboxes running on the node - */ - sandboxCount: number; - metrics: components["schemas"]["NodeMetrics"]; - /** - * Format: uint64 - * @description Number of sandbox create successes - */ - createSuccesses: number; - /** - * Format: uint64 - * @description Number of sandbox create fails - */ - createFails: number; - /** - * Format: int - * @description Number of starting Sandboxes - */ - sandboxStartingCount: number; - }; - NodeDetail: { - /** @description Identifier of the cluster */ - clusterID: string; - /** @description Version of the orchestrator */ - version: string; - /** @description Commit of the orchestrator */ - commit: string; - /** @description Identifier of the node */ - id: string; - /** @description Service instance identifier of the node */ - serviceInstanceID: string; - /** - * @deprecated - * @description Identifier of the nomad node - */ - nodeID: string; - machineInfo: components["schemas"]["MachineInfo"]; - status: components["schemas"]["NodeStatus"]; - /** @description List of sandboxes running on the node */ - sandboxes: components["schemas"]["ListedSandbox"][]; - metrics: components["schemas"]["NodeMetrics"]; - /** @description List of cached builds id on the node */ - cachedBuilds: string[]; - /** - * Format: uint64 - * @description Number of sandbox create successes - */ - createSuccesses: number; - /** - * Format: uint64 - * @description Number of sandbox create fails - */ - createFails: number; - }; - CreatedAccessToken: { - /** - * Format: uuid - * @description Identifier of the access token - */ - id: string; - /** @description Name of the access token */ - name: string; - /** @description The fully created access token */ - token: string; - mask: components["schemas"]["IdentifierMaskingDetails"]; - /** - * Format: date-time - * @description Timestamp of access token creation - */ - createdAt: string; - }; - NewAccessToken: { - /** @description Name of the access token */ - name: string; - }; - TeamAPIKey: { - /** - * Format: uuid - * @description Identifier of the API key - */ - id: string; - /** @description Name of the API key */ - name: string; - mask: components["schemas"]["IdentifierMaskingDetails"]; - /** - * Format: date-time - * @description Timestamp of API key creation - */ - createdAt: string; - createdBy?: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Last time this API key was used - */ - lastUsed?: string | null; - }; - CreatedTeamAPIKey: { - /** - * Format: uuid - * @description Identifier of the API key - */ - id: string; - /** @description Raw value of the API key */ - key: string; - mask: components["schemas"]["IdentifierMaskingDetails"]; - /** @description Name of the API key */ - name: string; - /** - * Format: date-time - * @description Timestamp of API key creation - */ - createdAt: string; - createdBy?: components["schemas"]["TeamUser"] | null; - /** - * Format: date-time - * @description Last time this API key was used - */ - lastUsed?: string | null; - }; - NewTeamAPIKey: { - /** @description Name of the API key */ - name: string; - }; - UpdateTeamAPIKey: { - /** @description New name for the API key */ - name: string; - }; - AssignedTemplateTags: { - /** @description Assigned tags of the template */ - tags: string[]; - /** - * Format: uuid - * @description Identifier of the build associated with these tags - */ - buildID: string; - }; - AssignTemplateTagsRequest: { - /** @description Target template in "name:tag" format */ - target: string; - /** @description Tags to assign to the template */ - tags: string[]; - }; - DeleteTemplateTagsRequest: { - /** @description Name of the template */ - name: string; - /** @description Tags to delete */ - tags: string[]; - }; - Error: { - /** - * Format: int32 - * @description Error code - */ - code: number; - /** @description Error */ - message: string; - }; - IdentifierMaskingDetails: { - /** @description Prefix that identifies the token or key type */ - prefix: string; - /** @description Length of the token or key */ - valueLength: number; - /** @description Prefix used in masked version of the token or key */ - maskedValuePrefix: string; - /** @description Suffix used in masked version of the token or key */ - maskedValueSuffix: string; - }; - }; - responses: { - /** @description Bad request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Authentication error */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Forbidden */ - 403: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Conflict */ - 409: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - /** @description Server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Error"]; - }; - }; - }; + timeout: number + } + } + } + responses: { + /** @description Successfully set the sandbox timeout */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/sandboxes/{sandboxID}/refreshes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Refresh the sandbox extending its time to live */ + post: { + parameters: { + query?: never + header?: never + path: { + sandboxID: components['parameters']['sandboxID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': { + /** @description Duration for which the sandbox should be kept alive in seconds */ + duration?: number + } + } + } + responses: { + /** @description Successfully refreshed the sandbox */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v3/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Create a new template */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequestV3'] + } + } + responses: { + /** @description The build was requested successfully */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateRequestResponseV3'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * @deprecated + * @description Create a new template + */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequestV2'] + } + } + responses: { + /** @description The build was requested successfully */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateLegacy'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/files/{hash}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get an upload link for a tar file containing build layer files */ + get: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + hash: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The upload link where to upload the tar file */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateBuildFileUpload'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all templates */ + get: { + parameters: { + query?: { + teamID?: string + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all templates */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Template'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** + * @deprecated + * @description Create a new template + */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequest'] + } + } + responses: { + /** @description The build was accepted */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateLegacy'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all builds for a template */ + get: { + parameters: { + query?: { + /** @description Cursor to start the list from */ + nextToken?: components['parameters']['paginationNextToken'] + /** @description Maximum number of items to return per page */ + limit?: components['parameters']['paginationLimit'] + } + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template with its builds */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateWithBuilds'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** + * @deprecated + * @description Rebuild an template + */ + post: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildRequest'] + } + } + responses: { + /** @description The build was accepted */ + 202: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateLegacy'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + /** @description Delete a template */ + delete: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The template was deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + /** + * @deprecated + * @description Update template + */ + patch: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateUpdateRequest'] + } + } + responses: { + /** @description The template was updated successfully */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + trace?: never + } + '/templates/{templateID}/builds/{buildID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * @deprecated + * @description Start the build + */ + post: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description The build has started */ + 202: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/templates/{templateID}/builds/{buildID}': { parameters: { - templateID: string; - buildID: string; - sandboxID: string; - teamID: string; - nodeID: string; - apiKeyID: string; - accessTokenID: string; - tag: string; - /** @description Maximum number of items to return per page */ - paginationLimit: number; - /** @description Cursor to start the list from */ - paginationNextToken: string; - }; - requestBodies: never; - headers: never; - pathItems: never; + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Start the build */ + post: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateBuildStartV2'] + } + } + responses: { + /** @description The build has started */ + 202: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v2/templates/{templateID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + delete?: never + options?: never + head?: never + /** @description Update template */ + patch: { + parameters: { + query?: never + header?: never + path: { + templateID: components['parameters']['templateID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['TemplateUpdateRequest'] + } + } + responses: { + /** @description The template was updated successfully */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateUpdateResponse'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + trace?: never + } + '/templates/{templateID}/builds/{buildID}/status': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get template build info */ + get: { + parameters: { + query?: { + /** @description Index of the starting build log that should be returned with the template */ + logsOffset?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + level?: components['schemas']['LogLevel'] + } + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateBuildInfo'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/{templateID}/builds/{buildID}/logs': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get template build logs */ + get: { + parameters: { + query?: { + /** @description Starting timestamp of the logs that should be returned in milliseconds */ + cursor?: number + /** @description Maximum number of logs that should be returned */ + limit?: number + direction?: components['schemas']['LogsDirection'] + level?: components['schemas']['LogLevel'] + /** @description Source of the logs that should be returned from */ + source?: components['schemas']['LogsSource'] + } + header?: never + path: { + templateID: components['parameters']['templateID'] + buildID: components['parameters']['buildID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the template build logs */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateBuildLogsResponse'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/tags': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Assign tag(s) to a template build */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['AssignTemplateTagsRequest'] + } + } + responses: { + /** @description Tag assigned successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AssignedTemplateTags'] + } + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + /** @description Delete multiple tags from templates */ + delete: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['DeleteTemplateTagsRequest'] + } + } + responses: { + /** @description Tags deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 400: components['responses']['400'] + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/templates/aliases/{alias}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Check if template with given alias exists */ + get: { + parameters: { + query?: never + header?: never + path: { + alias: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully queried template by alias */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TemplateAliasResponse'] + } + } + 400: components['responses']['400'] + 403: components['responses']['403'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/nodes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all nodes */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all nodes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Node'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/nodes/{nodeID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description Get node info */ + get: { + parameters: { + query?: { + /** @description Identifier of the cluster */ + clusterID?: string + } + header?: never + path: { + nodeID: components['parameters']['nodeID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned the node */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['NodeDetail'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Change status of a node */ + post: { + parameters: { + query?: never + header?: never + path: { + nodeID: components['parameters']['nodeID'] + } + cookie?: never + } + requestBody?: { + content: { + 'application/json': components['schemas']['NodeStatusChange'] + } + } + responses: { + /** @description The node status was changed successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/admin/teams/{teamID}/sandboxes/kill': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** + * Kill all sandboxes for a team + * @description Kills all sandboxes for the specified team + */ + post: { + parameters: { + query?: never + header?: never + path: { + /** @description Team ID */ + teamID: string + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully killed sandboxes */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['AdminSandboxKillResult'] + } + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/access-tokens': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + /** @description Create a new access token */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewAccessToken'] + } + } + responses: { + /** @description Access token created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['CreatedAccessToken'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/access-tokens/{accessTokenID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + /** @description Delete an access token */ + delete: { + parameters: { + query?: never + header?: never + path: { + accessTokenID: components['parameters']['accessTokenID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Access token deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + patch?: never + trace?: never + } + '/api-keys': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** @description List all team API keys */ + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Successfully returned all team API keys */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['TeamAPIKey'][] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + put?: never + /** @description Create a new team API key */ + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['NewTeamAPIKey'] + } + } + responses: { + /** @description Team API key created successfully */ + 201: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['CreatedTeamAPIKey'] + } + } + 401: components['responses']['401'] + 500: components['responses']['500'] + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/api-keys/{apiKeyID}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + /** @description Delete a team API key */ + delete: { + parameters: { + query?: never + header?: never + path: { + apiKeyID: components['parameters']['apiKeyID'] + } + cookie?: never + } + requestBody?: never + responses: { + /** @description Team API key deleted successfully */ + 204: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + options?: never + head?: never + /** @description Update a team API key */ + patch: { + parameters: { + query?: never + header?: never + path: { + apiKeyID: components['parameters']['apiKeyID'] + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['UpdateTeamAPIKey'] + } + } + responses: { + /** @description Team API key updated successfully */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + 401: components['responses']['401'] + 404: components['responses']['404'] + 500: components['responses']['500'] + } + } + trace?: never + } +} +export type webhooks = Record +export interface components { + schemas: { + Team: { + /** @description Identifier of the team */ + teamID: string + /** @description Name of the team */ + name: string + /** @description API key for the team */ + apiKey: string + /** @description Whether the team is the default team */ + isDefault: boolean + } + TeamUser: { + /** + * Format: uuid + * @description Identifier of the user + */ + id: string + /** @description Email of the user */ + email: string + } + TemplateUpdateRequest: { + /** @description Whether the template is public or only accessible by the team */ + public?: boolean + } + TemplateUpdateResponse: { + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[] + } + /** + * Format: int32 + * @description CPU cores for the sandbox + */ + CPUCount: number + /** + * Format: int32 + * @description Memory for the sandbox in MiB + */ + MemoryMB: number + /** + * Format: int32 + * @description Disk size for the sandbox in MiB + */ + DiskSizeMB: number + /** @description Version of the envd running in the sandbox */ + EnvdVersion: string + SandboxMetadata: { + [key: string]: string + } + /** + * @description State of the sandbox + * @enum {string} + */ + SandboxState: 'running' | 'paused' + EnvVars: { + [key: string]: string + } + /** @description MCP configuration for the sandbox */ + Mcp: { + [key: string]: unknown + } | null + SandboxNetworkConfig: { + /** + * @description Specify if the sandbox URLs should be accessible only with authentication. + * @default true + */ + allowPublicTraffic: boolean + /** @description List of allowed CIDR blocks or IP addresses for egress traffic. Allowed addresses always take precedence over blocked addresses. */ + allowOut?: string[] + /** @description List of denied CIDR blocks or IP addresses for egress traffic */ + denyOut?: string[] + /** @description Specify host mask which will be used for all sandbox requests */ + maskRequestHost?: string + } + /** @description Log entry with timestamp and line */ + SandboxLog: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string + /** @description Log line content */ + line: string + } + SandboxLogEntry: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string + /** @description Log message content */ + message: string + level: components['schemas']['LogLevel'] + fields: { + [key: string]: string + } + } + SandboxLogs: { + /** @description Logs of the sandbox */ + logs: components['schemas']['SandboxLog'][] + /** @description Structured logs of the sandbox */ + logEntries: components['schemas']['SandboxLogEntry'][] + } + SandboxLogsV2Response: { + /** + * @description Sandbox logs structured + * @default [] + */ + logs: components['schemas']['SandboxLogEntry'][] + } + /** @description Metric entry with timestamp and line */ + SandboxMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number + /** + * Format: int32 + * @description Number of CPU cores + */ + cpuCount: number + /** + * Format: float + * @description CPU usage percentage + */ + cpuUsedPct: number + /** + * Format: int64 + * @description Memory used in bytes + */ + memUsed: number + /** + * Format: int64 + * @description Total memory in bytes + */ + memTotal: number + /** + * Format: int64 + * @description Disk used in bytes + */ + diskUsed: number + /** + * Format: int64 + * @description Total disk space in bytes + */ + diskTotal: number + } + Sandbox: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** @description Alias of the template */ + alias?: string + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string + envdVersion: components['schemas']['EnvdVersion'] + /** @description Access token used for envd communication */ + envdAccessToken?: string + /** @description Token required for accessing sandbox via proxy. */ + trafficAccessToken?: string | null + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null + } + SandboxDetail: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Alias of the template */ + alias?: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string + /** + * Format: date-time + * @description Time when the sandbox will expire + */ + endAt: string + envdVersion: components['schemas']['EnvdVersion'] + /** @description Access token used for envd communication */ + envdAccessToken?: string + /** @description Base domain where the sandbox traffic is accessible */ + domain?: string | null + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + metadata?: components['schemas']['SandboxMetadata'] + state: components['schemas']['SandboxState'] + } + ListedSandbox: { + /** @description Identifier of the template from which is the sandbox created */ + templateID: string + /** @description Alias of the template */ + alias?: string + /** @description Identifier of the sandbox */ + sandboxID: string + /** + * @deprecated + * @description Identifier of the client + */ + clientID: string + /** + * Format: date-time + * @description Time when the sandbox was started + */ + startedAt: string + /** + * Format: date-time + * @description Time when the sandbox will expire + */ + endAt: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + metadata?: components['schemas']['SandboxMetadata'] + state: components['schemas']['SandboxState'] + envdVersion: components['schemas']['EnvdVersion'] + } + SandboxesWithMetrics: { + sandboxes: { + [key: string]: components['schemas']['SandboxMetric'] + } + } + NewSandbox: { + /** @description Identifier of the required template */ + templateID: string + /** + * Format: int32 + * @description Time to live for the sandbox in seconds. + * @default 15 + */ + timeout: number + /** + * @description Automatically pauses the sandbox after the timeout + * @default false + */ + autoPause: boolean + /** @description Secure all system communication with sandbox */ + secure?: boolean + /** @description Allow sandbox to access the internet. When set to false, it behaves the same as specifying denyOut to 0.0.0.0/0 in the network config. */ + allow_internet_access?: boolean + network?: components['schemas']['SandboxNetworkConfig'] + metadata?: components['schemas']['SandboxMetadata'] + envVars?: components['schemas']['EnvVars'] + mcp?: components['schemas']['Mcp'] + } + ResumedSandbox: { + /** + * Format: int32 + * @description Time to live for the sandbox in seconds. + * @default 15 + */ + timeout: number + /** + * @deprecated + * @description Automatically pauses the sandbox after the timeout + */ + autoPause?: boolean + } + ConnectSandbox: { + /** + * Format: int32 + * @description Timeout in seconds from the current time after which the sandbox should expire + */ + timeout: number + } + /** @description Team metric with timestamp */ + TeamMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number + /** + * Format: int32 + * @description The number of concurrent sandboxes for the team + */ + concurrentSandboxes: number + /** + * Format: float + * @description Number of sandboxes started per second + */ + sandboxStartRate: number + } + /** @description Team metric with timestamp */ + MaxTeamMetric: { + /** + * Format: date-time + * @deprecated + * @description Timestamp of the metric entry + */ + timestamp: string + /** + * Format: int64 + * @description Timestamp of the metric entry in Unix time (seconds since epoch) + */ + timestampUnix: number + /** @description The maximum value of the requested metric in the given interval */ + value: number + } + AdminSandboxKillResult: { + /** @description Number of sandboxes successfully killed */ + killedCount: number + /** @description Number of sandboxes that failed to kill */ + failedCount: number + } + Template: { + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the last successful build for given template */ + buildID: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[] + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[] + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string + createdBy: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number + /** + * Format: int32 + * @description Number of times the template was built + */ + buildCount: number + envdVersion: components['schemas']['EnvdVersion'] + buildStatus: components['schemas']['TemplateBuildStatus'] + } + TemplateRequestResponseV3: { + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the last successful build for given template */ + buildID: string + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** @description Names of the template */ + names: string[] + /** @description Tags assigned to the template build */ + tags: string[] + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[] + } + TemplateLegacy: { + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the last successful build for given template */ + buildID: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB: components['schemas']['DiskSizeMB'] + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** @description Aliases of the template */ + aliases: string[] + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string + createdBy: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number + /** + * Format: int32 + * @description Number of times the template was built + */ + buildCount: number + envdVersion: components['schemas']['EnvdVersion'] + } + TemplateBuild: { + /** + * Format: uuid + * @description Identifier of the build + */ + buildID: string + status: components['schemas']['TemplateBuildStatus'] + /** + * Format: date-time + * @description Time when the build was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the build was last updated + */ + updatedAt: string + /** + * Format: date-time + * @description Time when the build was finished + */ + finishedAt?: string + cpuCount: components['schemas']['CPUCount'] + memoryMB: components['schemas']['MemoryMB'] + diskSizeMB?: components['schemas']['DiskSizeMB'] + envdVersion?: components['schemas']['EnvdVersion'] + } + TemplateWithBuilds: { + /** @description Identifier of the template */ + templateID: string + /** @description Whether the template is public or only accessible by the team */ + public: boolean + /** + * @deprecated + * @description Aliases of the template + */ + aliases: string[] + /** @description Names of the template (namespace/alias format when namespaced) */ + names: string[] + /** + * Format: date-time + * @description Time when the template was created + */ + createdAt: string + /** + * Format: date-time + * @description Time when the template was last updated + */ + updatedAt: string + /** + * Format: date-time + * @description Time when the template was last used + */ + lastSpawnedAt: string | null + /** + * Format: int64 + * @description Number of times the template was used + */ + spawnCount: number + /** @description List of builds for the template */ + builds: components['schemas']['TemplateBuild'][] + } + TemplateAliasResponse: { + /** @description Identifier of the template */ + templateID: string + /** @description Whether the template is public or only accessible by the team */ + public: boolean + } + TemplateBuildRequest: { + /** @description Alias of the template */ + alias?: string + /** @description Dockerfile for the template */ + dockerfile: string + /** @description Identifier of the team */ + teamID?: string + /** @description Start command to execute in the template after the build */ + startCmd?: string + /** @description Ready check command to execute in the template after the build */ + readyCmd?: string + cpuCount?: components['schemas']['CPUCount'] + memoryMB?: components['schemas']['MemoryMB'] + } + /** @description Step in the template build process */ + TemplateStep: { + /** @description Type of the step */ + type: string + /** + * @description Arguments for the step + * @default [] + */ + args: string[] + /** @description Hash of the files used in the step */ + filesHash?: string + /** + * @description Whether the step should be forced to run regardless of the cache + * @default false + */ + force: boolean + } + TemplateBuildRequestV3: { + /** @description Name of the template. Can include a tag with colon separator (e.g. "my-template" or "my-template:v1"). If tag is included, it will be treated as if the tag was provided in the tags array. */ + name?: string + /** @description Tags to assign to the template build */ + tags?: string[] + /** + * @deprecated + * @description Alias of the template. Deprecated, use name instead. + */ + alias?: string + /** + * @deprecated + * @description Identifier of the team + */ + teamID?: string + cpuCount?: components['schemas']['CPUCount'] + memoryMB?: components['schemas']['MemoryMB'] + } + TemplateBuildRequestV2: { + /** @description Alias of the template */ + alias: string + /** + * @deprecated + * @description Identifier of the team + */ + teamID?: string + cpuCount?: components['schemas']['CPUCount'] + memoryMB?: components['schemas']['MemoryMB'] + } + FromImageRegistry: + | components['schemas']['AWSRegistry'] + | components['schemas']['GCPRegistry'] + | components['schemas']['GeneralRegistry'] + AWSRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: 'aws' + /** @description AWS Access Key ID for ECR authentication */ + awsAccessKeyId: string + /** @description AWS Secret Access Key for ECR authentication */ + awsSecretAccessKey: string + /** @description AWS Region where the ECR registry is located */ + awsRegion: string + } + GCPRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: 'gcp' + /** @description Service Account JSON for GCP authentication */ + serviceAccountJson: string + } + GeneralRegistry: { + /** + * @description Type of registry authentication (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: 'registry' + /** @description Username to use for the registry */ + username: string + /** @description Password to use for the registry */ + password: string + } + TemplateBuildStartV2: { + /** @description Image to use as a base for the template build */ + fromImage?: string + /** @description Template to use as a base for the template build */ + fromTemplate?: string + fromImageRegistry?: components['schemas']['FromImageRegistry'] + /** + * @description Whether the whole build should be forced to run regardless of the cache + * @default false + */ + force: boolean + /** + * @description List of steps to execute in the template build + * @default [] + */ + steps: components['schemas']['TemplateStep'][] + /** @description Start command to execute in the template after the build */ + startCmd?: string + /** @description Ready check command to execute in the template after the build */ + readyCmd?: string + } + TemplateBuildFileUpload: { + /** @description Whether the file is already present in the cache */ + present: boolean + /** @description Url where the file should be uploaded to */ + url?: string + } + /** + * @description State of the sandbox + * @enum {string} + */ + LogLevel: 'debug' | 'info' | 'warn' | 'error' + BuildLogEntry: { + /** + * Format: date-time + * @description Timestamp of the log entry + */ + timestamp: string + /** @description Log message content */ + message: string + level: components['schemas']['LogLevel'] + /** @description Step in the build process related to the log entry */ + step?: string + } + BuildStatusReason: { + /** @description Message with the status reason, currently reporting only for error status */ + message: string + /** @description Step that failed */ + step?: string + /** + * @description Log entries related to the status reason + * @default [] + */ + logEntries: components['schemas']['BuildLogEntry'][] + } + /** + * @description Status of the template build + * @enum {string} + */ + TemplateBuildStatus: 'building' | 'waiting' | 'ready' | 'error' + TemplateBuildInfo: { + /** + * @description Build logs + * @default [] + */ + logs: string[] + /** + * @description Build logs structured + * @default [] + */ + logEntries: components['schemas']['BuildLogEntry'][] + /** @description Identifier of the template */ + templateID: string + /** @description Identifier of the build */ + buildID: string + status: components['schemas']['TemplateBuildStatus'] + reason?: components['schemas']['BuildStatusReason'] + } + TemplateBuildLogsResponse: { + /** + * @description Build logs structured + * @default [] + */ + logs: components['schemas']['BuildLogEntry'][] + } + /** + * @description Direction of the logs that should be returned + * @enum {string} + */ + LogsDirection: 'forward' | 'backward' + /** + * @description Source of the logs that should be returned + * @enum {string} + */ + LogsSource: 'temporary' | 'persistent' + /** + * @description Status of the node + * @enum {string} + */ + NodeStatus: 'ready' | 'draining' | 'connecting' | 'unhealthy' + NodeStatusChange: { + /** + * Format: uuid + * @description Identifier of the cluster + */ + clusterID?: string + status: components['schemas']['NodeStatus'] + } + DiskMetrics: { + /** @description Mount point of the disk */ + mountPoint: string + /** @description Device name */ + device: string + /** @description Filesystem type (e.g., ext4, xfs) */ + filesystemType: string + /** + * Format: uint64 + * @description Used space in bytes + */ + usedBytes: number + /** + * Format: uint64 + * @description Total space in bytes + */ + totalBytes: number + } + /** @description Node metrics */ + NodeMetrics: { + /** + * Format: uint32 + * @description Number of allocated CPU cores + */ + allocatedCPU: number + /** + * Format: uint32 + * @description Node CPU usage percentage + */ + cpuPercent: number + /** + * Format: uint32 + * @description Total number of CPU cores on the node + */ + cpuCount: number + /** + * Format: uint64 + * @description Amount of allocated memory in bytes + */ + allocatedMemoryBytes: number + /** + * Format: uint64 + * @description Node memory used in bytes + */ + memoryUsedBytes: number + /** + * Format: uint64 + * @description Total node memory in bytes + */ + memoryTotalBytes: number + /** @description Detailed metrics for each disk/mount point */ + disks: components['schemas']['DiskMetrics'][] + } + MachineInfo: { + /** @description CPU family of the node */ + cpuFamily: string + /** @description CPU model of the node */ + cpuModel: string + /** @description CPU model name of the node */ + cpuModelName: string + /** @description CPU architecture of the node */ + cpuArchitecture: string + } + Node: { + /** @description Version of the orchestrator */ + version: string + /** @description Commit of the orchestrator */ + commit: string + /** + * @deprecated + * @description Identifier of the nomad node + */ + nodeID: string + /** @description Identifier of the node */ + id: string + /** @description Service instance identifier of the node */ + serviceInstanceID: string + /** @description Identifier of the cluster */ + clusterID: string + machineInfo: components['schemas']['MachineInfo'] + status: components['schemas']['NodeStatus'] + /** + * Format: uint32 + * @description Number of sandboxes running on the node + */ + sandboxCount: number + metrics: components['schemas']['NodeMetrics'] + /** + * Format: uint64 + * @description Number of sandbox create successes + */ + createSuccesses: number + /** + * Format: uint64 + * @description Number of sandbox create fails + */ + createFails: number + /** + * Format: int + * @description Number of starting Sandboxes + */ + sandboxStartingCount: number + } + NodeDetail: { + /** @description Identifier of the cluster */ + clusterID: string + /** @description Version of the orchestrator */ + version: string + /** @description Commit of the orchestrator */ + commit: string + /** @description Identifier of the node */ + id: string + /** @description Service instance identifier of the node */ + serviceInstanceID: string + /** + * @deprecated + * @description Identifier of the nomad node + */ + nodeID: string + machineInfo: components['schemas']['MachineInfo'] + status: components['schemas']['NodeStatus'] + /** @description List of sandboxes running on the node */ + sandboxes: components['schemas']['ListedSandbox'][] + metrics: components['schemas']['NodeMetrics'] + /** @description List of cached builds id on the node */ + cachedBuilds: string[] + /** + * Format: uint64 + * @description Number of sandbox create successes + */ + createSuccesses: number + /** + * Format: uint64 + * @description Number of sandbox create fails + */ + createFails: number + } + CreatedAccessToken: { + /** + * Format: uuid + * @description Identifier of the access token + */ + id: string + /** @description Name of the access token */ + name: string + /** @description The fully created access token */ + token: string + mask: components['schemas']['IdentifierMaskingDetails'] + /** + * Format: date-time + * @description Timestamp of access token creation + */ + createdAt: string + } + NewAccessToken: { + /** @description Name of the access token */ + name: string + } + TeamAPIKey: { + /** + * Format: uuid + * @description Identifier of the API key + */ + id: string + /** @description Name of the API key */ + name: string + mask: components['schemas']['IdentifierMaskingDetails'] + /** + * Format: date-time + * @description Timestamp of API key creation + */ + createdAt: string + createdBy?: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Last time this API key was used + */ + lastUsed?: string | null + } + CreatedTeamAPIKey: { + /** + * Format: uuid + * @description Identifier of the API key + */ + id: string + /** @description Raw value of the API key */ + key: string + mask: components['schemas']['IdentifierMaskingDetails'] + /** @description Name of the API key */ + name: string + /** + * Format: date-time + * @description Timestamp of API key creation + */ + createdAt: string + createdBy?: components['schemas']['TeamUser'] | null + /** + * Format: date-time + * @description Last time this API key was used + */ + lastUsed?: string | null + } + NewTeamAPIKey: { + /** @description Name of the API key */ + name: string + } + UpdateTeamAPIKey: { + /** @description New name for the API key */ + name: string + } + AssignedTemplateTags: { + /** @description Assigned tags of the template */ + tags: string[] + /** + * Format: uuid + * @description Identifier of the build associated with these tags + */ + buildID: string + } + AssignTemplateTagsRequest: { + /** @description Target template in "name:tag" format */ + target: string + /** @description Tags to assign to the template */ + tags: string[] + } + DeleteTemplateTagsRequest: { + /** @description Name of the template */ + name: string + /** @description Tags to delete */ + tags: string[] + } + Error: { + /** + * Format: int32 + * @description Error code + */ + code: number + /** @description Error */ + message: string + } + IdentifierMaskingDetails: { + /** @description Prefix that identifies the token or key type */ + prefix: string + /** @description Length of the token or key */ + valueLength: number + /** @description Prefix used in masked version of the token or key */ + maskedValuePrefix: string + /** @description Suffix used in masked version of the token or key */ + maskedValueSuffix: string + } + } + responses: { + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Authentication error */ + 401: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + /** @description Server error */ + 500: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['Error'] + } + } + } + parameters: { + templateID: string + buildID: string + sandboxID: string + teamID: string + nodeID: string + apiKeyID: string + accessTokenID: string + tag: string + /** @description Maximum number of items to return per page */ + paginationLimit: number + /** @description Cursor to start the list from */ + paginationNextToken: string + } + requestBodies: never + headers: never + pathItems: never } -export type $defs = Record; -export type operations = Record; +export type $defs = Record +export type operations = Record From aab63b6823dca075fc61976c7b7d0d6001773f39 Mon Sep 17 00:00:00 2001 From: ben-fornefeld Date: Fri, 27 Feb 2026 13:14:22 -0800 Subject: [PATCH 4/7] chore: split workflows --- .github/workflows/format.yml | 27 +++++++++++++++++++++++++++ .github/workflows/lint.yml | 27 +++++++++++++++++++++++++++ .github/workflows/test.yml | 20 -------------------- package.json | 1 + 4 files changed, 55 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/format.yml create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml new file mode 100644 index 000000000..719f0dafc --- /dev/null +++ b/.github/workflows/format.yml @@ -0,0 +1,27 @@ +name: Format Check + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + format: + name: Biome Format + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: 1.2.20 + + - name: Install dependencies + run: bun install + + - name: Run format check + run: bun run format:check diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..93cb5c87b --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,27 @@ +name: Lint Check + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + lint: + name: Biome Lint + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: 1.2.20 + + - name: Install dependencies + run: bun install + + - name: Run lint check + run: bun run lint diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1a2674020..d822b0001 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,29 +7,9 @@ on: branches: [main] jobs: - quality: - name: Code Quality - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Bun - uses: oven-sh/setup-bun@v1 - with: - bun-version: 1.2.20 - - - name: Install dependencies - run: bun install - - - name: Run Biome checks - run: bun run check - unit-tests: name: Unit Tests runs-on: ubuntu-latest - needs: quality # unit tests don't need environment variables - they test pure functions diff --git a/package.json b/package.json index 12e580c1a..dd9d14fdd 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "lint": "biome lint .", "lint:fix": "biome lint --write .", "format": "biome check --write . --max-diagnostics none", + "format:check": "biome check --linter-enabled=false --assist-enabled=false .", "check": "biome check .", "prebuild": "bun scripts:check-app-env", "<<<<<<< Development Tools": "", From 06c80ed9624bd21a6c3051824ba9a8c29ed48ca9 Mon Sep 17 00:00:00 2001 From: Ben Fornefeld <50748440+ben-fornefeld@users.noreply.github.com> Date: Fri, 27 Feb 2026 22:19:02 +0100 Subject: [PATCH 5/7] Potential fix for code scanning alert no. 10: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .github/workflows/format.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 719f0dafc..7a36c545e 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -10,6 +10,8 @@ jobs: format: name: Biome Format runs-on: ubuntu-latest + permissions: + contents: read steps: - name: Checkout code From 26d86e6c620ca4b6c79398125cf03292b0472378 Mon Sep 17 00:00:00 2001 From: Ben Fornefeld <50748440+ben-fornefeld@users.noreply.github.com> Date: Fri, 27 Feb 2026 22:19:12 +0100 Subject: [PATCH 6/7] Potential fix for code scanning alert no. 9: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 93cb5c87b..4e6b36fd2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [main] +permissions: + contents: read + jobs: lint: name: Biome Lint From cacc55ea4db854f37208c76d1423b3b83d544d6e Mon Sep 17 00:00:00 2001 From: ben-fornefeld Date: Fri, 27 Feb 2026 14:06:42 -0800 Subject: [PATCH 7/7] improve: formatting check --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd9d14fdd..c0f6a5594 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint": "biome lint .", "lint:fix": "biome lint --write .", "format": "biome check --write . --max-diagnostics none", - "format:check": "biome check --linter-enabled=false --assist-enabled=false .", + "format:check": "biome check --linter-enabled=false --assist-enabled=true .", "check": "biome check .", "prebuild": "bun scripts:check-app-env", "<<<<<<< Development Tools": "",