{ "$schema": "./node_modules/oxlint/configuration_schema.json", "plugins": ["typescript", "import", "unicorn", "vue"], "jsPlugins": ["./lint/plugin.js"], "env": { "browser": true, "es2024": true }, "rules": { "no-unused-vars": "warn", "no-console": [ "warn", { "allow": ["warn", "error", "debug", "time", "timeEnd"] } ], "eqeqeq": [ "error", "always", { "null": "ignore" } ], "prefer-const": "error", "radix": "error", "no-restricted-imports": [ "error", { "paths": [ { "name": "@/types", "message": "Import types directly from @open-pencil/core." } ], "patterns": [ { "group": ["@/engine/*"], "message": "Import from @open-pencil/core unless the module adds platform-specific logic.", "allowImportNames": ["loadFont", "listFamilies", "listFonts", "preloadFonts"] }, { "group": ["../../packages/*", "../../../packages/*"], "message": "Use the workspace package name (e.g. @open-pencil/core) instead of relative paths to packages/." } ] } ], "no-empty-function": "error", "max-lines": [ "warn", { "max": 600 } ], "complexity": [ "error", { "max": 20 } ], "typescript/no-explicit-any": "error", "typescript/no-non-null-assertion": "error", "typescript/no-floating-promises": "error", "typescript/no-misused-promises": "error", "typescript/consistent-type-imports": "error", "typescript/consistent-return": "error", "typescript/no-unnecessary-condition": "error", "typescript/no-unnecessary-type-assertion": "error", "typescript/no-unnecessary-type-parameters": "error", "typescript/no-unnecessary-boolean-literal-compare": "error", "typescript/no-unnecessary-template-expression": "error", "typescript/no-unnecessary-type-arguments": "error", "typescript/prefer-optional-chain": "error", "typescript/prefer-for-of": "error", "import/no-cycle": "error", "import/no-self-import": "error", "import/no-duplicates": "error", "import/no-mutable-exports": "error", "unicorn/no-instanceof-array": "error", "unicorn/no-typeof-undefined": "error", "unicorn/no-nested-ternary": "error", "unicorn/no-useless-fallback-in-spread": "error", "unicorn/no-length-as-slice-end": "error", "unicorn/no-unnecessary-await": "error", "unicorn/prefer-string-starts-ends-with": "error", "unicorn/consistent-existence-index-check": "error", "vue/no-arrow-functions-in-watch": "error", "vue/no-deprecated-destroyed-lifecycle": "error", "vue/no-export-in-script-setup": "error", "vue/no-lifecycle-after-await": "error", "vue/no-import-compiler-macros": "error", "vue/prefer-import-from-vue": "error", "vue/valid-define-emits": "error", "vue/valid-define-props": "error", "vue/no-required-prop-with-default": "error", "vue/no-multiple-slot-args": "error", "vue/define-emits-declaration": "error", "vue/define-props-declaration": "error", "vue/define-props-destructuring": "error", "vue/max-props": ["error", { "maxProps": 16 }], "vue/require-default-export": "error", "vue/require-typed-ref": "error", "open-pencil/no-inline-named-types": [ "error", { "Vector": "x:number,y:number", "Color": "a:number,b:number,g:number,r:number", "GUID": "localID:number,sessionID:number", "Rect": "height:number,width:number,x:number,y:number", "Matrix": "m00:number,m01:number,m02:number,m10:number,m11:number,m12:number" } ], "open-pencil/no-structuredclone-scene-arrays": "error", "open-pencil/no-vue-style-blocks": "error", "open-pencil/no-raw-test-id-string-props": "error", "open-pencil/no-dynamic-data-test-id-in-vue": "error", "open-pencil/no-test-id-helper-bind-in-vue": "error", "open-pencil/no-invalid-test-id-attributes": "error", "open-pencil/no-raw-test-id-selectors-in-tests": "error", "open-pencil/no-generated-test-id-literals": "error", "open-pencil/no-browser-side-effects-in-vue": "error", "open-pencil/no-document-query-selector-in-vue": "error", "open-pencil/no-direct-selection-tool-state-mutation": "error", "open-pencil/no-math-random": "error", "open-pencil/no-hand-rolled-color": "error", "open-pencil/no-raw-console-format": "off", "open-pencil/no-silent-catch": "error", "open-pencil/no-typeof-window-check": "error", "open-pencil/no-vue-self-package-imports": "error", "open-pencil/no-cross-package-source-imports": "error", "open-pencil/no-app-imports-in-packages": "error", "open-pencil/no-core-framework-imports": "error", "open-pencil/no-direct-storage-access": "error", "open-pencil/no-deep-parent-relative-imports": "error", "open-pencil/no-broad-double-cast": "error", "open-pencil/no-unknown-record-double-cast": "error", "open-pencil/no-ts-suppression-comments": "error", "open-pencil/no-function-type": "error", "open-pencil/no-reflect-delete-global-this-outside-tests": "error", "open-pencil/no-core-browser-globals": "error", "open-pencil/no-direct-open-pencil-window-internals": "error", "open-pencil/no-direct-open-pencil-browser-store": "error", "open-pencil/no-function-alias-imports": "error", "open-pencil/max-composition-root-lines": [ "error", { "max": 260 } ], "open-pencil/no-core-parent-relative-imports": "error", "open-pencil/no-mcp-parent-relative-imports": "error", "open-pencil/no-vue-parent-relative-imports": "error", "open-pencil/no-cli-parent-relative-imports": "error", "open-pencil/no-mcp-core-barrel-imports": "error", "open-pencil/no-cli-core-barrel-imports": "error", "open-pencil/no-script-core-barrel-imports": "error", "open-pencil/no-core-self-package-imports": "error", "open-pencil/no-inline-prompt-constants": "error", "open-pencil/no-app-vue-core-barrel-imports": "error", "open-pencil/no-direct-graph-emitter-subscriptions": "error", "open-pencil/no-on-unmounted-in-composition-roots": "error", "open-pencil/no-composable-state-wrappers": "error", "open-pencil/prefer-vueuse-intervals": "error", "open-pencil/prefer-vueuse-timeouts": "error", "open-pencil/vue-component-file-pascal-case": "error", "open-pencil/component-namespace-pascal-case": "error", "open-pencil/non-component-source-directories-kebab-case": "error", "open-pencil/no-component-root-sibling-folder": "error", "open-pencil/no-flat-kiwi-modules": "error", "open-pencil/no-top-level-prefixed-test-files": "error", "open-pencil/no-sibling-domain-prefixed-files": "error" }, "overrides": [ { "files": ["src/**/*.ts", "packages/*/src/**/*.ts"], "rules": { "open-pencil/no-useless-pass-through-wrappers": "error" } }, { "files": ["**/kiwi/kiwi-schema/**"], "rules": { "typescript/no-explicit-any": "off", "typescript/no-non-null-assertion": "off", "typescript/no-implied-eval": "off", "typescript/prefer-for-of": "off", "typescript/prefer-optional-chain": "off", "typescript/consistent-type-imports": "off", "typescript/no-unnecessary-condition": "off", "import/no-mutable-exports": "off", "complexity": "off", "prefer-const": "off", "eqeqeq": "off", "radix": "off" } }, { "files": ["packages/cli/src/**", "packages/mcp/src/**"], "rules": { "no-console": "off" } }, { "files": ["packages/cli/src/commands/**"], "rules": { "open-pencil/no-raw-console-format": "error" } }, { "files": [ "tests/e2e/perf/basic.spec.ts", "tests/e2e/viewport/zoom-pan.spec.ts", "tests/engine/visual-*.ts" ], "rules": { "no-console": "off" } }, { "files": ["scripts/**/*.ts"], "rules": { "no-console": "off" } } ], "ignorePatterns": ["node_modules", "dist", "desktop", "*.config.*"] }