Ctrl K
ComunidadGuías…

oxlint.json

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
{
  "$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"
      }
    }
  ]
}