openpencil/oxlint.json
Danila Poyarkov b665d9c99e chore(lint): narrow test output exceptions
- Replace broad test no-console and max-lines disables with file-specific overrides
- Keep empty-function disabled broadly for test mocks and no-op fixtures
- Preserve clean check output while reducing global test lint carve-outs
2026-05-06 02:33:31 +03:00

267 lines
9.2 KiB
JSON

{
"$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-destructuring": "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-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-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"
},
"overrides": [
{
"files": ["src/**/*.ts"],
"rules": {
"open-pencil/no-useless-pass-through-wrappers": "error"
}
},
{
"files": ["tests/**/*.ts", "tests/**/*.tsx"],
"rules": {
"typescript/no-non-null-assertion": "off",
"no-unused-vars": "off",
"no-empty-function": "off",
"typescript/consistent-type-imports": "off",
"open-pencil/no-inline-named-types": "off",
"complexity": "off"
}
},
{
"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": [
"tests/engine/editor/clipboard/import-nodes.test.ts",
"tests/engine/fig/import/legacy.test.ts",
"tests/engine/figma/api.test.ts",
"tests/engine/kiwi/serialize-fixes.test.ts",
"tests/engine/layout/auto-layout.test.ts",
"tests/engine/render/canvas/effects.test.ts",
"tests/engine/scene-graph/basic.test.ts",
"tests/engine/svg/export.test.ts"
],
"rules": {
"max-lines": "off"
}
},
{
"files": [
"tests/engine/copy.test.ts",
"tests/engine/editor/selection/**/*.test.ts",
"tests/engine/fig/export/text.test.ts",
"tests/engine/fig/heavy/fixtures.test.ts",
"tests/engine/fig/import/basic.test.ts",
"tests/engine/fig/import/edge-cases.test.ts",
"tests/engine/fig/import/instance-regressions.test.ts",
"tests/engine/fig/import/property-integrity.test.ts",
"tests/engine/fig/roundtrip/basic.test.ts",
"tests/engine/fig/roundtrip/variables.test.ts",
"tests/engine/fonts/normalize-export.test.ts",
"tests/engine/matrix.test.ts",
"tests/engine/mcp/stdio.test.ts",
"tests/engine/editor/nudge.test.ts",
"tests/engine/color/okhcl/**/*.test.ts",
"tests/engine/scene-graph/plugin-data.test.ts",
"tests/engine/render/canvas/cache.test.ts",
"tests/engine/render/jsx/**/*.test.ts",
"tests/engine/text/edit-undo.test.ts"
],
"rules": {
"typescript/no-non-null-assertion": "error"
}
},
{
"files": ["scripts/**/*.ts"],
"rules": {
"no-console": "off",
"typescript/no-non-null-assertion": "off",
"open-pencil/no-hand-rolled-color": "off",
"radix": "off"
}
}
],
"ignorePatterns": ["node_modules", "dist", "desktop", "*.config.*"]
}