openpencil/oxlint.json
2026-07-01 12:56:45 +03:00

518 lines
18 KiB
JSON

{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": [
"typescript",
"import",
"unicorn",
"vue",
"promise",
"node"
],
"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."
},
{
"name": "node:module",
"importNames": [
"createRequire"
],
"message": "Use ESM imports or import.meta.resolve instead of createRequire/require."
}
],
"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-import-type-annotations": "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-native-title-attributes-in-vue": "error",
"open-pencil/no-hardcoded-tip-labels-in-vue": "error",
"open-pencil/no-raw-svg-in-app-vue-templates": "error",
"open-pencil/no-ui-helper-calls-in-vue-templates": "error",
"open-pencil/no-large-property-section-components": "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-hardcoded-color-constants": "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-broad-unknown-type-assertions": "error",
"open-pencil/no-local-json-object-aliases": "error",
"open-pencil/no-duplicate-type-shapes": "error",
"open-pencil/no-ts-suppression-comments": "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-casing": "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",
"array-callback-return": "error",
"block-scoped-var": "error",
"default-case-last": "error",
"default-param-last": "error",
"guard-for-in": "error",
"no-array-constructor": "error",
"no-case-declarations": "error",
"no-caller": "error",
"no-constructor-return": "error",
"no-else-return": "error",
"no-empty-pattern": "error",
"no-eval": "error",
"no-extend-native": "error",
"no-extra-bind": "error",
"no-extra-label": "error",
"no-implied-eval": "error",
"no-iterator": "error",
"no-labels": "error",
"no-lone-blocks": "error",
"no-multi-str": "error",
"no-new": "error",
"no-new-wrappers": "error",
"no-object-constructor": "error",
"no-proto": "error",
"no-return-assign": "error",
"no-script-url": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-template-curly-in-string": "error",
"no-unmodified-loop-condition": "error",
"no-unneeded-ternary": "error",
"no-unused-expressions": "error",
"no-useless-assignment": "error",
"no-useless-call": "error",
"no-useless-computed-key": "error",
"no-useless-concat": "error",
"no-useless-constructor": "error",
"no-useless-rename": "error",
"no-useless-return": "error",
"prefer-numeric-literals": "error",
"prefer-object-has-own": "error",
"prefer-promise-reject-errors": "error",
"prefer-regex-literals": "error",
"prefer-rest-params": "error",
"prefer-spread": "error",
"symbol-description": "error",
"unicode-bom": "error",
"yoda": "error",
"typescript/adjacent-overload-signatures": "error",
"typescript/await-thenable": "error",
"typescript/ban-ts-comment": "error",
"typescript/ban-tslint-comment": "error",
"typescript/no-array-delete": "error",
"typescript/no-base-to-string": "error",
"typescript/no-confusing-non-null-assertion": "error",
"typescript/no-duplicate-enum-values": "error",
"typescript/no-duplicate-type-constituents": "error",
"typescript/no-extraneous-class": "error",
"typescript/no-extra-non-null-assertion": "error",
"typescript/no-for-in-array": "error",
"typescript/no-implied-eval": "error",
"typescript/no-invalid-void-type": "error",
"typescript/no-meaningless-void-operator": "error",
"typescript/no-misused-new": "error",
"typescript/no-misused-spread": "error",
"typescript/no-mixed-enums": "error",
"typescript/no-non-null-asserted-nullish-coalescing": "error",
"typescript/no-non-null-asserted-optional-chain": "error",
"typescript/no-redundant-type-constituents": "error",
"typescript/no-this-alias": "error",
"typescript/no-unnecessary-parameter-property-assignment": "error",
"typescript/no-unnecessary-qualifier": "error",
"typescript/no-unnecessary-type-constraint": "error",
"typescript/no-unsafe-enum-comparison": "error",
"typescript/no-unsafe-function-type": "error",
"typescript/no-unsafe-unary-minus": "error",
"typescript/no-useless-default-assignment": "error",
"typescript/no-useless-empty-export": "error",
"typescript/no-var-requires": "error",
"typescript/no-wrapper-object-types": "error",
"typescript/only-throw-error": "error",
"typescript/prefer-as-const": "error",
"typescript/prefer-find": "error",
"typescript/prefer-function-type": "error",
"typescript/prefer-promise-reject-errors": "error",
"typescript/prefer-reduce-type-parameter": "error",
"typescript/prefer-return-this-type": "error",
"typescript/prefer-ts-expect-error": "error",
"typescript/require-array-sort-compare": "error",
"typescript/triple-slash-reference": "error",
"import/no-absolute-path": "error",
"import/no-amd": "error",
"import/no-commonjs": "error",
"import/no-dynamic-require": "error",
"import/no-empty-named-blocks": "error",
"import/no-webpack-loader-syntax": "error",
"promise/always-return": "error",
"promise/catch-or-return": "error",
"promise/no-callback-in-promise": "error",
"promise/no-multiple-resolved": "error",
"promise/no-new-statics": "error",
"promise/no-promise-in-callback": "error",
"promise/no-return-in-finally": "error",
"promise/no-return-wrap": "error",
"promise/valid-params": "error",
"node/no-exports-assign": "error",
"node/no-new-require": "error",
"node/no-path-concat": "error",
"oxc/approx-constant": "error",
"oxc/missing-throw": "error",
"oxc/no-accumulating-spread": "error",
"oxc/no-async-endpoint-handlers": "error",
"oxc/no-map-spread": "error",
"oxc/number-arg-out-of-range": "error",
"oxc/uninvoked-array-callback": "error",
"unicorn/consistent-assert": "error",
"unicorn/consistent-date-clone": "error",
"unicorn/consistent-empty-array-spread": "error",
"unicorn/consistent-template-literal-escape": "error",
"unicorn/custom-error-definition": "error",
"unicorn/error-message": "error",
"unicorn/new-for-builtins": "error",
"unicorn/no-abusive-eslint-disable": "error",
"unicorn/no-accessor-recursion": "error",
"unicorn/no-anonymous-default-export": "error",
"unicorn/no-array-method-this-argument": "error",
"unicorn/no-await-in-promise-methods": "error",
"unicorn/no-console-spaces": "error",
"unicorn/no-document-cookie": "error",
"unicorn/no-empty-file": "error",
"unicorn/no-instanceof-builtins": "error",
"unicorn/no-invalid-fetch-options": "error",
"unicorn/no-invalid-remove-event-listener": "error",
"unicorn/no-magic-array-flat-depth": "error",
"unicorn/no-negation-in-equality-check": "error",
"unicorn/no-new-array": "error",
"unicorn/no-new-buffer": "error",
"unicorn/no-single-promise-in-promise-methods": "error",
"unicorn/no-static-only-class": "error",
"unicorn/no-thenable": "error",
"unicorn/no-this-assignment": "error",
"unicorn/no-unnecessary-array-flat-depth": "error",
"unicorn/no-unnecessary-array-splice-count": "error",
"unicorn/no-unnecessary-slice-end": "error",
"unicorn/no-unreadable-iife": "error",
"unicorn/no-useless-collection-argument": "error",
"unicorn/no-useless-error-capture-stack-trace": "error",
"unicorn/no-useless-iterator-to-array": "error",
"unicorn/no-useless-length-check": "error",
"unicorn/no-useless-promise-resolve-reject": "error",
"unicorn/no-useless-spread": "error",
"unicorn/no-useless-switch-case": "error",
"unicorn/prefer-array-find": "error",
"unicorn/prefer-array-flat": "error",
"unicorn/prefer-array-flat-map": "error",
"unicorn/prefer-array-index-of": "error",
"unicorn/prefer-array-some": "error",
"unicorn/prefer-blob-reading-methods": "error",
"unicorn/prefer-classlist-toggle": "error",
"unicorn/prefer-date-now": "error",
"unicorn/prefer-event-target": "error",
"unicorn/prefer-keyboard-event-key": "error",
"unicorn/prefer-modern-dom-apis": "error",
"unicorn/prefer-negative-index": "error",
"unicorn/prefer-native-coercion-functions": "error",
"unicorn/prefer-object-from-entries": "error",
"unicorn/prefer-optional-catch-binding": "error",
"unicorn/prefer-prototype-methods": "error",
"unicorn/prefer-regexp-test": "error",
"unicorn/prefer-set-size": "error",
"unicorn/prefer-string-slice": "error",
"unicorn/prefer-string-trim-start-end": "error",
"unicorn/prefer-structured-clone": "error",
"unicorn/prefer-type-error": "error",
"unicorn/require-array-join-separator": "error",
"unicorn/require-number-to-fixed-digits-argument": "error",
"unicorn/throw-new-error": "error",
"vue/no-deprecated-data-object-declaration": "error",
"vue/no-deprecated-delete-set": "error",
"vue/no-deprecated-events-api": "error",
"vue/no-deprecated-model-definition": "error",
"vue/no-deprecated-vue-config-keycodes": "error",
"vue/no-this-in-before-route-enter": "error",
"vue/return-in-computed-property": "error",
"unicorn/require-post-message-target-origin": "error",
"unicorn/prefer-set-has": "error",
"unicorn/prefer-modern-math-apis": "error",
"unicorn/prefer-node-protocol": "error",
"unicorn/prefer-number-properties": "error",
"prefer-exponentiation-operator": "error",
"no-promise-executor-return": "error",
"typescript/no-empty-object-type": "error",
"typescript/return-await": "error",
"typescript/restrict-plus-operands": "error",
"unicorn/prefer-includes": "error",
"no-loop-func": "error",
"typescript/no-dynamic-delete": "error"
},
"overrides": [
{
"files": [
"src/**/*.ts",
"packages/*/src/**/*.ts"
],
"rules": {
"open-pencil/no-useless-pass-through-wrappers": "error"
}
},
{
"files": [
"**/kiwi/schema-runtime/**",
"**/kiwi/src/schema-runtime/**"
],
"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",
"tools/**/*.ts"
],
"rules": {
"no-console": "off"
}
},
{
"files": [
"packages/scene-graph/src/constants.ts"
],
"rules": {
"open-pencil/no-hardcoded-color-constants": "off"
}
},
{
"files": [
"packages/scene-graph/src/index.ts"
],
"rules": {
"open-pencil/no-direct-graph-emitter-subscriptions": "off"
}
},
{
"files": [
"packages/core/src/io/formats/fig/export.ts",
"packages/core/src/kiwi/fig/parse/worker.ts"
],
"rules": {
"unicorn/require-post-message-target-origin": "off"
}
}
],
"ignorePatterns": [
"node_modules",
"dist",
"desktop",
"*.config.*"
],
"categories": {
"correctness": "error"
}
}