oxlint.json
Rama master · réplica de lectura del repositorio original.
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"extends": ["./packages/oxlint-plugin/recommended.json"],
"plugins": ["typescript", "import", "unicorn", "vue", "promise", "node"],
"jsPlugins": [
"./lint/data.js",
"./lint/editor.js",
"./lint/imports.js",
"./lint/runtime.js",
"./lint/security.js",
"./lint/structure.js",
"./lint/tailwind.js",
"./lint/test-ids.js",
"./lint/types.js",
"./lint/vue.js",
"eslint-plugin-compat"
],
"settings": {
"browsers": ["chrome 111", "edge 111", "firefox 128", "safari 16.4", "ios_saf 16.4"]
},
"env": {
"browser": true,
"es2024": true
},
"categories": {
"correctness": "error"
},
"ignorePatterns": [
"node_modules",
"dist",
"desktop",
"packages/mermaid/src/upstream",
"*.config.*"
],
"rules": {
"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/."
}
]
}
],
"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",
"vue/no-side-effects-in-computed-properties": "error",
"vue/no-async-in-computed-properties": "error",
"vue/no-watch-after-await": "error",
"vue/no-expose-after-await": "error",
"vue/no-dupe-keys": "error",
"vue/no-reserved-props": "error",
"vue/no-reserved-component-names": "error",
"vue/prop-name-casing": "error",
"vue/valid-define-options": "error",
"vue/valid-next-tick": "error",
"@open-pencil/types/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/editor/no-structuredclone-scene-arrays": "error",
"@open-pencil/vue/no-style-blocks": "error",
"@open-pencil/vue/no-native-title-attributes": "error",
"@open-pencil/vue/no-overlay-content-from-open-state": "error",
"@open-pencil/vue/no-raw-overlay-roots": "error",
"@open-pencil/vue/no-hardcoded-tip-labels": "error",
"@open-pencil/vue/no-raw-svg-in-templates": "error",
"@open-pencil/vue/no-ui-helper-calls-in-templates": "error",
"@open-pencil/vue/no-large-property-section-components": "error",
"@open-pencil/test-ids/no-raw-string-props": "error",
"@open-pencil/test-ids/no-dynamic-attributes": "error",
"@open-pencil/test-ids/no-helper-bind": "error",
"@open-pencil/test-ids/no-invalid-attributes": "error",
"@open-pencil/test-ids/no-raw-selectors-in-tests": "error",
"@open-pencil/test-ids/no-generated-literals": "error",
"@open-pencil/vue/no-browser-side-effects": "error",
"@open-pencil/vue/no-document-query-selector": "error",
"@open-pencil/editor/no-direct-selection-tool-state-mutation": "error",
"@open-pencil/data/no-hardcoded-color-constants": "error",
"@open-pencil/tailwind/no-unknown-classes": "error",
"@open-pencil/tailwind/no-px-values": "error",
"@open-pencil/tailwind/no-physical-sides": "error",
"@open-pencil/tailwind/no-interpolated-classes": "error",
"@open-pencil/data/no-hand-rolled-color": "error",
"@open-pencil/data/no-raw-runtime-effect": "error",
"@open-pencil/data/no-hand-rolled-data-url": "error",
"@open-pencil/runtime/no-raw-console-format": "off",
"@open-pencil/runtime/no-typeof-window-check": "error",
"@open-pencil/imports/no-vue-self-package": "error",
"@open-pencil/imports/no-cross-package-source": "error",
"@open-pencil/imports/no-app-in-packages": "error",
"@open-pencil/imports/no-core-framework": "error",
"@open-pencil/imports/no-inline-tauri": "error",
"@open-pencil/runtime/no-direct-storage-access": "error",
"@open-pencil/runtime/no-vite-hot-outside-reload": "error",
"@open-pencil/types/no-local-json-object-aliases": "error",
"@open-pencil/runtime/no-core-browser-globals": "error",
"@open-pencil/editor/no-zoom-in-scene-drawing": "error",
"@open-pencil/editor/no-direct-window-internals": "error",
"@open-pencil/editor/no-direct-browser-store": "error",
"@open-pencil/vue/max-composition-root-lines": [
"error",
{
"max": 260
}
],
"@open-pencil/editor/no-document-change-capture": "error",
"@open-pencil/imports/no-core-self-package": "error",
"@open-pencil/editor/no-inline-prompt-constants": "error",
"@open-pencil/editor/no-direct-graph-emitter-subscriptions": "error",
"@open-pencil/vue/no-on-unmounted-in-composition-roots": "error",
"@open-pencil/vue/no-composable-state-wrappers": "error",
"@open-pencil/vue/prefer-vueuse-intervals": "error",
"@open-pencil/vue/prefer-vueuse-timeouts": "error",
"@open-pencil/structure/vue-component-file-pascal-case": "error",
"@open-pencil/structure/component-namespace-casing": "error",
"@open-pencil/structure/no-mixed-case-acronym-identifiers": [
"error",
{
"ignoredImports": [
"@agentclientprotocol/sdk",
"@realfavicongenerator/generate-favicon",
"@tauri-apps/plugin-clipboard-manager",
"@tauri-apps/plugin-opener",
"@vueuse/core",
"culori",
"reka-ui"
],
"ignoredIdentifiers": [
"convertToHsb",
"convertToHsl",
"convertToRgb",
"formatCss",
"formatRgb",
"McpServer",
"ndJsonStream",
"openUrl",
"useObjectUrl",
"useUrlSearchParams",
"writeHtml"
]
}
],
"@open-pencil/structure/non-component-directories-kebab-case": "error",
"@open-pencil/structure/no-component-root-sibling-folder": "error",
"@open-pencil/structure/no-flat-kiwi-modules": "error",
"@open-pencil/runtime/no-bun-globals-in-cli": "error",
"@open-pencil/structure/no-top-level-prefixed-test-files": "error",
"@open-pencil/editor/no-profile-inputs": "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",
"@open-pencil/data/no-unvalidated-json-parse": "off",
"@open-pencil/data/valibot-schema-conventions": "off",
"@open-pencil/structure/no-useless-pass-through-wrappers": "off",
"@open-pencil/security/no-secret-in-query": "off",
"@open-pencil/security/no-secret-logging": "off"
},
"overrides": [
{
"files": ["packages/core/src/**"],
"rules": {
"@open-pencil/imports/no-deep-parent-relative-imports": [
"error",
{
"minDepth": 1,
"alias": "#core/*"
}
]
}
},
{
"files": ["packages/mcp/src/**"],
"rules": {
"@open-pencil/imports/no-deep-parent-relative-imports": [
"error",
{
"minDepth": 1,
"alias": "#mcp/*"
}
]
}
},
{
"files": ["packages/vue/src/**"],
"rules": {
"@open-pencil/imports/no-deep-parent-relative-imports": [
"error",
{
"minDepth": 1,
"alias": "#vue/*"
}
]
}
},
{
"files": ["packages/cli/src/**"],
"rules": {
"@open-pencil/imports/no-deep-parent-relative-imports": [
"error",
{
"minDepth": 1,
"alias": "#cli/*"
}
]
}
},
{
"files": ["packages/cloud/src/server/db/migrations/*.ts"],
"rules": {
"typescript/no-unnecessary-type-assertion": "off"
}
},
{
"files": ["packages/docs/.vitepress/theme/landing/**/*.{ts,vue}"],
"rules": {
"@open-pencil/imports/no-app-in-packages": "off"
}
},
{
"files": ["packages/cloud/src/**/*.ts"],
"rules": {
"typescript/no-unsafe-assignment": "error",
"typescript/no-unsafe-argument": "error",
"typescript/no-unsafe-call": "error",
"typescript/no-unsafe-member-access": "error",
"typescript/no-unsafe-return": "error",
"typescript/switch-exhaustiveness-check": "error",
"typescript/no-deprecated": "error"
}
},
{
"files": ["packages/cloud/src/server/**/*.ts"],
"rules": {
"@open-pencil/data/no-raw-sql": "error",
"@open-pencil/security/no-dynamic-html": "error"
}
},
{
"files": ["packages/cloud/src/server/**/*.ts", "packages/cloud/src/admin/**/*.ts"],
"rules": {
"@open-pencil/security/no-unvalidated-route-params": "error"
}
},
{
"files": ["packages/core/src/canvas/sksl/compile.ts"],
"rules": {
"@open-pencil/data/no-raw-runtime-effect": "off"
}
},
{
"files": ["packages/feedback/src/**/*.ts"],
"rules": {
"@open-pencil/data/no-raw-sql": "error"
}
},
{
"files": [
"packages/cloud/src/server/db/expressions.ts",
"packages/cloud/src/server/db/migrate.ts",
"packages/cloud/src/server/db/migrations/**/*.ts"
],
"rules": {
"@open-pencil/data/no-raw-sql": "off"
}
},
{
"files": [
"packages/cloud/src/**/*.ts",
"src/app/cloud/**/*.ts",
"src/app/collab/**/*.ts",
"src/app/integrations/storage/cloud/**/*.ts"
],
"rules": {
"@open-pencil/security/no-secret-in-query": "error",
"@open-pencil/security/no-secret-logging": "error"
}
},
{
"files": ["tools/ci/policy/src/**/*.ts"],
"rules": {
"@open-pencil/data/prefer-es-toolkit": "off"
}
},
{
"files": ["packages/oxlint-plugin/src/rules/quality/widen-then-assert.ts"],
"rules": {
"complexity": "off"
}
},
{
"files": [
"tools/checks/lint/src/**/*.ts",
"tools/checks/lint/tests/**/*.ts",
"packages/oxlint-plugin/src/**/*.ts",
"packages/oxlint-plugin/tests/**/*.ts"
],
"rules": {
"@open-pencil/test-ids/no-generated-literals": "off",
"@open-pencil/data/no-hardcoded-color-constants": "off",
"@open-pencil/structure/no-mixed-case-acronym-identifiers": "off"
}
},
{
"files": ["src/**/*.ts", "packages/*/src/**/*.ts"],
"rules": {
"@open-pencil/structure/no-useless-pass-through-wrappers": "error"
}
},
{
"files": ["**/*.{ts,vue}"],
"rules": {
"@open-pencil/data/no-unvalidated-json-parse": "error"
}
},
{
"files": ["src/**/*.{ts,vue}", "packages/*/src/**/*.{ts,vue}"],
"rules": {
"@open-pencil/data/valibot-schema-conventions": [
"error",
{
"schemaModules": ["/packages/cloud/src/contract/"]
}
]
}
},
{
"files": ["tools/*/*/src/**/*.ts"],
"rules": {
"@open-pencil/data/valibot-schema-conventions": [
"error",
{
"placement": false
}
]
}
},
{
"files": [
"src/**/*.{ts,vue}",
"packages/{scene-graph,pen,kiwi,fig,core,dom-css,vue}/src/**/*.{ts,vue}",
"packages/cloud/src/{client,contract}/**/*.ts"
],
"rules": {
"compat/compat": "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/**",
"packages/cloud/src/runtime/node/**",
"packages/cloud/tests/e2e/**"
],
"rules": {
"no-console": "off"
}
},
{
"files": ["packages/cli/src/commands/**"],
"rules": {
"@open-pencil/runtime/no-raw-console-format": "error"
}
},
{
"files": [
"tests/e2e/perf/basic.spec.ts",
"tests/e2e/viewport/zoom-pan.spec.ts",
"packages/core/tests/canvas/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/data/no-hardcoded-color-constants": "off"
}
},
{
"files": ["packages/scene-graph/src/images.ts"],
"rules": {
"@open-pencil/data/no-hand-rolled-data-url": "off"
}
},
{
"files": ["packages/scene-graph/src/index.ts"],
"rules": {
"@open-pencil/editor/no-direct-graph-emitter-subscriptions": "off"
}
},
{
"files": [
"packages/core/src/io/formats/fig/export/index.ts",
"packages/core/src/io/formats/fig/export/worker.ts",
"packages/core/src/kiwi/fig/parse/worker.ts",
"src/app/code/sandbox/frame.ts",
"src/app/code/sandbox/worker/index.ts"
],
"rules": {
"unicorn/require-post-message-target-origin": "off"
}
},
{
"files": ["src/app/code/sandbox/evaluate.ts", "src/app/code/sandbox/frame.ts"],
"rules": {
"import/default": "off"
}
}
]
}