diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 93% rename from .eslintrc.js rename to .eslintrc.cjs index 4e549c9d..8ec55062 100644 --- a/.eslintrc.js +++ b/.eslintrc.cjs @@ -65,13 +65,14 @@ module.exports = { parserOptions: { warnOnUnsupportedTypeScriptVersion: false, sourceType: 'module', - project: 'tsconfig.json', + project: 'tsconfig.app.json', ecmaFeatures: { jsx: true, }, }, plugins: [ '@typescript-eslint', + '@stylistic', 'import', ], settings: { @@ -97,14 +98,16 @@ module.exports = { 'error', { 'ts-expect-error': 'allow-with-description', + 'ts-ignore': true, minimumDescriptionLength: 4, }, ], '@typescript-eslint/ban-tslint-comment': 'error', - '@typescript-eslint/ban-types': [ + + // Replaces removed @typescript-eslint/ban-types (split in v8) + '@typescript-eslint/no-restricted-types': [ 'error', { - extendDefaults: false, types: { String: { message: 'Use `string` instead.', @@ -141,12 +144,6 @@ module.exports = { 'The `object` type is hard to use. Use `Record` instead. See: https://github.com/typescript-eslint/typescript-eslint/pull/848', fixWith: 'Record', }, - Function: 'Use a specific function type instead, like `() => void`.', - // null: { - // message: - // 'Use `undefined` instead. See: https://github.com/sindresorhus/meta/issues/7', - // fixWith: 'undefined', - // }, Buffer: { message: 'Use Uint8Array instead. See: https://sindresorhus.com/blog/goodbye-nodejs-buffer', @@ -161,14 +158,19 @@ module.exports = { }, }, ], + '@typescript-eslint/no-unsafe-function-type': 'error', + '@typescript-eslint/no-wrapper-object-types': 'error', + '@typescript-eslint/class-literal-property-style': ['error', 'getters'], '@typescript-eslint/consistent-generic-constructors': [ 'error', 'constructor', ], '@typescript-eslint/consistent-indexed-object-style': 'error', + + // Stylistic rules (moved from @typescript-eslint in v8) 'brace-style': 'off', - '@typescript-eslint/brace-style': [ + '@stylistic/brace-style': [ 'error', '1tbs', { @@ -176,9 +178,9 @@ module.exports = { }, ], 'comma-dangle': 'off', - '@typescript-eslint/comma-dangle': ['error', 'always-multiline'], + '@stylistic/comma-dangle': ['error', 'always-multiline'], 'comma-spacing': 'off', - '@typescript-eslint/comma-spacing': [ + '@stylistic/comma-spacing': [ 'error', { before: false, @@ -237,9 +239,9 @@ module.exports = { // ], 'func-call-spacing': 'off', - '@typescript-eslint/func-call-spacing': ['error', 'never'], + '@stylistic/function-call-spacing': ['error', 'never'], indent: 'off', - '@typescript-eslint/indent': [ + '@stylistic/indent': [ 'error', 2, { @@ -247,9 +249,9 @@ module.exports = { }, ], 'keyword-spacing': 'off', - '@typescript-eslint/keyword-spacing': 'error', + '@stylistic/keyword-spacing': 'error', 'lines-between-class-members': 'off', - '@typescript-eslint/lines-between-class-members': [ + '@stylistic/lines-between-class-members': [ 'error', 'always', { @@ -258,7 +260,7 @@ module.exports = { exceptAfterSingleLine: true, }, ], - '@typescript-eslint/member-delimiter-style': [ + '@stylistic/member-delimiter-style': [ 'error', { multiline: { @@ -358,10 +360,12 @@ module.exports = { '@typescript-eslint/no-dynamic-delete': 'error', 'no-empty-function': 'off', '@typescript-eslint/no-empty-function': 'error', - '@typescript-eslint/no-empty-interface': [ + + // Replaces removed @typescript-eslint/no-empty-interface (v8) + '@typescript-eslint/no-empty-object-type': [ 'error', { - allowSingleExtends: true, + allowInterfaces: 'with-single-extends', }, ], @@ -392,11 +396,11 @@ module.exports = { // ], 'no-extra-semi': 'off', - '@typescript-eslint/no-extra-semi': 'error', + '@stylistic/no-extra-semi': 'error', 'no-loop-func': 'off', '@typescript-eslint/no-loop-func': 'error', - 'no-loss-of-precision': 'off', - '@typescript-eslint/no-loss-of-precision': 'error', + // Removed in @typescript-eslint v8 — base ESLint rule handles this now + 'no-loss-of-precision': 'error', '@typescript-eslint/no-extraneous-class': [ 'error', { @@ -468,6 +472,7 @@ module.exports = { // The rule is buggy and keeps inferring `any` for types that are not `any`. Just a lot of false-positives. // '@typescript-eslint/no-redundant-type-constituents': 'error', + // no-require-imports subsumes the removed no-var-requires in v8 '@typescript-eslint/no-require-imports': 'error', '@typescript-eslint/no-this-alias': [ 'error', @@ -475,8 +480,9 @@ module.exports = { allowDestructuring: true, }, ], + // Replaces removed @typescript-eslint/no-throw-literal (renamed in v8) 'no-throw-literal': 'off', - '@typescript-eslint/no-throw-literal': [ + '@typescript-eslint/only-throw-error': [ 'error', { // This should ideally be `false`, but it makes rethrowing errors inconvenient. There should be a separate `allowRethrowingUnknown` option. @@ -534,9 +540,9 @@ module.exports = { '@typescript-eslint/no-useless-constructor': 'error', 'object-curly-spacing': 'off', 'curly': ['error', 'all'], - '@typescript-eslint/object-curly-spacing': ['error', 'always'], + '@stylistic/object-curly-spacing': ['error', 'always'], 'padding-line-between-statements': 'off', - '@typescript-eslint/padding-line-between-statements': [ + '@stylistic/padding-line-between-statements': [ 'error', { blankLine: 'always', @@ -544,7 +550,6 @@ module.exports = { next: '*', }, ], - '@typescript-eslint/no-var-requires': 'error', '@typescript-eslint/non-nullable-type-assertion-style': 'error', '@typescript-eslint/parameter-properties': [ 'error', @@ -584,10 +589,10 @@ module.exports = { '@typescript-eslint/prefer-reduce-type-parameter': 'error', '@typescript-eslint/prefer-string-starts-ends-with': 'error', - '@typescript-eslint/prefer-ts-expect-error': 'error', + // Removed in v8 — covered by ban-ts-comment with ts-ignore: true '@typescript-eslint/promise-function-async': 'error', quotes: 'off', - '@typescript-eslint/quotes': ['error', 'single'], + '@stylistic/quotes': ['error', 'single'], '@typescript-eslint/restrict-plus-operands': [ 'error', { @@ -613,7 +618,7 @@ module.exports = { // '@typescript-eslint/require-await': 'error', 'space-before-function-paren': 'off', - '@typescript-eslint/space-before-function-paren': [ + '@stylistic/space-before-function-paren': [ 'error', { anonymous: 'always', @@ -622,11 +627,11 @@ module.exports = { }, ], 'space-infix-ops': 'off', - '@typescript-eslint/space-infix-ops': 'error', + '@stylistic/space-infix-ops': 'error', semi: 'off', - '@typescript-eslint/semi': ['error', 'always'], + '@stylistic/semi': ['error', 'always'], 'space-before-blocks': 'off', - '@typescript-eslint/space-before-blocks': ['error', 'always'], + '@stylistic/space-before-blocks': ['error', 'always'], // TODO: Reconsider enabling it again in 2023. // NOTE: The rule was complete redone in typescript-eslint v3, so this config needs to be changed before this is enabled. @@ -656,7 +661,7 @@ module.exports = { lib: 'never', }, ], - '@typescript-eslint/type-annotation-spacing': 'error', + '@stylistic/type-annotation-spacing': 'error', // Disabled as it crashes on most code. // https://github.com/typescript-eslint/typescript-eslint/search?q=%22unbound-method%22&state=open&type=Issues diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml new file mode 100644 index 00000000..1a5bb253 --- /dev/null +++ b/.github/workflows/pr-checks.yml @@ -0,0 +1,104 @@ +name: PR Checks + +on: + pull_request: + branches: [main] + +concurrency: + group: pr-checks-${{ github.event.pull_request.number }} + cancel-in-progress: true + +env: + GO_VERSION: "1.26" + NODE_VERSION: "20.18.1" + PNPM_VERSION: "9.15.0" + +jobs: + go-checks: + name: Go checks + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + cache: true + + - name: Build + run: make go-build + + - name: Vet + run: make go-vet + + - name: Test + run: make go-test + + - name: Format check + run: make fmt-check + continue-on-error: true + + - name: Lint + uses: golangci/golangci-lint-action@v6 + with: + version: v2.1 + args: run + env: + GOWORK: "off" + continue-on-error: true + + bindings-check: + name: Bindings freshness + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + cache: true + + - name: Install wails + run: go install github.com/wailsapp/wails/v2/cmd/wails@v2.11.0 + + - name: Check bindings are up to date + run: make bindings-check + + ui-checks: + name: UI checks + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + - uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: make ui-install + + - name: Build + run: make ui-build + + - name: Lint + run: make ui-lint + continue-on-error: true + + - name: Typecheck + run: make ui-typecheck + continue-on-error: true diff --git a/.gitignore b/.gitignore index 3556dccd..c299fe2f 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ lerna-debug.log* node_modules dist +!dist/.gitkeep dist-ssr *.local diff --git a/Makefile b/Makefile index 4a5e6594..2dfdd3f3 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,97 @@ .PHONY: docs prepare sync packages dev dev-plugin runtime build +.PHONY: check go-build go-vet go-test go-lint bindings bindings-check +.PHONY: ui-install ui-build ui-lint ui-typecheck fmt fmt-check + +# ────────────────────────────────────────────── +# CI / Verification targets +# ────────────────────────────────────────────── + +# Run all checks in sequence, fail fast on first error. +# Note: dist/.gitkeep satisfies the go:embed directive so Go checks work without a frontend build. +check: go-build go-vet go-test go-lint fmt-check bindings-check ui-install ui-build ui-lint ui-typecheck + +# Go checks +go-build: + GOWORK=off go build ./... + +go-vet: + GOWORK=off go vet ./... + +go-test: + GOWORK=off go test ./... + +go-lint: + @if command -v golangci-lint >/dev/null 2>&1; then \ + GOWORK=off golangci-lint run; \ + else \ + echo "golangci-lint not installed, skipping"; \ + fi + +# Go formatting +fmt: + goimports -w . + gofmt -w . + +fmt-check: + @FAILED=0; \ + if ! command -v goimports >/dev/null 2>&1; then \ + echo "goimports not found. Install with: go install golang.org/x/tools/cmd/goimports@latest"; \ + exit 1; \ + fi; \ + UNIMPORTED=$$(goimports -l .); \ + if [ -n "$$UNIMPORTED" ]; then \ + echo "The following Go files have incorrect imports (run goimports):"; \ + echo "$$UNIMPORTED"; \ + FAILED=1; \ + fi; \ + UNFORMATTED=$$(gofmt -l .); \ + if [ -n "$$UNFORMATTED" ]; then \ + echo "The following Go files are not formatted (run gofmt):"; \ + echo "$$UNFORMATTED"; \ + FAILED=1; \ + fi; \ + if [ "$$FAILED" -eq 1 ]; then exit 1; fi + +# Wails bindings +bindings: + GOWORK=off wails generate module + +bindings-check: + @set -e; \ + TMPDIR=$$(mktemp -d); \ + cleanup() { \ + if [ -d "$$TMPDIR/wailsjs-before" ]; then \ + rm -rf packages/omniviewdev-runtime/src/wailsjs; \ + cp -R "$$TMPDIR/wailsjs-before" packages/omniviewdev-runtime/src/wailsjs; \ + fi; \ + rm -rf "$$TMPDIR"; \ + }; \ + trap cleanup EXIT; \ + cp -R packages/omniviewdev-runtime/src/wailsjs "$$TMPDIR/wailsjs-before"; \ + GOWORK=off wails generate module; \ + if ! diff -r packages/omniviewdev-runtime/src/wailsjs "$$TMPDIR/wailsjs-before" >/dev/null 2>&1; then \ + echo "Wails bindings are stale. Run 'make bindings' and commit the result."; \ + exit 1; \ + fi + +# Frontend checks +ui-install: + pnpm install --frozen-lockfile + +ui-build: + $(MAKE) packages + pnpm build + +ui-lint: + pnpm lint + +ui-typecheck: + pnpm exec tsc -p tsconfig.app.json --noEmit + +# ────────────────────────────────────────────── +# Development targets +# ────────────────────────────────────────────── prepare: go install github.com/wailsapp/wails/v2/cmd/wails@v2.11.0 @@ -59,17 +151,3 @@ sign: .PHONY: build-debug build-debug: wails build -clean -debug - -lint: lint-core lint-plugin lint-kubernetes - -lint-core: - cd src && golangci-lint run --fix - -lint-plugin: - cd packages/plugin && golangci-lint run --fix - -lint-kubernetes: - cd plugins/kubernetes && golangci-lint run --fix - -install-kubernetes: - cd plugins/kubernetes && go build pkg/main.go diff --git a/backend/pkg/plugin/pids_test.go b/backend/pkg/plugin/pids_test.go index ecb02d06..cdc84040 100644 --- a/backend/pkg/plugin/pids_test.go +++ b/backend/pkg/plugin/pids_test.go @@ -6,6 +6,7 @@ import ( "encoding/json" "os" "os/exec" + "path/filepath" "syscall" "testing" @@ -13,6 +14,13 @@ import ( "github.com/stretchr/testify/require" ) +// ensurePluginPIDDir creates the ~/.omniview directory if it doesn't exist. +// CI runners may not have this directory pre-created. +func ensurePluginPIDDir(t *testing.T) { + t.Helper() + require.NoError(t, os.MkdirAll(filepath.Dir(pluginPIDFilePath()), 0755)) +} + func TestPluginPIDTracker_RecordAndRemove(t *testing.T) { tracker := NewPluginPIDTracker() @@ -43,6 +51,8 @@ func TestPluginPIDTracker_RecordAndRemove(t *testing.T) { } func TestPluginPIDTracker_SaveAndLoad(t *testing.T) { + ensurePluginPIDDir(t) + tracker := NewPluginPIDTracker() tracker.Record("aws", 12345) tracker.Record("kubernetes", 67890) @@ -63,6 +73,8 @@ func TestPluginPIDTracker_SaveAndLoad(t *testing.T) { } func TestPluginPIDTracker_CleanupStale_KillsProcesses(t *testing.T) { + ensurePluginPIDDir(t) + // Spawn a real sleep process to kill cmd := exec.Command("sleep", "300") require.NoError(t, cmd.Start()) @@ -107,6 +119,8 @@ func TestPluginPIDTracker_CleanupStale_NoFile(t *testing.T) { } func TestPluginPIDTracker_CleanupStale_DeadProcess(t *testing.T) { + ensurePluginPIDDir(t) + // Spawn a process and kill it immediately so the PID is dead cmd := exec.Command("sleep", "300") require.NoError(t, cmd.Start()) diff --git a/dist/.gitkeep b/dist/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/package.json b/package.json index d8dcf0b0..d3b69fbe 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build": "pnpm run bundle:yaml-worker && tsc && vite build", "bundle:yaml-worker": "esbuild node_modules/monaco-yaml/yaml.worker.js --bundle --format=esm --outfile=ui/providers/monaco/yaml.worker.bundle.js --platform=browser", "postinstall": "pnpm run bundle:yaml-worker", - "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "lint": "ESLINT_USE_FLAT_CONFIG=false eslint ui --ext ts,tsx --report-unused-disable-directives", "preview": "nx preview", "test": "vitest run", "bench": "vitest bench --config vitest.bench.config.ts" @@ -68,6 +68,7 @@ "yaml": "^2.7.1" }, "devDependencies": { + "@stylistic/eslint-plugin": "^5.10.0", "@tanstack/react-query-devtools": "^5.76.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^14.2.1", diff --git a/packages/omniviewdev-runtime/src/wailsjs/go/models.ts b/packages/omniviewdev-runtime/src/wailsjs/go/models.ts index 2b00df08..239cee17 100755 --- a/packages/omniviewdev-runtime/src/wailsjs/go/models.ts +++ b/packages/omniviewdev-runtime/src/wailsjs/go/models.ts @@ -2097,7 +2097,6 @@ export namespace resource { export class RelationshipExtractor { method: string; fieldPath?: string; - ownerRefKind?: string; labelSelector?: Record; static createFrom(source: any = {}) { @@ -2108,7 +2107,6 @@ export namespace resource { if ('string' === typeof source) source = JSON.parse(source); this.method = source["method"]; this.fieldPath = source["fieldPath"]; - this.ownerRefKind = source["ownerRefKind"]; this.labelSelector = source["labelSelector"]; } } @@ -2118,7 +2116,9 @@ export namespace resource { label: string; inverseLabel?: string; cardinality?: string; + direction?: string; extractor?: RelationshipExtractor; + targetNamespaced?: boolean; static createFrom(source: any = {}) { return new RelationshipDescriptor(source); @@ -2131,7 +2131,9 @@ export namespace resource { this.label = source["label"]; this.inverseLabel = source["inverseLabel"]; this.cardinality = source["cardinality"]; + this.direction = source["direction"]; this.extractor = this.convertValues(source["extractor"], RelationshipExtractor); + this.targetNamespaced = source["targetNamespaced"]; } convertValues(a: any, classs: any, asMap: boolean = false): any { diff --git a/packages/omniviewdev-runtime/src/wailsjs/runtime/package.json b/packages/omniviewdev-runtime/src/wailsjs/runtime/package.json old mode 100644 new mode 100755 diff --git a/packages/omniviewdev-runtime/src/wailsjs/runtime/runtime.d.ts b/packages/omniviewdev-runtime/src/wailsjs/runtime/runtime.d.ts old mode 100644 new mode 100755 diff --git a/packages/omniviewdev-runtime/src/wailsjs/runtime/runtime.js b/packages/omniviewdev-runtime/src/wailsjs/runtime/runtime.js old mode 100644 new mode 100755 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24a6f3cc..0d7b4cf0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -169,6 +169,9 @@ importers: specifier: ^2.7.1 version: 2.7.1 devDependencies: + '@stylistic/eslint-plugin': + specifier: ^5.10.0 + version: 5.10.0(eslint@9.25.1(jiti@1.21.0)) '@tanstack/react-query-devtools': specifier: ^5.76.1 version: 5.76.1(@tanstack/react-query@5.76.1(react@19.2.4))(react@19.2.4) @@ -1636,6 +1639,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -2625,6 +2634,12 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@stylistic/eslint-plugin@5.10.0': + resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 + '@swc/core-darwin-arm64@1.15.13': resolution: {integrity: sha512-ztXusRuC5NV2w+a6pDhX13CGioMLq8CjX5P4XgVJ21ocqz9t19288Do0y8LklplDtwcEhYGTNdMbkmUT7+lDTg==} engines: {node: '>=10'} @@ -3066,6 +3081,10 @@ packages: resolution: {integrity: sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.57.1': + resolution: {integrity: sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4106,6 +4125,10 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4126,6 +4149,10 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7305,6 +7332,11 @@ snapshots: eslint: 9.25.1(jiti@1.21.0) eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@9.25.1(jiti@1.21.0))': + dependencies: + eslint: 9.25.1(jiti@1.21.0) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.20.0': @@ -8383,6 +8415,16 @@ snapshots: dependencies: storybook: 8.6.12(prettier@3.5.3) + '@stylistic/eslint-plugin@5.10.0(eslint@9.25.1(jiti@1.21.0))': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.25.1(jiti@1.21.0)) + '@typescript-eslint/types': 8.57.1 + eslint: 9.25.1(jiti@1.21.0) + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.3 + '@swc/core-darwin-arm64@1.15.13': optional: true @@ -8833,6 +8875,8 @@ snapshots: '@typescript-eslint/types@8.31.0': {} + '@typescript-eslint/types@8.57.1': {} + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -9174,6 +9218,10 @@ snapshots: dependencies: acorn: 8.14.1 + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-walk@8.3.2: {} acorn@8.11.3: {} @@ -10307,6 +10355,8 @@ snapshots: eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} + eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.6.1(eslint@8.57.1) @@ -10398,6 +10448,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 + espree@10.4.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 4.2.1 + espree@9.6.1: dependencies: acorn: 8.14.1