diff --git a/spinifex/services/spinifexui/frontend/.oxlintrc.json b/spinifex/services/spinifexui/frontend/.oxlintrc.json index a6f89d523..e3a31bde8 100644 --- a/spinifex/services/spinifexui/frontend/.oxlintrc.json +++ b/spinifex/services/spinifexui/frontend/.oxlintrc.json @@ -10,6 +10,10 @@ "@tanstack/eslint-plugin-query", "@tanstack/eslint-plugin-router" ], + "options": { + "typeAware": true, + "typeCheck": true + }, "rules": { "@tanstack/router/create-route-property-order": "warn", "@tanstack/router/route-param-names": "error", @@ -30,10 +34,18 @@ "eslint/sort-vars": "off", "import/consistent-type-specifier-style": "off", "import/first": "off", - "promise/prefer-await-to-callbacks": "off", "react/jsx-handler-names": "off", "react/no-unescaped-entities": "off", + "promise/prefer-await-to-callbacks": "off", "react-perf/jsx-no-new-function-as-prop": "off", + "typescript/no-confusing-void-expression": "off", + "typescript/prefer-nullish-coalescing": "off", + "typescript/return-await": "off", + "typescript/no-floating-promises": "off", + "typescript/strict-boolean-expressions": "off", + "typescript/no-misused-promises": "off", + "typescript/only-throw-error": "off", + "typescript/promise-function-async": "off", "unicorn/filename-case": [ "error", { "cases": { "kebabCase": true, "camelCase": true } } @@ -47,6 +59,10 @@ ], "rules": { "typescript/consistent-type-imports": "off", + "typescript/no-unsafe-argument": "off", + "typescript/no-unsafe-assignment": "off", + "typescript/no-unsafe-member-access": "off", + "typescript/no-unsafe-type-assertion": "off", "unicorn/no-useless-undefined": "off" } } diff --git a/spinifex/services/spinifexui/frontend/package.json b/spinifex/services/spinifexui/frontend/package.json index 97a82260a..4ca583c21 100644 --- a/spinifex/services/spinifexui/frontend/package.json +++ b/spinifex/services/spinifexui/frontend/package.json @@ -4,10 +4,10 @@ "type": "module", "scripts": { "dev": "vite --port 3000", - "build": "vite build && tsgo", + "build": "vite build", "preview": "vite preview", - "check": "oxlint; oxfmt --check", - "fix": "oxlint --fix; oxfmt", + "check": "oxlint src; oxfmt --check", + "fix": "oxlint --fix src; oxfmt", "test": "vitest run", "test:coverage": "vitest run --coverage", "test:watch": "vitest" diff --git a/spinifex/services/spinifexui/frontend/src/components/ui/input-group.tsx b/spinifex/services/spinifexui/frontend/src/components/ui/input-group.tsx index 345c45974..9a6158dbc 100644 --- a/spinifex/services/spinifexui/frontend/src/components/ui/input-group.tsx +++ b/spinifex/services/spinifexui/frontend/src/components/ui/input-group.tsx @@ -56,7 +56,7 @@ export function InputGroupAddon({ data-align={align} data-slot="input-group-addon" onClick={(e) => { - if ((e.target as HTMLElement).closest("button")) { + if (e.target instanceof HTMLElement && e.target.closest("button")) { return } e.currentTarget.parentElement?.querySelector("input")?.focus() diff --git a/spinifex/services/spinifexui/frontend/src/components/ui/sidebar.tsx b/spinifex/services/spinifexui/frontend/src/components/ui/sidebar.tsx index ce7308132..3110a244f 100644 --- a/spinifex/services/spinifexui/frontend/src/components/ui/sidebar.tsx +++ b/spinifex/services/spinifexui/frontend/src/components/ui/sidebar.tsx @@ -180,6 +180,10 @@ export function Sidebar({ } if (isMobile) { + // oxlint-disable-next-line typescript/no-unsafe-type-assertion + const mobileStyle = { + "--sidebar-width": SIDEBAR_WIDTH_MOBILE, + } as React.CSSProperties return ( Sidebar @@ -654,11 +654,8 @@ export function SidebarMenuSkeleton({ ) diff --git a/spinifex/services/spinifexui/frontend/src/hooks/use-copy-to-clipboard.test.tsx b/spinifex/services/spinifexui/frontend/src/hooks/use-copy-to-clipboard.test.tsx index 24d0eaa4f..4cfa1db34 100644 --- a/spinifex/services/spinifexui/frontend/src/hooks/use-copy-to-clipboard.test.tsx +++ b/spinifex/services/spinifexui/frontend/src/hooks/use-copy-to-clipboard.test.tsx @@ -29,6 +29,7 @@ describe("useCopyToClipboard", () => { await result.current.copy("hello") }) + // oxlint-disable-next-line typescript/unbound-method -- vitest mock expect(navigator.clipboard.writeText).toHaveBeenCalledWith("hello") expect(result.current.copied).toBe(true) }) diff --git a/spinifex/services/spinifexui/frontend/src/lib/auth.ts b/spinifex/services/spinifexui/frontend/src/lib/auth.ts index 03b90b388..8121b8196 100644 --- a/spinifex/services/spinifexui/frontend/src/lib/auth.ts +++ b/spinifex/services/spinifexui/frontend/src/lib/auth.ts @@ -27,7 +27,7 @@ export function getCredentials(): AwsCredentials | null { credentialsCache = null return null } - const parsed = JSON.parse(stored) + const parsed: unknown = JSON.parse(stored) const result = awsCredentialsSchema.safeParse(parsed) credentialsCache = result.success ? result.data : null return credentialsCache diff --git a/spinifex/services/spinifexui/frontend/src/lib/awsClient.ts b/spinifex/services/spinifexui/frontend/src/lib/awsClient.ts index 1bb3561ec..2ec1a1c1d 100644 --- a/spinifex/services/spinifexui/frontend/src/lib/awsClient.ts +++ b/spinifex/services/spinifexui/frontend/src/lib/awsClient.ts @@ -71,6 +71,7 @@ export function getS3Client(): S3Client { applyToStack: (stack) => { stack.add( (next) => (args) => { + // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- smithy middleware args.request is typed as unknown const request = (args as { request?: { path?: string } }).request if (request?.path?.endsWith("/") && request.path !== "/") { request.path = request.path.slice(0, -1) diff --git a/spinifex/services/spinifexui/frontend/src/mutations/ec2.ts b/spinifex/services/spinifexui/frontend/src/mutations/ec2.ts index 8ce7dcd8b..a34538383 100644 --- a/spinifex/services/spinifexui/frontend/src/mutations/ec2.ts +++ b/spinifex/services/spinifexui/frontend/src/mutations/ec2.ts @@ -112,6 +112,7 @@ export function useCreateInstance() { mutationFn: (params: CreateInstanceParams) => { const command = new RunInstancesCommand({ ImageId: params.imageId, + // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- AWS SDK expects _InstanceType enum InstanceType: params.instanceType as _InstanceType, KeyName: params.keyName, MinCount: params.count, diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/-components/object-list-item.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/-components/object-list-item.tsx index 213befb11..abe6ceb1b 100644 --- a/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/-components/object-list-item.tsx +++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/-components/object-list-item.tsx @@ -34,8 +34,10 @@ export function ObjectListItem({ const response = await getS3Client().send(command) if (response.Body) { + // oxlint-disable-next-line typescript/no-unsafe-call, typescript/no-unsafe-member-access, typescript/no-unsafe-assignment const blob = await response.Body.transformToByteArray() - const url = URL.createObjectURL(new Blob([blob])) + // oxlint-disable-next-line typescript/no-unsafe-type-assertion + const url = URL.createObjectURL(new Blob([blob as BlobPart])) const link = document.createElement("a") link.href = url diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/ls/$bucket/$.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/ls/$bucket/$.tsx index 94c639882..b85f531a7 100644 --- a/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/ls/$bucket/$.tsx +++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/ls/$bucket/$.tsx @@ -68,7 +68,7 @@ function BucketObjectsWithPrefix() { return ( <> - {/* oxlint-disable-next-line typescript/no-explicit-any valid }*/} + {/* oxlint-disable-next-line typescript/no-explicit-any, typescript/no-unsafe-type-assertion, typescript/no-unsafe-assignment -- dynamic route path */} Back