@longzai-intelligence-oxlint/presets 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ import"./rolldown-runtime-BqT_7tdF.js";import"./rolldown-runtime-BqT_7tdF-BqT_7tdF.js";import"./rolldown-runtime-BqT_7tdF-DsHBzDG-.js";import"./rolldown-runtime-BqT_7tdF-BT7sSRF3.js";import{i as e,n as t}from"./typescript-eslint.rules-j0Y80OGu.js";import{existsSync as n,readFileSync as r}from"node:fs";import{dirname as i,join as a}from"node:path";import{fileURLToPath as o}from"node:url";import{VITEST_CONFIG_EXPORT_NAMES as s}from"@longzai-intelligence-vitest/config/meta";const c=[`!lzi-*.config.ts`,`!lzi-*.config.mts`];function l(e){return[...e.filter(e=>!c.includes(e)),...c]}const u=[{files:[`**/*.d.ts`],rules:{"typescript/consistent-type-definitions":`off`}},{files:[`**/*.tsx`],rules:{"max-lines-per-function":[`error`,{max:100,skipBlankLines:!0,skipComments:!0}]}},{files:[`**/*.test.ts`,`**/*.test.tsx`,`**/*.spec.ts`,`**/*.spec.tsx`,`test/**/*.ts`,`test/**/*.tsx`,`**/__tests__/**/*.ts`,`**/__tests__/**/*.tsx`,`**/__mocks__/**/*.ts`,`**/__mocks__/**/*.tsx`,`**/vitest.setup.ts`],rules:{"max-lines":[`error`,{max:750,skipBlankLines:!0,skipComments:!0}],"max-lines-per-function":`off`,"@longzai-intelligence-oxlint/typescript-eslint-plugin/consistent-type-assertions":`off`,"typescript/no-non-null-assertion":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-tsdoc":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-param":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-returns":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-description":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-param-description":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-returns-description":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-type-param":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-description-tag":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/param-hyphen-format":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-blank-line-before-tags":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/separator-format":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/todo-format":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-throws":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-throws-type":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-deprecated-alternative":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-legacy-jsdoc-tags":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-placeholder-description":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-commented-code":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-multiline-property-comment":`off`}},{files:[`**/lzi-kol-markdown.config.ts`,`**/lzi-rss-markdown.config.ts`,`**/lzi-nation-data.config.ts`,`**/lzi-youtube.config.ts`,`**/lzi-task.config.ts`,`**/lzi-okr.config.ts`,`**/lzi-roadmap.config.ts`],rules:{"@longzai-intelligence-oxlint/lzi-config-plugin/require-define-config":`off`}},{files:[`**/__tests__/helpers/setup.ts`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":`off`}},{files:[`**/scripts/**`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":`off`}}],d=[{shortName:`code-style`,packageName:`@longzai-intelligence-oxlint/code-style-plugin`},{shortName:`composer`,packageName:`@longzai-intelligence-oxlint/composer-plugin`},{shortName:`design-rules`,packageName:`@longzai-intelligence-oxlint/design-rules-plugin`},{shortName:`package-json`,packageName:`@longzai-intelligence-oxlint/package-json-plugin`},{shortName:`schema-type-separation`,packageName:`@longzai-intelligence-oxlint/schema-type-separation-plugin`},{shortName:`architecture-core`,packageName:`@longzai-intelligence-oxlint/architecture-core-plugin`},{shortName:`architecture-library`,packageName:`@longzai-intelligence-oxlint/architecture-library-plugin`},{shortName:`react`,packageName:`@longzai-intelligence-oxlint/react-plugin`},{shortName:`tsdoc`,packageName:`@longzai-intelligence-oxlint/tsdoc-plugin`},{shortName:`stylistic`,packageName:`@longzai-intelligence-oxlint/stylistic-plugin`},{shortName:`perfectionist`,packageName:`@longzai-intelligence-oxlint/perfectionist-plugin`},{shortName:`typescript-eslint`,packageName:`@longzai-intelligence-oxlint/typescript-eslint-plugin`},{shortName:`typeorm`,packageName:`@longzai-intelligence-oxlint/typeorm-plugin`},{shortName:`zod`,packageName:`@longzai-intelligence-oxlint/zod-plugin`},{shortName:`file-naming`,packageName:`@longzai-intelligence-oxlint/file-naming-plugin`},{shortName:`tsconfig`,packageName:`@longzai-intelligence-oxlint/tsconfig-plugin`},{shortName:`eslint-config`,packageName:`@longzai-intelligence-oxlint/eslint-config-plugin`},{shortName:`lzi-builder-config`,packageName:`@longzai-intelligence-oxlint/lzi-builder-config-plugin`},{shortName:`lzi-config`,packageName:`@longzai-intelligence-oxlint/lzi-config-plugin`},{shortName:`tsdown-config`,packageName:`@longzai-intelligence-oxlint/tsdown-config-plugin`},{shortName:`tsup-config`,packageName:`@longzai-intelligence-oxlint/tsup-config-plugin`},{shortName:`vitest-config`,packageName:`@longzai-intelligence-oxlint/vitest-config-plugin`},{shortName:`architecture-electron`,packageName:`@longzai-intelligence-oxlint/architecture-electron-plugin`},{shortName:`elysia-route`,packageName:`@longzai-intelligence-oxlint/elysia-route-plugin`},{shortName:`nestjs-route`,packageName:`@longzai-intelligence-oxlint/nestjs-route-plugin`}],f=[`code-style`,`composer`,`design-rules`,`package-json`,`schema-type-separation`,`architecture-core`,`architecture-library`,`react`,`tsdoc`,`stylistic`,`perfectionist`,`typescript-eslint`,`typeorm`,`zod`,`file-naming`,`tsconfig`,`eslint-config`,`lzi-builder-config`,`lzi-config`,`tsdown-config`,`tsup-config`,`vitest-config`],p=`@longzai-intelligence-oxlint/presets`;function m(e){let t=i(o(e));for(;;){let e=a(t,`package.json`);if(n(e))try{if(JSON.parse(r(e,`utf8`)).name===p)return t}catch{}let o=i(t);if(o===t)throw Error(`未能定位 \`${p}\` 包根,内置插件路径解析失败`);t=o}}const h=m(import.meta.url);function g(e){if(!d.some(t=>t.shortName===e))throw Error(`未登记的内置插件短名 \`${e}\`,请先补录 bundled-plugins 清单`);return a(h,`dist`,`plugins`,`${e}.js`)}function _(){return f.map(e=>g(e))}const v=_(),y={"import/no-relative-parent-imports":`error`},b={"@longzai-intelligence-oxlint/tsup-config-plugin/require-tsup-config-import":[`error`,{configPackagePath:`@longzai-intelligence-config/core/tsup`}],"@longzai-intelligence-oxlint/tsdown-config-plugin/require-tsdown-config-import":[`error`,{configPackagePath:`@longzai-intelligence-tsdown/core`,correctPresetNames:[`defineDomainImplementationConfig`,`defineDomainContractConfig`,`defineSharedKernelConfig`,`defineReactComponentsConfig`,`defineConfigPackageConfig`,`definePackageConfig`]}],"@longzai-intelligence-oxlint/vitest-config-plugin/require-vitest-config-import":[`error`,{configPackagePaths:[`@longzai-intelligence-config/core/vitest`,`@longzai-intelligence-vitest/config`],allowedExportNames:s,forbiddenExportNames:[`defineConfig`],excludedPaths:[`infrastructure/configs/vitest/vitest.config.ts`]}],"@longzai-intelligence-oxlint/eslint-config-plugin/require-eslint-config-import":[`error`,{configPackagePath:`@longzai-intelligence-config/core/eslint`,allowedCreateFunctions:[`createLibraryConfig`,`createDomainConfig`,`createReactConfig`,`createReactPluginConfig`,`createElectronConfig`,`createNextConfig`,`createNodeConfig`,`createMcpConfig`,`createNestConfig`,`createHonoConfig`,`createExpoConfig`],forbiddenDefaultExports:[`coreConfig`,`createCoreConfig`,`libraryConfig`,`domainConfig`,`reactConfig`,`electronConfig`,`nextConfig`,`nodeConfig`,`mcpConfig`,`nestConfig`,`honoConfig`,`expoConfig`]}]},x={"@longzai-intelligence-oxlint/architecture-core-plugin/business-leak":`off`,"@longzai-intelligence-oxlint/architecture-core-plugin/no-cross-package-relative-import":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/implementation-export-control":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/no-implementation-import-in-apps":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/domain-export-compliance":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/dependency-direction":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/no-raw-network-call-in-ui":`error`},S={"@longzai-intelligence-oxlint/code-style-plugin/no-inline-type-definition":`error`,"@longzai-intelligence-oxlint/code-style-plugin/prefer-split-export-const":`off`,"@longzai-intelligence-oxlint/code-style-plugin/require-interface-naming":`off`,"@longzai-intelligence-oxlint/code-style-plugin/require-dto-naming":`error`,"@longzai-intelligence-oxlint/code-style-plugin/require-class-suffix":`error`,"@longzai-intelligence-oxlint/code-style-plugin/no-class-suffix-alias":`error`,"@longzai-intelligence-oxlint/code-style-plugin/no-console":`error`,"@longzai-intelligence-oxlint/code-style-plugin/no-handwritten-shebang":`error`},C={"@longzai-intelligence-oxlint/composer-plugin/define-capability-validity":`error`,"@longzai-intelligence-oxlint/composer-plugin/inject-graph-acyclic":`error`},w={"@longzai-intelligence-oxlint/design-rules-plugin/no-hardcoded-color":`error`,"@longzai-intelligence-oxlint/design-rules-plugin/no-hardcoded-spacing":`error`,"@longzai-intelligence-oxlint/design-rules-plugin/no-magic-z-index":`error`},T={"@longzai-intelligence-oxlint/eslint-config-plugin/require-eslint-config-import":`error`},E={"@longzai-intelligence-oxlint/file-naming-plugin/file-naming":`error`,"@longzai-intelligence-oxlint/file-naming-plugin/require-type-naming":`error`,"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":`error`},D={"@longzai-intelligence-oxlint/lzi-builder-config-plugin/require-bin-banner":`error`,"@longzai-intelligence-oxlint/lzi-builder-config-plugin/require-version-injection":`error`},O={"@longzai-intelligence-oxlint/lzi-config-plugin/no-empty-define-config":`error`,"@longzai-intelligence-oxlint/lzi-config-plugin/require-define-config":`error`},k={"@longzai-intelligence-oxlint/package-json-plugin/no-app-infrastructure-dependency":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-bare-tsgo-invocation":`warn`,"@longzai-intelligence-oxlint/package-json-plugin/no-domain-layer-subpath-export":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-hoistable-dev-dependency":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-mit-license":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-sibling-implementation-dependency":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-src-exports":`warn`,"@longzai-intelligence-oxlint/package-json-plugin/no-ui-domain-package-dependency":`error`,"@longzai-intelligence-oxlint/package-json-plugin/require-full-project-bin-name":`warn`},A={"@longzai-intelligence-oxlint/perfectionist-plugin/sort-imports":`error`,"@longzai-intelligence-oxlint/perfectionist-plugin/sort-named-imports":`error`},j={"@longzai-intelligence-oxlint/react-plugin/no-incorrect-hook-naming":`error`},M={"@longzai-intelligence-oxlint/schema-type-separation-plugin/no-type-in-schema":`off`,"@longzai-intelligence-oxlint/schema-type-separation-plugin/no-schema-in-types":`off`},N={"@longzai-intelligence-oxlint/stylistic-plugin/multiline-comment-style":`error`,"@longzai-intelligence-oxlint/stylistic-plugin/lines-around-comment":[`error`,{beforeBlockComment:!0,beforeLineComment:!1,allowBlockStart:!0,allowBlockEnd:!0,allowObjectStart:!0,allowObjectEnd:!0,allowArrayStart:!0,allowArrayEnd:!0,allowClassStart:!0,allowClassEnd:!0,allowInterfaceStart:!0,allowInterfaceEnd:!0,allowTypeStart:!0,allowTypeEnd:!0,allowEnumStart:!0,allowEnumEnd:!0,allowModuleStart:!0,allowModuleEnd:!0}],"@longzai-intelligence-oxlint/stylistic-plugin/padding-line-between-statements":`error`},P={"@longzai-intelligence-oxlint/tsconfig-plugin/tsconfig-references":`error`},F={"@longzai-intelligence-oxlint/tsdoc-plugin/require-tsdoc":[`error`,{checkAllVariables:!0}],"@longzai-intelligence-oxlint/tsdoc-plugin/require-param":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-returns":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-description":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-param-description":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-returns-description":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-type-param":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-description-tag":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/param-hyphen-format":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-blank-line-before-tags":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/separator-format":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/todo-format":`warn`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-throws":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-throws-type":`warn`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-deprecated-alternative":`warn`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-legacy-jsdoc-tags":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-placeholder-description":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-commented-code":`warn`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-extra-param":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-multiline-property-comment":`error`},I={"@longzai-intelligence-oxlint/tsdown-config-plugin/require-tsdown-config-import":`error`},L={"@longzai-intelligence-oxlint/tsup-config-plugin/require-tsup-config-import":`error`},R={"@longzai-intelligence-oxlint/typeorm-plugin/no-string-entity-ref":`error`,"@longzai-intelligence-oxlint/typeorm-plugin/require-take-with-skip":`error`},z={"@longzai-intelligence-oxlint/typescript-eslint-plugin/consistent-type-assertions":`error`},B={"@longzai-intelligence-oxlint/vitest-config-plugin/require-vitest-config-import":`error`},V={"@longzai-intelligence-oxlint/zod-plugin/prefer-top-level-string-formats":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-int":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-finite":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-safe":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-step":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-is-finite":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-is-int":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-record-single-arg":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-deprecated-error-params":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-deprecated-format-methods":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-merge-method":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-superrefine":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-errors-property":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-deprecated-object-methods":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-native-enum":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-deep-partial":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-promise-schema":`error`,"@longzai-intelligence-oxlint/zod-plugin/prefer-error-param":`error`,"@longzai-intelligence-oxlint/zod-plugin/prefer-zod-namespace":`warn`,"@longzai-intelligence-oxlint/zod-plugin/consistent-schema-var-name":`warn`,"@longzai-intelligence-oxlint/zod-plugin/no-any-schema":`warn`,"@longzai-intelligence-oxlint/zod-plugin/no-throw-in-refine":`warn`,"@longzai-intelligence-oxlint/zod-plugin/prefer-safe-parse":`warn`,"@longzai-intelligence-oxlint/zod-plugin/prefer-meta":`warn`,"@longzai-intelligence-oxlint/zod-plugin/require-error-message":`warn`,"@longzai-intelligence-oxlint/zod-plugin/no-optional-and-default-together":`error`,"@longzai-intelligence-oxlint/zod-plugin/prefer-enum-over-literal-union":`error`},H={...S,...C,...w,...k,...M,...x,...j,...F,...N,...A,...z,...R,...V,...E,...P,...T,...D,...O,...I,...L,...B},U={"@longzai-intelligence-oxlint/perfectionist-plugin/sort-imports":`off`,"@longzai-intelligence-oxlint/perfectionist-plugin/sort-named-imports":`off`,"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":`error`,"@longzai-intelligence-oxlint/zod-plugin/prefer-top-level-string-formats":`off`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-int":`off`},W={...t,...y,...H,...b,...U};function G(t){return e({rules:{...W,...t?.rules},overrides:[...u,...t?.overrides??[]],jsPlugins:[...v],ignorePatterns:l(t?.ignorePatterns??[])})}const K=G();export{g as a,H as i,K as n,l as o,W as r,G as t};
package/dist/base.js CHANGED
@@ -1 +1 @@
1
- export{n as default,t as defineConfig}from"./base.entry-CKst6rs9.js";
1
+ export{n as default,t as defineConfig}from"./base.entry-BRRJVhQW.js";
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{a as e,o as t}from"./base.entry-CKst6rs9.js";import{defineConfig as n}from"./react.js";const r=[{files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/architecture-electron-plugin/no-custom-ipc-utility":`error`,"@longzai-intelligence-oxlint/architecture-electron-plugin/no-implementation-in-renderer":`error`,"@longzai-intelligence-oxlint/architecture-electron-plugin/platform-leak":`error`}}];function i(i){let a=n();return{extends:[a],jsPlugins:[e(`architecture-electron`)],overrides:[...r,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:t([...a.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{a as n,i as t};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{a as e,o as t}from"./base.entry-BRRJVhQW.js";import{defineConfig as n}from"./react.js";const r=[{files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/architecture-electron-plugin/no-custom-ipc-utility":`error`,"@longzai-intelligence-oxlint/architecture-electron-plugin/no-implementation-in-renderer":`error`,"@longzai-intelligence-oxlint/architecture-electron-plugin/platform-leak":`error`}}];function i(i){let a=n();return{extends:[a],jsPlugins:[e(`architecture-electron`)],overrides:[...r,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:t([...a.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{a as n,i as t};
package/dist/electron.js CHANGED
@@ -1 +1 @@
1
- import"./react.js";export{n as default,t as defineConfig}from"./electron.entry-D826gIzo.js";
1
+ import"./react.js";export{n as default,t as defineConfig}from"./electron.entry-DGTGFrW5.js";
package/dist/elysia.js CHANGED
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{a as e,o as t,t as n}from"./base.entry-CKst6rs9.js";import"./node.js";const r=[{files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/elysia-route-plugin/no-bare-route-path":`error`}}];function i(i){let a=n();return{extends:[a],jsPlugins:[e(`elysia-route`)],overrides:[...r,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:t([...a.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{a as default,i as defineConfig};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{a as e,o as t,t as n}from"./base.entry-BRRJVhQW.js";import"./node.js";const r=[{files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/elysia-route-plugin/no-bare-route-path":`error`}}];function i(i){let a=n();return{extends:[a],jsPlugins:[e(`elysia-route`)],overrides:[...r,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:t([...a.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{a as default,i as defineConfig};
package/dist/expo.js CHANGED
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";export{n as default,t as defineConfig}from"./base.entry-CKst6rs9.js";
1
+ import"./rolldown-runtime-BqT_7tdF.js";export{n as default,t as defineConfig}from"./base.entry-BRRJVhQW.js";
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{o as e}from"./base.entry-CKst6rs9.js";import{defineConfig as t}from"./react.js";const n=[`app/routes.ts`,`app/routes/**`],r=[`app/root.tsx`,`app/routes/**`];function i(i){let a=[...i?.typeSuffixBaseSkipPatterns??[],...n],o=[...i?.fileNamingBaseSkipPatterns??[],...r],s={files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":[`error`,{skipPatterns:a}]}},c={files:[`**/*.tsx`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/file-naming":[`error`,{skipPatterns:o}]}},l=t();return{extends:[l],overrides:[s,c,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:e([...l.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{n as i,a as n,r,i as t};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{o as e}from"./base.entry-BRRJVhQW.js";import{defineConfig as t}from"./react.js";const n=[`app/routes.ts`,`app/routes/**`],r=[`app/root.tsx`,`app/routes/**`];function i(i){let a=[...i?.typeSuffixBaseSkipPatterns??[],...n],o=[...i?.fileNamingBaseSkipPatterns??[],...r],s={files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":[`error`,{skipPatterns:a}]}},c={files:[`**/*.tsx`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/file-naming":[`error`,{skipPatterns:o}]}},l=t();return{extends:[l],overrides:[s,c,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:e([...l.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{n as i,a as n,r,i as t};
package/dist/fumadocs.js CHANGED
@@ -1 +1 @@
1
- import"./react.js";export{r as FUMADOCS_FILE_NAMING_EXEMPT_PATTERNS,i as FUMADOCS_SPECIAL_FILE_PATTERNS,n as default,t as defineConfig}from"./fumadocs.entry-Dgs-WlgF.js";
1
+ import"./react.js";export{r as FUMADOCS_FILE_NAMING_EXEMPT_PATTERNS,i as FUMADOCS_SPECIAL_FILE_PATTERNS,n as default,t as defineConfig}from"./fumadocs.entry-oZq7iczh.js";
package/dist/hono.js CHANGED
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";export{n as default,t as defineConfig}from"./base.entry-CKst6rs9.js";import"./node.js";
1
+ import"./rolldown-runtime-BqT_7tdF.js";export{n as default,t as defineConfig}from"./base.entry-BRRJVhQW.js";import"./node.js";
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{n as e,r as t,t as n}from"./typescript-eslint.rules-j0Y80OGu.js";import{i as r,r as i,t as a}from"./base.entry-CKst6rs9.js";import"./node.js";import{defineConfig as o}from"./react.js";import"./hono.js";import"./mcp.js";import{r as s,t as c}from"./next.entry-B3GfPoY8.js";import{t as l}from"./taro.entry-DV-L1NDJ.js";import{i as u,r as d,t as f}from"./fumadocs.entry-Dgs-WlgF.js";import"./expo.js";import{t as p}from"./nest.entry-Ch6PVI2A.js";import{t as m}from"./electron.entry-D826gIzo.js";import{t as h}from"./library.entry-mehEApZl.js";import{n as g,t as _}from"./unicorn.rules-0a_FuIjL.js";export{i as ALL_RULES,g as ESLINT_CORE_RULES,n as ESLINT_RECOMMENDED_RULES,d as FUMADOCS_FILE_NAMING_EXEMPT_PATTERNS,u as FUMADOCS_SPECIAL_FILE_PATTERNS,s as NEXTJS_SPECIAL_FILE_PATTERNS,r as PLUGIN_DEFAULTS,e as TYPESCRIPT_PROJECT_RULES,t as TYPESCRIPT_RECOMMENDED_RULES,_ as UNICORN_RULES,a as defineBaseConfig,a as defineExpoConfig,a as defineHonoConfig,a as defineMcpConfig,a as defineNodeConfig,m as defineElectronConfig,f as defineFumadocsConfig,h as defineLibraryConfig,p as defineNestConfig,c as defineNextConfig,o as defineReactConfig,l as defineTaroConfig};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{n as e,r as t,t as n}from"./typescript-eslint.rules-j0Y80OGu.js";import{i as r,r as i,t as a}from"./base.entry-BRRJVhQW.js";import"./node.js";import{defineConfig as o}from"./react.js";import"./hono.js";import"./mcp.js";import{r as s,t as c}from"./next.entry-BAw82S0g.js";import{t as l}from"./taro.entry-CHCKR0fA.js";import{i as u,r as d,t as f}from"./fumadocs.entry-oZq7iczh.js";import"./expo.js";import{t as p}from"./nest.entry-DHYBO2a1.js";import{t as m}from"./electron.entry-DGTGFrW5.js";import{t as h}from"./library.entry-CRtfr5d4.js";import{n as g,t as _}from"./unicorn.rules-0a_FuIjL.js";export{i as ALL_RULES,g as ESLINT_CORE_RULES,n as ESLINT_RECOMMENDED_RULES,d as FUMADOCS_FILE_NAMING_EXEMPT_PATTERNS,u as FUMADOCS_SPECIAL_FILE_PATTERNS,s as NEXTJS_SPECIAL_FILE_PATTERNS,r as PLUGIN_DEFAULTS,e as TYPESCRIPT_PROJECT_RULES,t as TYPESCRIPT_RECOMMENDED_RULES,_ as UNICORN_RULES,a as defineBaseConfig,a as defineExpoConfig,a as defineHonoConfig,a as defineMcpConfig,a as defineNodeConfig,m as defineElectronConfig,f as defineFumadocsConfig,h as defineLibraryConfig,p as defineNestConfig,c as defineNextConfig,o as defineReactConfig,l as defineTaroConfig};
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{a as e,o as t,t as n}from"./base.entry-CKst6rs9.js";const r={"@longzai-intelligence-oxlint/architecture-library-plugin/test-file-placement":`error`,"@longzai-intelligence-oxlint/architecture-library-plugin/no-non-test-files-in-tests-directory":`error`,"@longzai-intelligence-oxlint/architecture-library-plugin/test-file-matches-source":`error`},i={"@longzai-intelligence-oxlint/architecture-library-plugin/test-file-matches-source":[`error`,{testTypeSubdirs:[`unit`,`integration`,`e2e`],enableGlobalSearch:!0}]};function a(a){let o={files:[`**/*.ts`],rules:{...r,...i,...a?.rules}},s=n();return{extends:[s],jsPlugins:[e(`architecture-library`)],overrides:[o,...a?.overrides??[]],ignorePatterns:t([...s.ignorePatterns??[],...a?.ignorePatterns??[]])}}const o=a();export{o as n,a as t};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{a as e,o as t,t as n}from"./base.entry-BRRJVhQW.js";const r={"@longzai-intelligence-oxlint/architecture-library-plugin/test-file-placement":`error`,"@longzai-intelligence-oxlint/architecture-library-plugin/no-non-test-files-in-tests-directory":`error`,"@longzai-intelligence-oxlint/architecture-library-plugin/test-file-matches-source":`error`},i={"@longzai-intelligence-oxlint/architecture-library-plugin/test-file-matches-source":[`error`,{testTypeSubdirs:[`unit`,`integration`,`e2e`],enableGlobalSearch:!0}]};function a(a){let o={files:[`**/*.ts`],rules:{...r,...i,...a?.rules}},s=n();return{extends:[s],jsPlugins:[e(`architecture-library`)],overrides:[o,...a?.overrides??[]],ignorePatterns:t([...s.ignorePatterns??[],...a?.ignorePatterns??[]])}}const o=a();export{o as n,a as t};
package/dist/library.js CHANGED
@@ -1 +1 @@
1
- export{n as default,t as defineConfig}from"./library.entry-mehEApZl.js";
1
+ export{n as default,t as defineConfig}from"./library.entry-CRtfr5d4.js";
package/dist/mcp.js CHANGED
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";export{n as default,t as defineConfig}from"./base.entry-CKst6rs9.js";import"./node.js";
1
+ import"./rolldown-runtime-BqT_7tdF.js";export{n as default,t as defineConfig}from"./base.entry-BRRJVhQW.js";import"./node.js";
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{a as e,o as t,t as n}from"./base.entry-CKst6rs9.js";import"./node.js";const r=[{files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/nestjs-route-plugin/order":`error`,"@longzai-intelligence-oxlint/nestjs-route-plugin/no-duplicates":`error`,"@longzai-intelligence-oxlint/nestjs-route-plugin/require-route-constant":`error`,"@longzai-intelligence-oxlint/nestjs-route-plugin/prefer-typed-controller":`warn`,"@longzai-intelligence-oxlint/nestjs-route-plugin/require-typed-response":`error`,"@longzai-intelligence-oxlint/nestjs-route-plugin/enforce-typed-handler-return":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/no-restricted-import-in-paths":[`error`,{restrictions:[{importSource:`@nestjs/common`,importNames:[`BadRequestException`,`NotFoundException`,`ForbiddenException`,`UnauthorizedException`,`ConflictException`,`HttpException`],forbiddenPaths:[`*.service.ts`],message:`Service 层禁止导入 NestJS HTTP 异常,请使用 Result<T, DomainError> 透传领域错误,由 Handler 层解包`}]}]}}];function i(i){let a=n();return{extends:[a],jsPlugins:[e(`nestjs-route`)],overrides:[...r,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:t([...a.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{a as n,i as t};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{a as e,o as t,t as n}from"./base.entry-BRRJVhQW.js";import"./node.js";const r=[{files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/nestjs-route-plugin/order":`error`,"@longzai-intelligence-oxlint/nestjs-route-plugin/no-duplicates":`error`,"@longzai-intelligence-oxlint/nestjs-route-plugin/require-route-constant":`error`,"@longzai-intelligence-oxlint/nestjs-route-plugin/prefer-typed-controller":`warn`,"@longzai-intelligence-oxlint/nestjs-route-plugin/require-typed-response":`error`,"@longzai-intelligence-oxlint/nestjs-route-plugin/enforce-typed-handler-return":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/no-restricted-import-in-paths":[`error`,{restrictions:[{importSource:`@nestjs/common`,importNames:[`BadRequestException`,`NotFoundException`,`ForbiddenException`,`UnauthorizedException`,`ConflictException`,`HttpException`],forbiddenPaths:[`*.service.ts`],message:`Service 层禁止导入 NestJS HTTP 异常,请使用 Result<T, DomainError> 透传领域错误,由 Handler 层解包`}]}]}}];function i(i){let a=n();return{extends:[a],jsPlugins:[e(`nestjs-route`)],overrides:[...r,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:t([...a.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{a as n,i as t};
package/dist/nest.js CHANGED
@@ -1 +1 @@
1
- import"./node.js";export{n as default,t as defineConfig}from"./nest.entry-Ch6PVI2A.js";
1
+ import"./node.js";export{n as default,t as defineConfig}from"./nest.entry-DHYBO2a1.js";
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{o as e}from"./base.entry-CKst6rs9.js";import{defineConfig as t}from"./react.js";const n=[`**/page.ts`,`**/layout.ts`,`**/loading.ts`,`**/error.ts`,`**/not-found.ts`,`**/template.ts`,`**/default.ts`,`**/global-error.ts`,`**/middleware.ts`,`**/route.ts`,`**/instrumentation.ts`],r=[`**/page.tsx`,`**/layout.tsx`,`**/loading.tsx`,`**/error.tsx`,`**/not-found.tsx`,`**/template.tsx`,`**/default.tsx`,`**/global-error.tsx`],i=[...n,...r];function a(n){let r=[...n?.typeSuffixBaseSkipPatterns??[],...i],a=[...n?.fileNamingBaseSkipPatterns??[],...i],o={files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":[`error`,{skipPatterns:r}]}},s={files:[`**/*.tsx`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/file-naming":[`error`,{skipPatterns:a}]}},c=t();return{extends:[c],plugins:[`nextjs`],overrides:[o,s,...n?.overrides??[]],...n?.rules?{rules:n.rules}:{},ignorePatterns:e([...c.ignorePatterns??[],...n?.ignorePatterns??[]])}}const o=a();export{o as n,i as r,a as t};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{o as e}from"./base.entry-BRRJVhQW.js";import{defineConfig as t}from"./react.js";const n=[`**/page.ts`,`**/layout.ts`,`**/loading.ts`,`**/error.ts`,`**/not-found.ts`,`**/template.ts`,`**/default.ts`,`**/global-error.ts`,`**/middleware.ts`,`**/route.ts`,`**/instrumentation.ts`],r=[`**/page.tsx`,`**/layout.tsx`,`**/loading.tsx`,`**/error.tsx`,`**/not-found.tsx`,`**/template.tsx`,`**/default.tsx`,`**/global-error.tsx`],i=[...n,...r];function a(n){let r=[...n?.typeSuffixBaseSkipPatterns??[],...i],a=[...n?.fileNamingBaseSkipPatterns??[],...i],o={files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":[`error`,{skipPatterns:r}]}},s={files:[`**/*.tsx`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/file-naming":[`error`,{skipPatterns:a}]}},c=t();return{extends:[c],plugins:[`nextjs`],overrides:[o,s,...n?.overrides??[]],...n?.rules?{rules:n.rules}:{},ignorePatterns:e([...c.ignorePatterns??[],...n?.ignorePatterns??[]])}}const o=a();export{o as n,i as r,a as t};
package/dist/next.js CHANGED
@@ -1 +1 @@
1
- import"./react.js";export{r as NEXTJS_SPECIAL_FILE_PATTERNS,n as default,t as defineConfig}from"./next.entry-B3GfPoY8.js";
1
+ import"./react.js";export{r as NEXTJS_SPECIAL_FILE_PATTERNS,n as default,t as defineConfig}from"./next.entry-BAw82S0g.js";
package/dist/node.js CHANGED
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";export{n as default,t as defineConfig}from"./base.entry-CKst6rs9.js";
1
+ import"./rolldown-runtime-BqT_7tdF.js";export{n as default,t as defineConfig}from"./base.entry-BRRJVhQW.js";
@@ -1 +1 @@
1
- import"../rolldown-runtime-BqT_7tdF.js";import{defineRule as e,eslintCompatPlugin as t}from"@oxlint/plugins";import*as n from"zod/mini";const r=[`/packages/platform/`,`/packages/ui/`,`/packages/ui-kit/`,`/packages/engine/`,`/packages/utils/`,`/packages/types/`],i=[],a=[`^validate`,`^calculate`,`^compute`,`^determine`,`^check`,`^can`,`^should`,`^isAllowed`,`^isPermitted`,`^hasPermission`,`^applyRule`,`^enforce`,`^execute`];function o(e){return typeof e==`object`&&!!e}function s(e){let t=Array.isArray(e)?e[0]:e;return o(t)?{techLayerPatterns:t.techLayerPatterns??r,businessKeywords:t.businessKeywords??i,businessRuleMethods:t.businessRuleMethods??a}:{techLayerPatterns:r,businessKeywords:i,businessRuleMethods:a}}function c(e){return e.map(e=>new RegExp(e))}function ee(e,t){let n=e.replace(/\\/g,`/`);return t.some(e=>e.test(n))}function l(e,t){let n=e.charAt(0).toUpperCase()+e.slice(1);return t.some(e=>n.includes(e))}function u(e,t){return t.some(t=>t.test(e))}const te=e({meta:{type:`suggestion`,docs:{description:`检测技术层中可能存在的业务逻辑`}},createOnce(e){let t=[],n=[],r=[];return{before(){let i=s(e.options);return t=c(i.techLayerPatterns),n=i.businessKeywords,r=c(i.businessRuleMethods),ee(e.filename,t)?void 0:!1},ClassDeclaration(t){t.id&&l(t.id.name,n)&&e.report({node:t,message:`业务逻辑泄漏嫌疑: 技术层发现业务相关类 '${t.id.name}'。业务逻辑应该放在 domains/ 层。`})},MethodDefinition(t){t.key.type===`Identifier`&&u(t.key.name,r)&&e.report({node:t,message:`业务逻辑泄漏嫌疑: 技术层发现业务规则方法 '${t.key.name}'。业务规则应该放在 domains/ 层。`})},TSInterfaceDeclaration(t){l(t.id.name,n)&&e.report({node:t,message:`业务逻辑泄漏嫌疑: 技术层发现业务相关接口 '${t.id.name}'。业务接口应该放在 domains/ 层。`})},TSTypeAliasDeclaration(t){l(t.id.name,n)&&e.report({node:t,message:`业务逻辑泄漏嫌疑: 技术层发现业务相关类型 '${t.id.name}'。业务类型应该放在 domains/ 层。`})}}}}),d={types:0,utils:1,"shared-kernel":2,contract:3,engine:4,platform:5,infrastructure:6,implementation:6,domain:6,capability:7,ui:7,"electron-shared":7,"electron-main":8,"electron-preload":8,"electron-renderer":9},ne={types:`类型层 (Types)`,utils:`工具层 (Utils)`,"shared-kernel":`共享内核层 (Shared Kernel)`,contract:`契约层 (Contract)`,engine:`引擎层 (Engine)`,platform:`平台层 (Platform)`,infrastructure:`基础设施层 (Infrastructure)`,implementation:`实现层 (Implementation)`,domain:`门面层 (Domain Facade)`,capability:`能力装配层 (Capability)`,ui:`UI 表现层`,"electron-shared":`Electron 共享层 (Shared)`,"electron-main":`Electron 主进程 (Main)`,"electron-preload":`Electron 预加载层 (Preload)`,"electron-renderer":`Electron 渲染进程 (Renderer)`},f=new Set(Object.keys(d)),p={pathPatterns:[{pattern:/\/apps\/capabilities\//,layer:`capability`},{pattern:/\/domains\/[^/]+\/implementation\//,layer:`implementation`},{pattern:/\/domains\/[^/]+\/contract\//,layer:`contract`},{pattern:/\/domains\/[^/]+\/ui\//,layer:`ui`},{pattern:/\/domains\/shared-kernel\//,layer:`shared-kernel`},{pattern:/\/infrastructure\//,layer:`infrastructure`}],packagePrefix:``,specialPackageMappings:{},packageSuffixMappings:[{suffix:`-contract`,layer:`contract`},{suffix:`-implementation`,layer:`implementation`},{suffix:`-infrastructure`,layer:`infrastructure`},{suffix:`-domain`,layer:`domain`},{suffix:`-ui`,layer:`ui`},{suffix:`-engine`,layer:`engine`},{suffix:`-runtime`,layer:`engine`}]},m=[{from:`capability`,to:`implementation`},{from:`capability`,to:`infrastructure`},{from:`ui`,to:`domain`,hint:`UI 面禁止经门面包取件,域外依赖唯一指向生成式 sdk 客户端,ADR 0127。`},{from:`ui`,to:`contract`,hint:`contract 为 DDD 主体对 UI 全封闭,类型正源为 sdk 生成契约推断类型,ADR 0127。`},{from:`ui`,to:`implementation`,hint:`UI 面禁止直连实现层,域外依赖唯一指向生成式 sdk 客户端,ADR 0127。`},{from:`ui`,to:`infrastructure`,hint:`UI 面禁止直连基础设施层,域外依赖唯一指向生成式 sdk 客户端,ADR 0127。`}],re=[`-main`],h=[{pattern:/\/src\/domain\//,layer:`contract`},{pattern:/\/src\/engine\//,layer:`engine`},{pattern:/\/src\/platform\//,layer:`platform`},{pattern:/\/src\/infrastructure\//,layer:`infrastructure`},{pattern:/\/src\/shared\//,layer:`shared-kernel`}];function g(e){return f.has(e)}function ie(e,t){return d[e]>=d[t]}function _(e){return ne[e]}function ae(e,t){let n=e.replace(/\\/g,`/`),r=t??p.pathPatterns;if(r){for(let{pattern:e,layer:t}of r)if(e.test(n))return{layer:t,priority:d[t]}}if(n.includes(`/apps/`)){for(let{pattern:e,layer:t}of h)if(e.test(n))return{layer:t,priority:d[t]}}if(n.includes(`/packages/`)){for(let{pattern:e,layer:t}of h)if(e.test(n))return{layer:t,priority:d[t]}}return null}function v(e,t){if(!e.startsWith(t))return null;let n=e.split(`/`),r=n[0]===``?n.slice(1):n;return(r[0]?.startsWith(`@`)?r[1]:r[0])??null}function y(e,t){for(let n of t)if(e.endsWith(n))return n;return null}function b(e,t){let n=t.packagePrefix??``,r=v(e,n);if(!r)return null;let i=(t.specialPackageMappings??{})[`${n}${r}`];if(i)return{layer:i,priority:d[i]};let a=t.packageSuffixMappings??[];for(let{suffix:e,layer:t}of a)if(r.endsWith(e))return{layer:t,priority:d[t]};return null}function x(e,t,n){return e.find(e=>e.from===t&&e.to===n)??null}function S(e){let t=e.match(/^\/(.+)\/([gimsuvy]*)$/);return t?.[1]?new RegExp(t[1],t[2]??``):new RegExp(e)}function C(e){let t={};if(e.pathPatterns&&(t.pathPatterns=e.pathPatterns.reduce((e,{pattern:t,layer:n})=>(g(n)&&e.push({pattern:S(t),layer:n}),e),[])),e.packagePrefix&&(t.packagePrefix=e.packagePrefix),e.specialPackageMappings){let n={};for(let[t,r]of Object.entries(e.specialPackageMappings))g(r)&&(n[t]=r);t.specialPackageMappings=Object.keys(n).length>0?n:void 0}if(e.packageSuffixMappings){let n=[];for(let{suffix:t,layer:r}of e.packageSuffixMappings)g(r)&&n.push({suffix:t,layer:r});t.packageSuffixMappings=n.length>0?n:void 0}if(e.forbiddenLayerPairs){let n=[];for(let{from:t,to:r}of e.forbiddenLayerPairs)g(t)&&g(r)&&n.push({from:t,to:r});t.forbiddenLayerPairs=n.length>0?n:void 0}if(e.forbiddenPackageSuffixes){let n=e.forbiddenPackageSuffixes.filter(e=>e.length>0);t.forbiddenPackageSuffixes=n.length>0?n:void 0}return t}function w(e){return typeof e==`object`&&!!e}function T(e){let t=C(w(e)?e:{});return{pathPatterns:t.pathPatterns??p.pathPatterns,packagePrefix:t.packagePrefix??p.packagePrefix,specialPackageMappings:t.specialPackageMappings??p.specialPackageMappings,packageSuffixMappings:t.packageSuffixMappings??p.packageSuffixMappings,forbiddenLayerPairs:[...m,...t.forbiddenLayerPairs??[]],forbiddenPackageSuffixes:[...re,...t.forbiddenPackageSuffixes??[]]}}const E=e({meta:{type:`problem`,docs:{description:`强制执行 Clean Architecture 的依赖方向规则`},schema:[{type:`object`,properties:{pathPatterns:{type:`array`,items:{type:`object`,properties:{pattern:{type:`string`},layer:{type:`string`}},required:[`pattern`,`layer`],additionalProperties:!1}},packagePrefix:{type:`string`},specialPackageMappings:{type:`object`,additionalProperties:{type:`string`}},packageSuffixMappings:{type:`array`,items:{type:`object`,properties:{suffix:{type:`string`},layer:{type:`string`}},required:[`suffix`,`layer`],additionalProperties:!1}},forbiddenLayerPairs:{type:`array`,items:{type:`object`,properties:{from:{type:`string`},to:{type:`string`}},required:[`from`,`to`],additionalProperties:!1}},forbiddenPackageSuffixes:{type:`array`,items:{type:`string`}}},additionalProperties:!1}]},createOnce(e){let t=null,n=null;return{before(){return t===null&&(t=T(e.options?.[0])),n=ae(e.filename,t.pathPatterns),n!==null},ImportDeclaration(r){if(!n||!t)return;let i=r.source.type===`Literal`&&typeof r.source.value==`string`?r.source.value:null;if(!i)return;let a=v(i,t.packagePrefix??``);if(a){let n=y(a,t.forbiddenPackageSuffixes??[]);if(n){e.report({node:r,message:`禁止导入已禁用的 ${n} 门面包,门面包统一使用 -domain 后缀。`});return}}let o=b(i,t);if(!o)return;let s=x(t.forbiddenLayerPairs??[],n.layer,o.layer);s?e.report({node:r,message:`依赖方向违规: ${n.layer} (${_(n.layer)}) 不能导入 ${o.layer} (${_(o.layer)})。${s.hint??`域内取件必须经 -domain 门面包。`}`}):ie(n.layer,o.layer)||e.report({node:r,message:`依赖方向违规: ${n.layer} (${_(n.layer)}) 不能导入 ${o.layer} (${_(o.layer)})。依赖应该从外层指向内层。`})}}}});function D(e){let t=e.replace(/\\/g,`/`);return t.includes(`/domains/`)&&t.includes(`/implementation/src/index.ts`)}function O(e){return e.endsWith(`Entity`)}function k(e){return e.endsWith(`Repository`)&&!e.startsWith(`I`)}function A(e){return e.endsWith(`OrmEntity`)}function j(e){return e.endsWith(`_ORM_ENTITIES`)}function M(e){return e.endsWith(`OrmMapper`)}function N(e){return e.endsWith(`Schema`)}function P(e){return`exportKind`in e&&typeof e.exportKind==`string`?e.exportKind===`value`:!0}function F(e){return e.exported.type===`Identifier`?e.exported.name:e.exported.type===`Literal`&&typeof e.exported.value==`string`?e.exported.value:null}function I(e,t,n){O(e)&&P(t)?n.report({node:t,message:`禁止从主入口值导出 Entity 类 "${e}"。请改为类型导出或移除导出。`}):k(e)?n.report({node:t,message:`禁止导出 Repository 类型 "${e}"。Repository 是内部实现,不应暴露给外部。`}):A(e)?n.report({node:t,message:`禁止从主入口导出 ORM 实体 "${e}"。请创建 src/typeorm.ts 入口文件,从该入口导出。`}):j(e)?n.report({node:t,message:`禁止从主入口导出 ORM 实体集合 "${e}"。请创建 src/typeorm.ts 入口文件,从该入口导出。`}):M(e)?n.report({node:t,message:`禁止导出 ORM Mapper "${e}"。ORM Mapper 是基础设施实现细节,不应暴露给外部。`}):N(e)&&n.report({node:t,message:`禁止导出 Schema 定义 "${e}"。Schema 是实现细节,应仅导出推断类型。`})}const L=e({meta:{type:`problem`,docs:{description:`检查 Domain Implementation 包的导出是否符合规范`}},createOnce(e){return{before(){let t=e.filename;if(!D(t))return!1},ExportNamedDeclaration(t){if(t.source&&t.source.type===`Literal`&&typeof t.source.value==`string`)for(let n of t.specifiers){if(n.type!==`ExportSpecifier`)continue;let t=F(n);t&&I(t,n,e)}}}}});function R(e){let t=e.replace(/\\/g,`/`);return t.includes(`/domains/`)&&t.includes(`/implementation/src/index.ts`)}const z=[/\.\/typeorm/,/\.\/typeorm'/,/\.\/typeorm"/],B=[{pattern:/OrmEntity$/,message:`禁止从主入口导出 ORM 实体。应使用 typeorm 入口导出。`},{pattern:/Entity$/,message:`禁止从主入口导出 Entity 类。Entity 是内部实现,应使用 contract 包的 DTO。`},{pattern:/UseCase$/,message:`禁止导出 UseCase 类。UseCase 是内部实现,应通过 Port 接口访问。`},{pattern:/^I[A-Z].*Repository$/,message:`禁止导出 Repository 接口。Repository 是内部接口,外部应通过 Port 访问。`},{pattern:/^create[A-Za-z]+Repository$/,message:`禁止导出 Repository 工厂函数。外部应使用 PortAdapter 工厂函数。`},{pattern:/Repository/,message:`禁止导出 Repository 实现类。应使用工厂函数或 Port 接口。`},{pattern:/Schema$/,message:`禁止导出 Schema 定义。Schema 是实现细节,应导出推断类型。`},{pattern:/_ORM_ENTITIES$/,message:`禁止从主入口导出实体集合。应使用 typeorm 入口导出。`},{pattern:/OrmMapper$/,message:`禁止导出 ORM Mapper。这是基础设施实现细节。`},{pattern:/Table$/,message:`禁止导出数据库表定义。这是数据存储细节。`}];function V(e){return z.some(t=>t.test(e))}function H(e){for(let{pattern:t,message:n}of B)if(t.test(e))return n;return null}function U(e,t){if(e.source){let n=e.source.type===`Literal`&&typeof e.source.value==`string`?e.source.value:null;if(n&&V(n)){t.report({node:e,message:`禁止从主入口重新导出 typeorm.ts 的内容。typeorm.ts 是专门的持久化入口。`});return}}if(e.specifiers){for(let n of e.specifiers)if(n.type===`ExportSpecifier`){let e=n.exported.type===`Identifier`?n.exported.name:n.exported.type===`Literal`&&typeof n.exported.value==`string`?n.exported.value:null;if(e){let r=H(e);r&&t.report({node:n,message:`${e}: ${r}`})}}}e.declaration&&K(e.declaration,t.report)}function W(e,t){if(e.source){let n=e.source.type===`Literal`&&typeof e.source.value==`string`?e.source.value:null;if(n&&V(n)){t.report({node:e,message:`禁止从主入口重新导出 typeorm.ts 的内容。typeorm.ts 是专门的持久化入口。`});return}}t.report({node:e,message:`禁止使用 export *。请使用显式导出,明确导出内容。`})}function G(e,t){q(e.declaration)&&K(e.declaration,t.report)}function K(e,t){if(e.type===`ClassDeclaration`&&e.id){let n=e.id.name,r=H(n);r&&t({node:e,message:`${n}: ${r}`})}else if(e.type===`VariableDeclaration`){for(let n of e.declarations)if(n.id.type===`Identifier`){let e=n.id.name,r=H(e);r&&t({node:n,message:`${e}: ${r}`})}}else if(e.type===`FunctionDeclaration`&&e.id){let n=e.id.name,r=H(n);r&&t({node:e,message:`${n}: ${r}`})}}function q(e){return e.type===`ClassDeclaration`||e.type===`FunctionDeclaration`||e.type===`VariableDeclaration`}const J=e({meta:{type:`problem`,docs:{description:`Implementation 包导出控制:禁止从主入口导出内部实现`}},createOnce(e){return{before(){let t=e.filename;if(!R(t))return!1},ExportNamedDeclaration(t){U(t,e)},ExportAllDeclaration(t){W(t,e)},ExportDefaultDeclaration(t){G(t,e)}}}}),oe=[{alias:`@main`,pathPattern:`src/main`},{alias:`@preload`,pathPattern:`src/preload`},{alias:`@renderer`,pathPattern:`src/renderer/src`},{alias:`@shared`,pathPattern:`src/shared`}];function se(e){return typeof e==`object`&&!!e&&`packageBoundaries`in e}function Y(e,t){let n=e.replace(/\\/g,`/`);for(let e of t){let t=e.pathPattern.replace(/\\/g,`/`);if(n.includes(`/${t}/`)||n.endsWith(`/${t}`)||n.includes(`/${t}\\`))return e.alias}return null}function ce(e,t,n){if(!t.startsWith(`.`))return null;let r=e.replace(/\\/g,`/`),i=r.lastIndexOf(`/`);return Y(le(i>0?r.substring(0,i):``,t),n)}function le(e,t){let n=(e+`/`+t).split(`/`),r=[];for(let e of n)e===`..`?r.pop():e!==`.`&&e!==``&&r.push(e);return`/`+r.join(`/`)}function ue(e){return e.startsWith(`./`)||e.startsWith(`../`)}const de=e({meta:{type:`problem`,docs:{description:`禁止使用相对路径穿越不同包范围,强制使用别名导入`}},createOnce(e){let t=null;function n(){if(t===null){let n=e.options?.[0],r=n&&typeof n==`object`?n:{};t=se(r)&&Array.isArray(r.packageBoundaries)?r.packageBoundaries:oe}return t}return{before(){n()},ImportDeclaration(t){let r=e.filename,i=t.source.type===`Literal`&&typeof t.source.value==`string`?t.source.value:null;if(!i||!ue(i))return;let a=Y(r,n());if(!a)return;let o=ce(r,i,n());o&&a!==o&&e.report({node:t,message:`禁止使用相对路径跨包导入。当前文件位于 "${a}" 包,目标位于 "${o}" 包。请使用别名导入:${o}/...`})}}}});function fe(e){return e.replace(/\\/g,`/`).includes(`/apps/`)}function pe(e){return/-implementation(\/|$)/.test(e)}function me(e){return e.endsWith(`Entity`)}function he(e){return e.endsWith(`UseCase`)}function ge(e){return[/PortAdapter$/,/_TOKEN$/,/^create\w+Repository$/,/^create\w+Adapter$/].some(t=>t.test(e))}const _e=e({meta:{type:`problem`,docs:{description:`禁止在 apps 层导入 implementation 包的 Entity 和 UseCase`}},createOnce(e){return{before(){let t=e.filename;if(!fe(t))return!1},ImportDeclaration(t){let n=t.source.type===`Literal`&&typeof t.source.value==`string`?t.source.value:null;if(n&&pe(n))for(let n of t.specifiers){if(n.type!==`ImportSpecifier`)continue;let t=n.imported.type===`Identifier`?n.imported.name:null;t&&(me(t)?e.report({node:n,message:`禁止在 apps 层导入 Entity 类 "${t}"。请使用 contract 包的 Port 接口进行操作。`}):he(t)?e.report({node:n,message:`禁止在 apps 层导入 UseCase 类 "${t}"。请使用 contract 包的 Port 接口进行操作。`}):ge(t)||e.report({node:n,message:`禁止在 apps 层从 implementation 包导入 "${t}"。请使用 contract 包的 Port 接口。`}))}}}}}),ve=n.object({functionName:n.string(),forbiddenPaths:n.array(n.string()),message:n.optional(n.string())}),ye=n.object({restrictions:n.array(ve)});function X(e,t){let n=e.replace(/\\/g,`/`),r=t.replace(/\\/g,`/`);if(!r.includes(`*`))return n.includes(r);let i=r.split(`*`).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`[^/]+`);return new RegExp(i).test(n)}function be(e,t){return t.some(t=>X(e,t))}function xe(e){let t=ye.safeParse(e);return t.success?t.data.restrictions:[]}function Se(e){return e.type===`Identifier`?e.name:e.type===`MemberExpression`&&e.property&&!e.computed&&e.property.type===`Identifier`?e.property.name:null}const Ce=e({meta:{type:`problem`,docs:{description:`禁止在指定路径中调用特定函数,强制架构约束`}},createOnce(e){let t=[],n=/* @__PURE__ */ new Set;return{before(){let r=e.options?.[0];if(t=xe(r),t.length===0)return!1;n=/* @__PURE__ */ new Set;for(let r=0;r<t.length;r++){let i=t[r];i&&be(e.filename,i.forbiddenPaths)&&n.add(r)}if(n.size===0)return!1},CallExpression(r){let i=Se(r.callee);if(i)for(let a of n){let n=t[a];if(!n||i!==n.functionName)continue;let o=n.message??`禁止在当前路径中调用 "${n.functionName}"`;e.report({node:r,message:o})}}}}}),we=n.object({importSource:n.string(),importNames:n.optional(n.array(n.string())),forbiddenPaths:n.array(n.string()),message:n.optional(n.string())}),Te=n.object({restrictions:n.array(we)});function Z(e,t,n){return e===n.importSource?!n.importNames||n.importNames.length===0?t.length>0:t.some(e=>n.importNames?.includes(e)??!1):!1}function Ee(e){let t=[];for(let n of e)n.type===`ImportSpecifier`&&n.imported.type===`Identifier`?t.push(n.imported.name):n.type===`ImportDefaultSpecifier`&&t.push(n.local.name);return t}function De(e){let t=Te.safeParse(e);return t.success?t.data.restrictions:[]}function Oe(e,t){return t.some(t=>X(e,t))}const Q={"dependency-direction":E,"business-leak":te,"no-cross-package-relative-import":de,"domain-export-compliance":L,"implementation-export-control":J,"no-implementation-import-in-apps":_e,"no-restricted-call-in-paths":Ce,"no-restricted-import-in-paths":e({meta:{type:`problem`,docs:{description:`禁止在指定路径中导入特定模块,强制架构约束`},schema:[{type:`object`,properties:{restrictions:{type:`array`,items:{type:`object`,properties:{importSource:{type:`string`},importNames:{type:`array`,items:{type:`string`}},forbiddenPaths:{type:`array`,items:{type:`string`}},message:{type:`string`}},required:[`importSource`,`forbiddenPaths`],additionalProperties:!1}}},additionalProperties:!1}]},createOnce(e){let t=[],n=/* @__PURE__ */ new Set;return{before(){let r=e.options?.[0];if(t=De(r),t.length===0)return!1;n=/* @__PURE__ */ new Set;for(let r=0;r<t.length;r++){let i=t[r];i&&Oe(e.filename,i.forbiddenPaths)&&n.add(r)}if(n.size===0)return!1},ImportDeclaration(r){let i=r.source.value;if(typeof i!=`string`)return;let a=Ee(r.specifiers??[]);for(let o of n){let n=t[o];if(!n||!Z(i,a,n))continue;let s=n.importNames?a.filter(e=>n.importNames?.includes(e)??!1):a;for(let t of s){let i=n.message??`禁止在当前路径中导入 "${t}"(来源:${n.importSource})`;e.report({node:r,message:i})}}}}}})},$=t({meta:{name:`@longzai-intelligence-oxlint/architecture-core-plugin`},rules:Q});export{$ as architectureCorePlugin,$ as default,Q as coreRules};
1
+ import"../rolldown-runtime-BqT_7tdF.js";import{defineRule as e,eslintCompatPlugin as t}from"@oxlint/plugins";import*as n from"zod/mini";const r=[`/packages/platform/`,`/packages/ui/`,`/packages/ui-kit/`,`/packages/engine/`,`/packages/utils/`,`/packages/types/`],i=[],a=[`^validate`,`^calculate`,`^compute`,`^determine`,`^check`,`^can`,`^should`,`^isAllowed`,`^isPermitted`,`^hasPermission`,`^applyRule`,`^enforce`,`^execute`];function o(e){return typeof e==`object`&&!!e}function s(e){let t=Array.isArray(e)?e[0]:e;return o(t)?{techLayerPatterns:t.techLayerPatterns??r,businessKeywords:t.businessKeywords??i,businessRuleMethods:t.businessRuleMethods??a}:{techLayerPatterns:r,businessKeywords:i,businessRuleMethods:a}}function c(e){return e.map(e=>new RegExp(e))}function l(e,t){let n=e.replace(/\\/g,`/`);return t.some(e=>e.test(n))}function u(e,t){let n=e.charAt(0).toUpperCase()+e.slice(1);return t.some(e=>n.includes(e))}function d(e,t){return t.some(t=>t.test(e))}const ee=e({meta:{type:`suggestion`,docs:{description:`检测技术层中可能存在的业务逻辑`}},createOnce(e){let t=[],n=[],r=[];return{before(){let i=s(e.options);return t=c(i.techLayerPatterns),n=i.businessKeywords,r=c(i.businessRuleMethods),l(e.filename,t)?void 0:!1},ClassDeclaration(t){t.id&&u(t.id.name,n)&&e.report({node:t,message:`业务逻辑泄漏嫌疑: 技术层发现业务相关类 '${t.id.name}'。业务逻辑应该放在 domains/ 层。`})},MethodDefinition(t){t.key.type===`Identifier`&&d(t.key.name,r)&&e.report({node:t,message:`业务逻辑泄漏嫌疑: 技术层发现业务规则方法 '${t.key.name}'。业务规则应该放在 domains/ 层。`})},TSInterfaceDeclaration(t){u(t.id.name,n)&&e.report({node:t,message:`业务逻辑泄漏嫌疑: 技术层发现业务相关接口 '${t.id.name}'。业务接口应该放在 domains/ 层。`})},TSTypeAliasDeclaration(t){u(t.id.name,n)&&e.report({node:t,message:`业务逻辑泄漏嫌疑: 技术层发现业务相关类型 '${t.id.name}'。业务类型应该放在 domains/ 层。`})}}}}),f={types:0,utils:1,"shared-kernel":2,contract:3,engine:4,platform:5,infrastructure:6,implementation:6,domain:6,capability:7,ui:7,"electron-shared":7,"electron-main":8,"electron-preload":8,"electron-renderer":9},p={types:`类型层 (Types)`,utils:`工具层 (Utils)`,"shared-kernel":`共享内核层 (Shared Kernel)`,contract:`契约层 (Contract)`,engine:`引擎层 (Engine)`,platform:`平台层 (Platform)`,infrastructure:`基础设施层 (Infrastructure)`,implementation:`实现层 (Implementation)`,domain:`门面层 (Domain Facade)`,capability:`能力装配层 (Capability)`,ui:`UI 表现层`,"electron-shared":`Electron 共享层 (Shared)`,"electron-main":`Electron 主进程 (Main)`,"electron-preload":`Electron 预加载层 (Preload)`,"electron-renderer":`Electron 渲染进程 (Renderer)`},te=new Set(Object.keys(f)),m={pathPatterns:[{pattern:/\/apps\/capabilities\//,layer:`capability`},{pattern:/\/domains\/[^/]+\/implementation\//,layer:`implementation`},{pattern:/\/domains\/[^/]+\/contract\//,layer:`contract`},{pattern:/\/domains\/[^/]+\/ui\//,layer:`ui`},{pattern:/\/domains\/shared-kernel\//,layer:`shared-kernel`},{pattern:/\/infrastructure\//,layer:`infrastructure`}],packagePrefix:``,specialPackageMappings:{},packageSuffixMappings:[{suffix:`-contract`,layer:`contract`},{suffix:`-implementation`,layer:`implementation`},{suffix:`-infrastructure`,layer:`infrastructure`},{suffix:`-domain`,layer:`domain`},{suffix:`-ui`,layer:`ui`},{suffix:`-engine`,layer:`engine`},{suffix:`-runtime`,layer:`engine`}]},ne=[{from:`capability`,to:`implementation`},{from:`capability`,to:`infrastructure`},{from:`ui`,to:`domain`,hint:`UI 面禁止经门面包取件,域外依赖唯一指向生成式 sdk 客户端,ADR 0127。`},{from:`ui`,to:`contract`,hint:`contract 为 DDD 主体对 UI 全封闭,类型正源为 sdk 生成契约推断类型,ADR 0127。`},{from:`ui`,to:`implementation`,hint:`UI 面禁止直连实现层,域外依赖唯一指向生成式 sdk 客户端,ADR 0127。`},{from:`ui`,to:`infrastructure`,hint:`UI 面禁止直连基础设施层,域外依赖唯一指向生成式 sdk 客户端,ADR 0127。`}],re=[`-main`],h=[{pattern:/\/src\/domain\//,layer:`contract`},{pattern:/\/src\/engine\//,layer:`engine`},{pattern:/\/src\/platform\//,layer:`platform`},{pattern:/\/src\/infrastructure\//,layer:`infrastructure`},{pattern:/\/src\/shared\//,layer:`shared-kernel`}];function g(e){return te.has(e)}function ie(e,t){return f[e]>=f[t]}function _(e){return p[e]}function ae(e,t){let n=e.replace(/\\/g,`/`),r=t??m.pathPatterns;if(r){for(let{pattern:e,layer:t}of r)if(e.test(n))return{layer:t,priority:f[t]}}if(n.includes(`/apps/`)){for(let{pattern:e,layer:t}of h)if(e.test(n))return{layer:t,priority:f[t]}}if(n.includes(`/packages/`)){for(let{pattern:e,layer:t}of h)if(e.test(n))return{layer:t,priority:f[t]}}return null}function v(e,t){if(!e.startsWith(t))return null;let n=e.split(`/`),r=n[0]===``?n.slice(1):n;return(r[0]?.startsWith(`@`)?r[1]:r[0])??null}function oe(e,t){for(let n of t)if(e.endsWith(n))return n;return null}function y(e,t){let n=t.packagePrefix??``,r=v(e,n);if(!r)return null;let i=(t.specialPackageMappings??{})[`${n}${r}`];if(i)return{layer:i,priority:f[i]};let a=t.packageSuffixMappings??[];for(let{suffix:e,layer:t}of a)if(r.endsWith(e))return{layer:t,priority:f[t]};return null}function b(e,t,n){return e.find(e=>e.from===t&&e.to===n)??null}function x(e){let t=e.match(/^\/(.+)\/([gimsuvy]*)$/);return t?.[1]?new RegExp(t[1],t[2]??``):new RegExp(e)}function S(e){let t={};if(e.pathPatterns&&(t.pathPatterns=e.pathPatterns.reduce((e,{pattern:t,layer:n})=>(g(n)&&e.push({pattern:x(t),layer:n}),e),[])),e.packagePrefix&&(t.packagePrefix=e.packagePrefix),e.specialPackageMappings){let n={};for(let[t,r]of Object.entries(e.specialPackageMappings))g(r)&&(n[t]=r);t.specialPackageMappings=Object.keys(n).length>0?n:void 0}if(e.packageSuffixMappings){let n=[];for(let{suffix:t,layer:r}of e.packageSuffixMappings)g(r)&&n.push({suffix:t,layer:r});t.packageSuffixMappings=n.length>0?n:void 0}if(e.forbiddenLayerPairs){let n=[];for(let{from:t,to:r}of e.forbiddenLayerPairs)g(t)&&g(r)&&n.push({from:t,to:r});t.forbiddenLayerPairs=n.length>0?n:void 0}if(e.forbiddenPackageSuffixes){let n=e.forbiddenPackageSuffixes.filter(e=>e.length>0);t.forbiddenPackageSuffixes=n.length>0?n:void 0}return t}function C(e){return typeof e==`object`&&!!e}function w(e){let t=S(C(e)?e:{});return{pathPatterns:t.pathPatterns??m.pathPatterns,packagePrefix:t.packagePrefix??m.packagePrefix,specialPackageMappings:t.specialPackageMappings??m.specialPackageMappings,packageSuffixMappings:t.packageSuffixMappings??m.packageSuffixMappings,forbiddenLayerPairs:[...ne,...t.forbiddenLayerPairs??[]],forbiddenPackageSuffixes:[...re,...t.forbiddenPackageSuffixes??[]]}}const T=e({meta:{type:`problem`,docs:{description:`强制执行 Clean Architecture 的依赖方向规则`},schema:[{type:`object`,properties:{pathPatterns:{type:`array`,items:{type:`object`,properties:{pattern:{type:`string`},layer:{type:`string`}},required:[`pattern`,`layer`],additionalProperties:!1}},packagePrefix:{type:`string`},specialPackageMappings:{type:`object`,additionalProperties:{type:`string`}},packageSuffixMappings:{type:`array`,items:{type:`object`,properties:{suffix:{type:`string`},layer:{type:`string`}},required:[`suffix`,`layer`],additionalProperties:!1}},forbiddenLayerPairs:{type:`array`,items:{type:`object`,properties:{from:{type:`string`},to:{type:`string`}},required:[`from`,`to`],additionalProperties:!1}},forbiddenPackageSuffixes:{type:`array`,items:{type:`string`}}},additionalProperties:!1}]},createOnce(e){let t=null,n=null;return{before(){return t===null&&(t=w(e.options?.[0])),n=ae(e.filename,t.pathPatterns),n!==null},ImportDeclaration(r){if(!n||!t)return;let i=r.source.type===`Literal`&&typeof r.source.value==`string`?r.source.value:null;if(!i)return;let a=v(i,t.packagePrefix??``);if(a){let n=oe(a,t.forbiddenPackageSuffixes??[]);if(n){e.report({node:r,message:`禁止导入已禁用的 ${n} 门面包,门面包统一使用 -domain 后缀。`});return}}let o=y(i,t);if(!o)return;let s=b(t.forbiddenLayerPairs??[],n.layer,o.layer);s?e.report({node:r,message:`依赖方向违规: ${n.layer} (${_(n.layer)}) 不能导入 ${o.layer} (${_(o.layer)})。${s.hint??`域内取件必须经 -domain 门面包。`}`}):ie(n.layer,o.layer)||e.report({node:r,message:`依赖方向违规: ${n.layer} (${_(n.layer)}) 不能导入 ${o.layer} (${_(o.layer)})。依赖应该从外层指向内层。`})}}}});function E(e){let t=e.replace(/\\/g,`/`);return t.includes(`/domains/`)&&t.includes(`/implementation/src/index.ts`)}function D(e){return e.endsWith(`Entity`)}function O(e){return e.endsWith(`Repository`)&&!e.startsWith(`I`)}function k(e){return e.endsWith(`OrmEntity`)}function A(e){return e.endsWith(`_ORM_ENTITIES`)}function j(e){return e.endsWith(`OrmMapper`)}function M(e){return e.endsWith(`Schema`)}function N(e){return`exportKind`in e&&typeof e.exportKind==`string`?e.exportKind===`value`:!0}function P(e){return e.exported.type===`Identifier`?e.exported.name:e.exported.type===`Literal`&&typeof e.exported.value==`string`?e.exported.value:null}function F(e,t,n){D(e)&&N(t)?n.report({node:t,message:`禁止从主入口值导出 Entity 类 "${e}"。请改为类型导出或移除导出。`}):O(e)?n.report({node:t,message:`禁止导出 Repository 类型 "${e}"。Repository 是内部实现,不应暴露给外部。`}):k(e)?n.report({node:t,message:`禁止从主入口导出 ORM 实体 "${e}"。请创建 src/typeorm.ts 入口文件,从该入口导出。`}):A(e)?n.report({node:t,message:`禁止从主入口导出 ORM 实体集合 "${e}"。请创建 src/typeorm.ts 入口文件,从该入口导出。`}):j(e)?n.report({node:t,message:`禁止导出 ORM Mapper "${e}"。ORM Mapper 是基础设施实现细节,不应暴露给外部。`}):M(e)&&n.report({node:t,message:`禁止导出 Schema 定义 "${e}"。Schema 是实现细节,应仅导出推断类型。`})}const I=e({meta:{type:`problem`,docs:{description:`检查 Domain Implementation 包的导出是否符合规范`}},createOnce(e){return{before(){let t=e.filename;if(!E(t))return!1},ExportNamedDeclaration(t){if(t.source&&t.source.type===`Literal`&&typeof t.source.value==`string`)for(let n of t.specifiers){if(n.type!==`ExportSpecifier`)continue;let t=P(n);t&&F(t,n,e)}}}}});function L(e){let t=e.replace(/\\/g,`/`);return t.includes(`/domains/`)&&t.includes(`/implementation/src/index.ts`)}const R=[/\.\/typeorm/,/\.\/typeorm'/,/\.\/typeorm"/],z=[{pattern:/OrmEntity$/,message:`禁止从主入口导出 ORM 实体。应使用 typeorm 入口导出。`},{pattern:/Entity$/,message:`禁止从主入口导出 Entity 类。Entity 是内部实现,应使用 contract 包的 DTO。`},{pattern:/UseCase$/,message:`禁止导出 UseCase 类。UseCase 是内部实现,应通过 Port 接口访问。`},{pattern:/^I[A-Z].*Repository$/,message:`禁止导出 Repository 接口。Repository 是内部接口,外部应通过 Port 访问。`},{pattern:/^create[A-Za-z]+Repository$/,message:`禁止导出 Repository 工厂函数。外部应使用 PortAdapter 工厂函数。`},{pattern:/Repository/,message:`禁止导出 Repository 实现类。应使用工厂函数或 Port 接口。`},{pattern:/Schema$/,message:`禁止导出 Schema 定义。Schema 是实现细节,应导出推断类型。`},{pattern:/_ORM_ENTITIES$/,message:`禁止从主入口导出实体集合。应使用 typeorm 入口导出。`},{pattern:/OrmMapper$/,message:`禁止导出 ORM Mapper。这是基础设施实现细节。`},{pattern:/Table$/,message:`禁止导出数据库表定义。这是数据存储细节。`}];function B(e){return R.some(t=>t.test(e))}function V(e){for(let{pattern:t,message:n}of z)if(t.test(e))return n;return null}function H(e,t){if(e.source){let n=e.source.type===`Literal`&&typeof e.source.value==`string`?e.source.value:null;if(n&&B(n)){t.report({node:e,message:`禁止从主入口重新导出 typeorm.ts 的内容。typeorm.ts 是专门的持久化入口。`});return}}if(e.specifiers){for(let n of e.specifiers)if(n.type===`ExportSpecifier`){let e=n.exported.type===`Identifier`?n.exported.name:n.exported.type===`Literal`&&typeof n.exported.value==`string`?n.exported.value:null;if(e){let r=V(e);r&&t.report({node:n,message:`${e}: ${r}`})}}}e.declaration&&G(e.declaration,t.report)}function U(e,t){if(e.source){let n=e.source.type===`Literal`&&typeof e.source.value==`string`?e.source.value:null;if(n&&B(n)){t.report({node:e,message:`禁止从主入口重新导出 typeorm.ts 的内容。typeorm.ts 是专门的持久化入口。`});return}}t.report({node:e,message:`禁止使用 export *。请使用显式导出,明确导出内容。`})}function W(e,t){K(e.declaration)&&G(e.declaration,t.report)}function G(e,t){if(e.type===`ClassDeclaration`&&e.id){let n=e.id.name,r=V(n);r&&t({node:e,message:`${n}: ${r}`})}else if(e.type===`VariableDeclaration`){for(let n of e.declarations)if(n.id.type===`Identifier`){let e=n.id.name,r=V(e);r&&t({node:n,message:`${e}: ${r}`})}}else if(e.type===`FunctionDeclaration`&&e.id){let n=e.id.name,r=V(n);r&&t({node:e,message:`${n}: ${r}`})}}function K(e){return e.type===`ClassDeclaration`||e.type===`FunctionDeclaration`||e.type===`VariableDeclaration`}const q=e({meta:{type:`problem`,docs:{description:`Implementation 包导出控制:禁止从主入口导出内部实现`}},createOnce(e){return{before(){let t=e.filename;if(!L(t))return!1},ExportNamedDeclaration(t){H(t,e)},ExportAllDeclaration(t){U(t,e)},ExportDefaultDeclaration(t){W(t,e)}}}}),se=[{alias:`@main`,pathPattern:`src/main`},{alias:`@preload`,pathPattern:`src/preload`},{alias:`@renderer`,pathPattern:`src/renderer/src`},{alias:`@shared`,pathPattern:`src/shared`}];function ce(e){return typeof e==`object`&&!!e&&`packageBoundaries`in e}function J(e,t){let n=e.replace(/\\/g,`/`);for(let e of t){let t=e.pathPattern.replace(/\\/g,`/`);if(n.includes(`/${t}/`)||n.endsWith(`/${t}`)||n.includes(`/${t}\\`))return e.alias}return null}function le(e,t,n){if(!t.startsWith(`.`))return null;let r=e.replace(/\\/g,`/`),i=r.lastIndexOf(`/`);return J(ue(i>0?r.substring(0,i):``,t),n)}function ue(e,t){let n=(e+`/`+t).split(`/`),r=[];for(let e of n)e===`..`?r.pop():e!==`.`&&e!==``&&r.push(e);return`/`+r.join(`/`)}function Y(e){return e.startsWith(`./`)||e.startsWith(`../`)}const de=e({meta:{type:`problem`,docs:{description:`禁止使用相对路径穿越不同包范围,强制使用别名导入`}},createOnce(e){let t=null;function n(){if(t===null){let n=e.options?.[0],r=n&&typeof n==`object`?n:{};t=ce(r)&&Array.isArray(r.packageBoundaries)?r.packageBoundaries:se}return t}return{before(){n()},ImportDeclaration(t){let r=e.filename,i=t.source.type===`Literal`&&typeof t.source.value==`string`?t.source.value:null;if(!i||!Y(i))return;let a=J(r,n());if(!a)return;let o=le(r,i,n());o&&a!==o&&e.report({node:t,message:`禁止使用相对路径跨包导入。当前文件位于 "${a}" 包,目标位于 "${o}" 包。请使用别名导入:${o}/...`})}}}});function fe(e){return e.replace(/\\/g,`/`).includes(`/apps/`)}function pe(e){return/-implementation(\/|$)/.test(e)}function me(e){return e.endsWith(`Entity`)}function he(e){return e.endsWith(`UseCase`)}function ge(e){return[/PortAdapter$/,/_TOKEN$/,/^create\w+Repository$/,/^create\w+Adapter$/].some(t=>t.test(e))}const _e=e({meta:{type:`problem`,docs:{description:`禁止在 apps 层导入 implementation 包的 Entity 和 UseCase`}},createOnce(e){return{before(){let t=e.filename;if(!fe(t))return!1},ImportDeclaration(t){let n=t.source.type===`Literal`&&typeof t.source.value==`string`?t.source.value:null;if(n&&pe(n))for(let n of t.specifiers){if(n.type!==`ImportSpecifier`)continue;let t=n.imported.type===`Identifier`?n.imported.name:null;t&&(me(t)?e.report({node:n,message:`禁止在 apps 层导入 Entity 类 "${t}"。请使用 contract 包的 Port 接口进行操作。`}):he(t)?e.report({node:n,message:`禁止在 apps 层导入 UseCase 类 "${t}"。请使用 contract 包的 Port 接口进行操作。`}):ge(t)||e.report({node:n,message:`禁止在 apps 层从 implementation 包导入 "${t}"。请使用 contract 包的 Port 接口。`}))}}}}}),ve=n.object({functionName:n.string(),forbiddenPaths:n.array(n.string()),message:n.optional(n.string())}),ye=n.object({restrictions:n.array(ve)});function X(e,t){let n=e.replace(/\\/g,`/`),r=t.replace(/\\/g,`/`);if(!r.includes(`*`))return n.includes(r);let i=r.split(`*`).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`[^/]+`);return new RegExp(i).test(n)}function be(e,t){return t.some(t=>X(e,t))}function xe(e){let t=ye.safeParse(e);return t.success?t.data.restrictions:[]}function Se(e){return e.type===`Identifier`?e.name:e.type===`MemberExpression`&&e.property&&!e.computed&&e.property.type===`Identifier`?e.property.name:null}const Ce=e({meta:{type:`problem`,docs:{description:`禁止在指定路径中调用特定函数,强制架构约束`}},createOnce(e){let t=[],n=/* @__PURE__ */ new Set;return{before(){let r=e.options?.[0];if(t=xe(r),t.length===0)return!1;n=/* @__PURE__ */ new Set;for(let r=0;r<t.length;r++){let i=t[r];i&&be(e.filename,i.forbiddenPaths)&&n.add(r)}if(n.size===0)return!1},CallExpression(r){let i=Se(r.callee);if(i)for(let a of n){let n=t[a];if(!n||i!==n.functionName)continue;let o=n.message??`禁止在当前路径中调用 "${n.functionName}"`;e.report({node:r,message:o})}}}}}),we=[`fetch`,`axios`],Te=[`XMLHttpRequest`,`EventSource`,`WebSocket`],Ee=[`domains/*/ui/`,`packages/ui/`,`packages/*-ui/`],De=new Set(Te),Oe=[`__tests__/`,`.test.`,`.spec.`,`__mocks__/`],ke=n.object({uiPathPatterns:n.optional(n.array(n.string())),extraFunctionNames:n.optional(n.array(n.string())),ignoreTests:n.optional(n.boolean())});function Ae(e,t){return t.some(t=>X(e,t))}function je(e){let t=e.replace(/\\/g,`/`);return Oe.some(e=>t.includes(e))}function Me(e){let t=ke.safeParse(e),n=t.success?t.data:{};return{uiPathPatterns:n.uiPathPatterns??[...Ee],rawCallNames:/* @__PURE__ */ new Set([...we,...n.extraFunctionNames??[]]),ignoreTests:n.ignoreTests??!0}}function Ne(e,t){return e.type===`Identifier`?t.has(e.name)?e.name:null:e.type===`MemberExpression`&&!e.computed&&e.object.type===`Identifier`&&t.has(e.object.name)?e.property.type===`Identifier`?`${e.object.name}.${e.property.name}`:e.object.name:null}function Pe(e){return e.type===`Identifier`&&De.has(e.name)?e.name:null}function Z(e){return`UI 层禁止手写网络调用 "${e}"。网络消费统一经生成式 sdk 客户端端点加 transport 通道注入,正线见 ADR 0127 与 sdk 治理台账工作流 002。`}const Fe=e({meta:{type:`problem`,docs:{description:`禁止 UI 层手写网络调用,消费面统一经生成式 sdk 客户端`}},createOnce(e){let t=null,n=!1;return{before(){if(t=Me(e.options?.[0]),n=!(t.ignoreTests&&je(e.filename))&&Ae(e.filename,t.uiPathPatterns),!n)return!1},CallExpression(r){if(!t||!n)return;let i=Ne(r.callee,t.rawCallNames);i&&e.report({node:r,message:Z(i)})},NewExpression(r){if(!t||!n)return;let i=Pe(r.callee);i&&e.report({node:r,message:Z(i)})}}}}),Ie=n.object({importSource:n.string(),importNames:n.optional(n.array(n.string())),forbiddenPaths:n.array(n.string()),message:n.optional(n.string())}),Le=n.object({restrictions:n.array(Ie)});function Re(e,t,n){return e===n.importSource?!n.importNames||n.importNames.length===0?t.length>0:t.some(e=>n.importNames?.includes(e)??!1):!1}function ze(e){let t=[];for(let n of e)n.type===`ImportSpecifier`&&n.imported.type===`Identifier`?t.push(n.imported.name):n.type===`ImportDefaultSpecifier`&&t.push(n.local.name);return t}function Be(e){let t=Le.safeParse(e);return t.success?t.data.restrictions:[]}function Ve(e,t){return t.some(t=>X(e,t))}const Q={"dependency-direction":T,"business-leak":ee,"no-cross-package-relative-import":de,"domain-export-compliance":I,"implementation-export-control":q,"no-implementation-import-in-apps":_e,"no-restricted-call-in-paths":Ce,"no-restricted-import-in-paths":e({meta:{type:`problem`,docs:{description:`禁止在指定路径中导入特定模块,强制架构约束`},schema:[{type:`object`,properties:{restrictions:{type:`array`,items:{type:`object`,properties:{importSource:{type:`string`},importNames:{type:`array`,items:{type:`string`}},forbiddenPaths:{type:`array`,items:{type:`string`}},message:{type:`string`}},required:[`importSource`,`forbiddenPaths`],additionalProperties:!1}}},additionalProperties:!1}]},createOnce(e){let t=[],n=/* @__PURE__ */ new Set;return{before(){let r=e.options?.[0];if(t=Be(r),t.length===0)return!1;n=/* @__PURE__ */ new Set;for(let r=0;r<t.length;r++){let i=t[r];i&&Ve(e.filename,i.forbiddenPaths)&&n.add(r)}if(n.size===0)return!1},ImportDeclaration(r){let i=r.source.value;if(typeof i!=`string`)return;let a=ze(r.specifiers??[]);for(let o of n){let n=t[o];if(!n||!Re(i,a,n))continue;let s=n.importNames?a.filter(e=>n.importNames?.includes(e)??!1):a;for(let t of s){let i=n.message??`禁止在当前路径中导入 "${t}"(来源:${n.importSource})`;e.report({node:r,message:i})}}}}}}),"no-raw-network-call-in-ui":Fe},$=t({meta:{name:`@longzai-intelligence-oxlint/architecture-core-plugin`},rules:Q});export{$ as architectureCorePlugin,$ as default,Q as coreRules};
@@ -1 +1 @@
1
- import"../rolldown-runtime-BqT_7tdF.js";import{n as e}from"../dist-CskvMq7J.js";import{defineRule as t,eslintCompatPlugin as n}from"@oxlint/plugins";import{existsSync as r,readdirSync as i}from"node:fs";import a from"node:path";const o=[`index.ts`,`index.tsx`,`main.ts`,`main.tsx`,`App.tsx`],s=[`types.ts`,`errors.ts`,`constants.ts`],c=[`persistence.ts`,`typeorm.ts`,`hono.ts`,`react.ts`,`vue.ts`,`next.ts`,`electron.ts`,`browser.ts`,`node.ts`],l=[...o,...s,...c],u=[`impl`,`functions`,`methods`,`handlers`,`classes`,`class`,`manager`,`object`,`processor`,`process`,`common`,`logic`,`hooks`,`component`],d=[{pattern:/^use[A-Z][a-zA-Z]*\.spec\.tsx?$/,caseStyle:`camelCase`,description:`Hook 测试文件应使用 camelCase 并以 use 前缀开头(如 useChat.spec.ts)`},{pattern:/^use[A-Z][a-zA-Z]*\.test\.tsx?$/,caseStyle:`camelCase`,description:`Hook 测试文件应使用 camelCase 并以 use 前缀开头(如 useChat.test.ts)`},{pattern:/^use[A-Z][a-zA-Z]*\.types\.ts$/,caseStyle:`camelCase`,description:`Hook 类型文件应使用 camelCase 并以 use 前缀开头(如 useChat.types.ts)`},{pattern:/\.spec\.ts$/,caseStyle:`kebab-case-test`,description:`测试文件应使用 xxx.spec.ts 格式(kebab-case)`},{pattern:/\.test\.ts$/,caseStyle:`kebab-case-test`,description:`测试文件应使用 xxx.test.ts 格式(kebab-case)`},{pattern:/\.spec\.tsx$/,caseStyle:`kebab-case-test`,description:`测试文件应使用 xxx.spec.tsx 格式(kebab-case)`},{pattern:/\.test\.tsx$/,caseStyle:`kebab-case-test`,description:`测试文件应使用 xxx.test.tsx 格式(kebab-case)`},{pattern:/^use[A-Z][a-zA-Z]*\.tsx?$/,caseStyle:`camelCase`,description:`Hook 文件应使用 camelCase 并以 use 前缀开头(如 useChat.ts)`}],f=[{pattern:/\.service\.drizzle\.ts$/,caseStyle:`kebab-case`,description:`Drizzle Service 文件应使用 xxx.service.drizzle.ts 格式(kebab-case)`},{pattern:/\.service\.memory\.ts$/,caseStyle:`kebab-case`,description:`Memory Service 文件应使用 xxx.service.memory.ts 格式(kebab-case)`},{pattern:/\.service\.ts$/,caseStyle:`kebab-case`,description:`服务文件应使用 xxx.service.ts 格式(kebab-case)`},{pattern:/\.controller\.ts$/,caseStyle:`kebab-case`,description:`控制器文件应使用 xxx.controller.ts 格式(kebab-case)`},{pattern:/\.module\.ts$/,caseStyle:`kebab-case`,description:`模块文件应使用 xxx.module.ts 格式(kebab-case)`},{pattern:/\.repository\.drizzle\.ts$/,caseStyle:`kebab-case`,description:`Drizzle Repository 文件应使用 xxx.repository.drizzle.ts 格式(kebab-case)`},{pattern:/\.repository\.memory\.ts$/,caseStyle:`kebab-case`,description:`Memory Repository 文件应使用 xxx.repository.memory.ts 格式(kebab-case)`},{pattern:/\.repository\.interface\.ts$/,caseStyle:`kebab-case`,description:`Repository 接口文件应使用 xxx.repository.interface.ts 格式(kebab-case)`},{pattern:/\.repository\.types\.ts$/,caseStyle:`kebab-case`,description:`Repository 类型文件应使用 xxx.repository.types.ts 格式(kebab-case)`},{pattern:/\.repository\.ts$/,caseStyle:`kebab-case`,description:`Repository 文件应使用 xxx.repository.ts 格式(kebab-case)`},{pattern:/\.entity\.types\.ts$/,caseStyle:`kebab-case`,description:`Entity 类型文件应使用 xxx.entity.types.ts 格式(kebab-case)`},{pattern:/\.entity\.interface\.ts$/,caseStyle:`kebab-case`,description:`Entity 接口文件应使用 xxx.entity.interface.ts 格式(kebab-case)`},{pattern:/\.entity\.ts$/,caseStyle:`kebab-case`,description:`Entity 文件应使用 xxx.entity.ts 格式(kebab-case)`},{pattern:/\.dto\.ts$/,caseStyle:`kebab-case`,description:`DTO 文件应使用 xxx.dto.ts 格式(kebab-case)`},{pattern:/\.port\.interface\.ts$/,caseStyle:`kebab-case`,description:`Port 接口文件应使用 xxx.port.interface.ts 格式(kebab-case)`},{pattern:/\.interface\.ts$/,caseStyle:`kebab-case`,description:`接口文件应使用 xxx.interface.ts 格式(kebab-case)`},{pattern:/\.interface\.tsx$/,caseStyle:`kebab-case`,description:`接口文件应使用 xxx.interface.tsx 格式(kebab-case)`},{pattern:/\.types\.ts$/,caseStyle:`kebab-case`,description:`类型文件应使用 xxx.types.ts 格式(kebab-case)`},{pattern:/\.schema\.ts$/,caseStyle:`kebab-case`,description:`Schema 文件应使用 xxx.schema.ts 格式(kebab-case)`},{pattern:/\.port\.ts$/,caseStyle:`kebab-case`,description:`Port 文件应使用 xxx.port.ts 格式(kebab-case)`},{pattern:/\.port-adapter\.factory\.ts$/,caseStyle:`kebab-case`,description:`Port Adapter Factory 文件应使用 xxx.port-adapter.factory.ts 格式(kebab-case)`},{pattern:/\.port-adapter\.ts$/,caseStyle:`kebab-case`,description:`Port Adapter 文件应使用 xxx.port-adapter.ts 格式(kebab-case)`},{pattern:/\.adapter\.ts$/,caseStyle:`kebab-case`,description:`Adapter 文件应使用 xxx.adapter.ts 格式(kebab-case)`},{pattern:/\.client\.ts$/,caseStyle:`kebab-case`,description:`客户端文件应使用 xxx.client.ts 格式(kebab-case)`},{pattern:/\.events\.ts$/,caseStyle:`kebab-case`,description:`Events 文件应使用 xxx.events.ts 格式(kebab-case)`},{pattern:/\.mapper\.ts$/,caseStyle:`kebab-case`,description:`Mapper 文件应使用 xxx.mapper.ts 格式(kebab-case)`},{pattern:/\.ipc\.ts$/,caseStyle:`kebab-case`,description:`IPC 文件应使用 xxx.ipc.ts 格式(kebab-case)`},{pattern:/\.config\.ts$/,caseStyle:`kebab-case`,description:`配置文件应使用 xxx.config.ts 格式(kebab-case)`},{pattern:/\.errors\.ts$/,caseStyle:`kebab-case`,description:`错误文件应使用 xxx.errors.ts 格式(kebab-case)`},{pattern:/\.utils\.ts$/,caseStyle:`kebab-case`,description:`工具函数文件应使用 xxx.utils.ts 格式(kebab-case)`},{pattern:/\.constants\.ts$/,caseStyle:`kebab-case`,description:`常量文件应使用 xxx.constants.ts 格式(kebab-case)`},{pattern:/\.atom\.ts$/,caseStyle:`kebab-case`,description:`Atom 文件应使用 xxx.atom.ts 格式(kebab-case)`},{pattern:/\.vo\.ts$/,caseStyle:`kebab-case`,description:`值对象文件应使用 xxx.vo.ts 格式(kebab-case)`},{pattern:/\.usecase\.ts$/,caseStyle:`kebab-case`,description:`UseCase 文件应使用 xxx.usecase.ts 格式(kebab-case)`},{pattern:/\.styles\.css$/,caseStyle:`kebab-case`,description:`样式文件应使用 xxx.styles.css 格式(kebab-case)`},{pattern:/\.extension\.tsx?$/,caseStyle:`kebab-case`,description:`扩展文件应使用 xxx.extension.ts(x) 格式(kebab-case)`}],p=[{pattern:/^[A-Z][a-zA-Z0-9]*\.types\.ts$/,caseStyle:`PascalCase`,description:`类型文件可使用 PascalCase(如 DataExtractor.types.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.utils\.ts$/,caseStyle:`PascalCase`,description:`工具函数文件可使用 PascalCase(如 DataExtractor.utils.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.constants\.ts$/,caseStyle:`PascalCase`,description:`常量文件可使用 PascalCase(如 ByteVisualizer.constants.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.guards\.ts$/,caseStyle:`PascalCase`,description:`守卫文件可使用 PascalCase(如 DataExtractor.guards.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.helpers\.ts$/,caseStyle:`PascalCase`,description:`辅助函数文件可使用 PascalCase(如 TableVisualizer.helpers.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.groups\.ts$/,caseStyle:`PascalCase`,description:`分组文件可使用 PascalCase(如 TableVisualizer.groups.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.type-guards\.ts$/,caseStyle:`PascalCase`,description:`类型守卫文件可使用 PascalCase(如 TableVisualizer.type-guards.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.test\.ts$/,caseStyle:`PascalCase`,description:`测试文件可使用 PascalCase(如 DataExtractor.test.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.[a-z][-a-z]*\.test\.ts$/,caseStyle:`PascalCase`,description:`伴生测试文件可使用 PascalCase(如 DataExtractor.guards.test.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.[a-z][-a-z]*\.test\.tsx$/,caseStyle:`PascalCase`,description:`伴生测试文件可使用 PascalCase(如 PacketCompare.test.tsx)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.test\.tsx$/,caseStyle:`PascalCase`,description:`测试文件可使用 PascalCase(如 ByteVisualizer.test.tsx)`}],m={pattern:/^[a-z][a-zA-Z0-9_-]*\.tsx$/,caseStyle:`PascalCase`,description:`组件文件应使用 PascalCase(如 ChatPage.tsx),小写开头不允许`},h={pattern:/^[A-Z][a-zA-Z0-9]*\.tsx$/,caseStyle:`PascalCase`,description:`React 组件文件可使用 PascalCase(如 ChatPage.tsx)`},g=[...d,...p,...f,m,h];function _(e){return/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(e)}function v(e){return e.split(`.`).every(e=>_(e)&&e.length>0)}function y(e){return/^[A-Z][a-zA-Z0-9]*$/.test(e)}function b(e){return/^[a-z][a-zA-Z0-9]*$/.test(e)}function x(e){let t=e.split(`.`)[0];return t!==void 0&&t.length>0&&y(t)}function S(e){return e.split(`.`).every(e=>_(e)&&e.length>0)}function ee(e,t){switch(t){case`kebab-case`:return v(e);case`PascalCase`:return y(e);case`camelCase`:return b(e);case`kebab-case-test`:return S(e);default:return!0}}function te(e){return/^v\d+(-[a-z0-9-]+)?\.ts$/.test(e)}function C(e){let t=e.replace(/\.tsx?$/,``);for(let e of u){if(t.endsWith(`.${e}`))return e;let n=t.split(`.`);if(n.length>=2&&n[n.length-1]===e)return e}return null}function w(e){return!!(l.includes(e)||e.endsWith(`.d.ts`)||te(e)||e.startsWith(`[`)||e.startsWith(`_`))}function T(e,t){let n=e.replace(/\\/g,`/`);for(let e of t){let t=e.replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*\*\//g,`<<DOUBLE_STAR_SLASH>>`).replace(/\*\*/g,`<<DOUBLE_STAR>>`).replace(/\*/g,`[^/]*`).replace(/<<DOUBLE_STAR_SLASH>>/g,`(.*\\/)?`).replace(/<<DOUBLE_STAR>>/g,`.*`);if(RegExp(`.*${t}`).test(n))return!0}return!1}function E(e,t){if(t===h)return e.replace(/\.tsx$/,``);let n=t.pattern.source;if(n.startsWith(`^`)&&n.endsWith(`$`)){if(n.includes(`\\.test\\.`)||n.includes(`\\.spec\\.`))return e.replace(/\.(test|spec)\.(tsx?|jsx?)$/,``);let t=e.match(/^([A-Z][a-zA-Z0-9]*)\.[a-z][-a-z]*\.tsx?$/);return t&&t[1]?t[1]:n.includes(`\\.types\\.`)?e.replace(/\.types\.ts$/,``):e.replace(/\.[^.]+$/,``)}return e.replace(t.pattern,``)}[...l];const D=/* @__PURE__ */ new Map;function O(e){let t=D.get(e);if(t!==void 0)return t;let n;try{n=r(e)}catch{n=!1}return D.set(e,n),n}const k=/^([A-Z][a-zA-Z0-9]*)\.[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)*\.ts$/;function A(e){return e.match(k)?.[1]??null}function j(e,t){let n=A(t);if(!n)return!1;let r=`${n}.tsx`,i=e.substring(0,e.lastIndexOf(`/`));return O(a.join(i,r))}function M(e){let t=e.replace(/\.(test|spec)\.(tsx|ts)$/,``);return y(t)||x(t)}function N(e,t){if(!(t.endsWith(`.test.tsx`)||t.endsWith(`.spec.tsx`)||t.endsWith(`.test.ts`)||t.endsWith(`.spec.ts`))||!M(t))return{status:`not-component-test`};let n=t.replace(/\.(test|spec)\.(tsx|ts)$/,`.tsx`),r=t.replace(/\.(test|spec)\.(tsx|ts)$/,`.ts`);if(e.includes(`/__tests__/`))return F(e,n)||F(e,r)?{status:`component-test-found`}:{status:`not-component-test`};if(e.includes(`/components/`)){let t=e.substring(0,e.lastIndexOf(`/`)),i=e.indexOf(`/components/`),o=e.substring(0,i+11),s=t;for(;;){if(P(s,n)||P(s,r))return{status:`component-test-found`};if(s===o)break;let e=a.dirname(s);if(e===s)break;s=e}}return{status:`not-component-test`}}function P(e,t){if(O(a.join(e,t)))return!0;try{let n=i(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()&&O(a.join(e,r.name,t)))return!0}catch{}return!1}function F(e,t){let n=e.indexOf(`/__tests__/`),r=e.substring(0,n),i=e.substring(n+11),o=a.dirname(i),s=o===`.`?r:a.join(r,o);for(;;){if(P(s,t))return!0;if(s===r)break;let e=a.dirname(s);if(e===s)break;s=e}return!1}function I(e){return typeof e==`object`&&!!e}function L(e,t){let n=I(t)?t:void 0;return!!(n?.skipPatterns?.length&&T(e,n.skipPatterns))}const R=t({meta:{type:`problem`,docs:{description:`强制执行文件命名规范`},schema:[{type:`object`,properties:{skipPatterns:{type:`array`,items:{type:`string`}}},additionalProperties:!1}]},createOnce(e){return{before(){if(L(e.filename,e.options?.[0])||w(e.filename.replace(/\\/g,`/`).split(`/`).pop()??``))return!1},Program(t){if(L(e.filename,e.options?.[0]))return;let n=e.filename.replace(/\\/g,`/`).split(`/`).pop()??``,r=e.filename.replace(/\\/g,`/`),i=C(n);if(i!==`hooks`&&j(r,n))return;if(N(r,n).status===`component-test-found`){let e=n.replace(/\.(test|spec)\.(tsx|ts)$/,``);if(y(e)||x(e))return}if(i!==null){let r=i===`hooks`?`hook 文件应使用 use 前缀小驼峰且不带后缀,如 useRepos.ts`:i===`component`?`组件文件应使用大驼峰且不带后缀,如 RepoList.tsx`:`.${i} 后缀语义过于泛化,请改用具体语义后缀`;e.report({node:t,message:`文件命名违规: ${n}。禁用 .${i} 后缀,${r}`});return}let a=g.find(e=>e.pattern.test(n));a&&(ee(E(n,a),a.caseStyle)||e.report({node:t,message:`文件命名违规: ${n}。${a.description}`}))}}}}),ne=[`.types.ts`,`.types.d.ts`];function z(e){return ne.some(t=>e.endsWith(t))}const B=t({meta:{type:`problem`,docs:{description:`强制执行 types 文件中的接口命名规范(禁止 I 前缀)`}},createOnce(t){return{before(){let e=t.filename.replace(/\\/g,`/`).split(`/`).pop()??``;if(e.endsWith(`.test.ts`)||e.endsWith(`.spec.ts`)||!z(e))return!1},TSInterfaceDeclaration(n){let r=n.id.name;e(r)&&t.report({node:n,message:`类型文件中的接口名 "${r}" 使用了 I 前缀。现代 TypeScript 不推荐使用匈牙利命名法,建议使用 "${r.substring(1)}"`})}}}}),V=[`impl`,`functions`,`methods`,`handlers`,`classes`,`class`,`manager`,`object`,`processor`,`process`,`common`,`logic`],H=/* @__PURE__ */ new Set([`index.ts`,`index.tsx`,`main.ts`,`main.tsx`,`App.tsx`,`types.ts`,`errors.ts`,`constants.ts`,`types.d.ts`,`persistence.ts`,`typeorm.ts`,`migrate.ts`,`seed.ts`,`hono.ts`,`react.ts`,`vue.ts`,`next.ts`,`electron.ts`,`browser.ts`,`node.ts`]);function U(e){if(!e.endsWith(`.ts`)&&!e.endsWith(`.tsx`))return!1;let t=e.replace(/\.tsx?$/,``);return/^use[A-Z][a-zA-Z0-9]*$/.test(t)}function W(e){if(!e.endsWith(`.tsx`))return!1;let t=e.replace(`.tsx`,``);return/^[A-Z][a-zA-Z0-9]*$/.test(t)}function G(e){return/^v\d+(-[a-z0-9-]+)?\.ts$/.test(e)}function K(e){let t=e.replace(/\.tsx?$/,``);return[/s$/,/es$/,/ies$/].some(e=>e.test(t))}function q(e){return e.endsWith(`.types.ts`)?!0:/^[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*\.tsx?$/.test(e)||/^[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*\.tsx?$/.test(e)}function J(e){let t=e.replace(/\.tsx?$/,``);for(let e of V){if(t.endsWith(`.${e}`))return e;let n=t.split(`.`);if(n.length>=2&&n[n.length-1]===e)return e}return null}function Y(e){let t=[],n=e.replace(/\.tsx?$/,``);return(n.includes(`service`)||n.includes(`Service`))&&t.push(`.service.ts`),(n.includes(`controller`)||n.includes(`Controller`))&&t.push(`.controller.ts`),(n.includes(`utils`)||n.includes(`helper`))&&t.push(`.utils.ts`),(n.includes(`constant`)||n.includes(`Constant`))&&t.push(`.constants.ts`),(n.includes(`config`)||n.includes(`Config`))&&t.push(`.config.ts`),t.length===0&&t.push(`.utils.ts`,`.config.ts`,`.constants.ts`),t}function X(e){for(let t of[`.test.ts`,`.test.tsx`,`.spec.ts`,`.spec.tsx`])if(e.endsWith(t)){let n=t.endsWith(`.tsx`)?`.tsx`:`.ts`;return e.replace(t,n)}return e}function Z(e){return typeof e==`object`&&!!e}function re(e,t,n,r){return!!(n?.skipPatterns&&T(r,n.skipPatterns)||H.has(t)||t.endsWith(`.d.ts`)||e.startsWith(`[`)||e.startsWith(`_`)||t.endsWith(`.tsx`)||e.endsWith(`.test.ts`)||e.endsWith(`.test.tsx`)||e.endsWith(`.spec.ts`)||e.endsWith(`.spec.tsx`)||G(t)||W(t)||U(t)||!J(t)&&K(t))}const Q=t({meta:{type:`problem`,docs:{description:`强制执行文件类型后缀规范,确保文件名明确表达其用途`},schema:[{type:`object`,properties:{skipPatterns:{type:`array`,items:{type:`string`}}},additionalProperties:!1}]},createOnce(e){return{Program(t){let n=e.options?.[0],r=Z(n)?n:void 0,i=e.filename.replace(/\\/g,`/`).split(`/`).pop()??``,a=X(i);if(re(i,a,r,e.filename))return;let o=J(a);if(o){e.report({node:t,message:`文件 "${i}" 使用了禁止的后缀 ".${o}"。该后缀语义过于泛化,无法表达文件用途。请使用更具体的后缀,如 ".utils"、".service" 等。`});return}if(q(a))return;let s=Y(a);e.report({node:t,message:`文件 "${i}" 缺少类型后缀。除特殊文件外,所有文件应使用 xxx.yyy.ts 格式明确表达用途。建议: ${s.join(`, `)}`})}}}}),$=n({meta:{name:`@longzai-intelligence-oxlint/file-naming-plugin`},rules:{"file-naming":R,"require-type-naming":B,"require-type-suffix":Q}});export{$ as default,$ as fileNamingPlugin,R as fileNamingRule,B as requireTypeNamingRule,Q as requireTypeSuffixRule};
1
+ import"../rolldown-runtime-BqT_7tdF.js";import{n as e}from"../dist-CskvMq7J.js";import{defineRule as t,eslintCompatPlugin as n}from"@oxlint/plugins";import{existsSync as r,readdirSync as i}from"node:fs";import a from"node:path";const o=[`index.ts`,`index.tsx`,`main.ts`,`main.tsx`,`App.tsx`],s=[`types.ts`,`errors.ts`,`constants.ts`],c=[`persistence.ts`,`typeorm.ts`,`hono.ts`,`react.ts`,`vue.ts`,`next.ts`,`electron.ts`,`browser.ts`,`node.ts`],l=[...o,...s,...c],u=[`impl`,`functions`,`methods`,`handlers`,`classes`,`class`,`manager`,`object`,`processor`,`process`,`common`,`logic`,`hooks`,`component`],d=[{pattern:/^use[A-Z][a-zA-Z]*\.spec\.tsx?$/,caseStyle:`camelCase`,description:`Hook 测试文件应使用 camelCase 并以 use 前缀开头(如 useChat.spec.ts)`},{pattern:/^use[A-Z][a-zA-Z]*\.test\.tsx?$/,caseStyle:`camelCase`,description:`Hook 测试文件应使用 camelCase 并以 use 前缀开头(如 useChat.test.ts)`},{pattern:/^use[A-Z][a-zA-Z]*\.types\.ts$/,caseStyle:`camelCase`,description:`Hook 类型文件应使用 camelCase 并以 use 前缀开头(如 useChat.types.ts)`},{pattern:/\.spec\.ts$/,caseStyle:`kebab-case-test`,description:`测试文件应使用 xxx.spec.ts 格式(kebab-case)`},{pattern:/\.test\.ts$/,caseStyle:`kebab-case-test`,description:`测试文件应使用 xxx.test.ts 格式(kebab-case)`},{pattern:/\.spec\.tsx$/,caseStyle:`kebab-case-test`,description:`测试文件应使用 xxx.spec.tsx 格式(kebab-case)`},{pattern:/\.test\.tsx$/,caseStyle:`kebab-case-test`,description:`测试文件应使用 xxx.test.tsx 格式(kebab-case)`},{pattern:/^use[A-Z][a-zA-Z]*\.tsx?$/,caseStyle:`camelCase`,description:`Hook 文件应使用 camelCase 并以 use 前缀开头(如 useChat.ts)`}],f=[{pattern:/\.service\.drizzle\.ts$/,caseStyle:`kebab-case`,description:`Drizzle Service 文件应使用 xxx.service.drizzle.ts 格式(kebab-case)`},{pattern:/\.service\.memory\.ts$/,caseStyle:`kebab-case`,description:`Memory Service 文件应使用 xxx.service.memory.ts 格式(kebab-case)`},{pattern:/\.service\.ts$/,caseStyle:`kebab-case`,description:`服务文件应使用 xxx.service.ts 格式(kebab-case)`},{pattern:/\.controller\.ts$/,caseStyle:`kebab-case`,description:`控制器文件应使用 xxx.controller.ts 格式(kebab-case)`},{pattern:/\.module\.ts$/,caseStyle:`kebab-case`,description:`模块文件应使用 xxx.module.ts 格式(kebab-case)`},{pattern:/\.repository\.drizzle\.ts$/,caseStyle:`kebab-case`,description:`Drizzle Repository 文件应使用 xxx.repository.drizzle.ts 格式(kebab-case)`},{pattern:/\.repository\.memory\.ts$/,caseStyle:`kebab-case`,description:`Memory Repository 文件应使用 xxx.repository.memory.ts 格式(kebab-case)`},{pattern:/\.repository\.interface\.ts$/,caseStyle:`kebab-case`,description:`Repository 接口文件应使用 xxx.repository.interface.ts 格式(kebab-case)`},{pattern:/\.repository\.types\.ts$/,caseStyle:`kebab-case`,description:`Repository 类型文件应使用 xxx.repository.types.ts 格式(kebab-case)`},{pattern:/\.repository\.ts$/,caseStyle:`kebab-case`,description:`Repository 文件应使用 xxx.repository.ts 格式(kebab-case)`},{pattern:/\.entity\.types\.ts$/,caseStyle:`kebab-case`,description:`Entity 类型文件应使用 xxx.entity.types.ts 格式(kebab-case)`},{pattern:/\.entity\.interface\.ts$/,caseStyle:`kebab-case`,description:`Entity 接口文件应使用 xxx.entity.interface.ts 格式(kebab-case)`},{pattern:/\.entity\.ts$/,caseStyle:`kebab-case`,description:`Entity 文件应使用 xxx.entity.ts 格式(kebab-case)`},{pattern:/\.dto\.ts$/,caseStyle:`kebab-case`,description:`DTO 文件应使用 xxx.dto.ts 格式(kebab-case)`},{pattern:/\.port\.interface\.ts$/,caseStyle:`kebab-case`,description:`Port 接口文件应使用 xxx.port.interface.ts 格式(kebab-case)`},{pattern:/\.interface\.ts$/,caseStyle:`kebab-case`,description:`接口文件应使用 xxx.interface.ts 格式(kebab-case)`},{pattern:/\.interface\.tsx$/,caseStyle:`kebab-case`,description:`接口文件应使用 xxx.interface.tsx 格式(kebab-case)`},{pattern:/\.types\.ts$/,caseStyle:`kebab-case`,description:`类型文件应使用 xxx.types.ts 格式(kebab-case)`},{pattern:/\.schema\.ts$/,caseStyle:`kebab-case`,description:`Schema 文件应使用 xxx.schema.ts 格式(kebab-case)`},{pattern:/\.port\.ts$/,caseStyle:`kebab-case`,description:`Port 文件应使用 xxx.port.ts 格式(kebab-case)`},{pattern:/\.port-adapter\.factory\.ts$/,caseStyle:`kebab-case`,description:`Port Adapter Factory 文件应使用 xxx.port-adapter.factory.ts 格式(kebab-case)`},{pattern:/\.port-adapter\.ts$/,caseStyle:`kebab-case`,description:`Port Adapter 文件应使用 xxx.port-adapter.ts 格式(kebab-case)`},{pattern:/\.adapter\.ts$/,caseStyle:`kebab-case`,description:`Adapter 文件应使用 xxx.adapter.ts 格式(kebab-case)`},{pattern:/\.client\.ts$/,caseStyle:`kebab-case`,description:`客户端文件应使用 xxx.client.ts 格式(kebab-case)`},{pattern:/\.events\.ts$/,caseStyle:`kebab-case`,description:`Events 文件应使用 xxx.events.ts 格式(kebab-case)`},{pattern:/\.mapper\.ts$/,caseStyle:`kebab-case`,description:`Mapper 文件应使用 xxx.mapper.ts 格式(kebab-case)`},{pattern:/\.ipc\.ts$/,caseStyle:`kebab-case`,description:`IPC 文件应使用 xxx.ipc.ts 格式(kebab-case)`},{pattern:/\.config\.ts$/,caseStyle:`kebab-case`,description:`配置文件应使用 xxx.config.ts 格式(kebab-case)`},{pattern:/\.errors\.ts$/,caseStyle:`kebab-case`,description:`错误文件应使用 xxx.errors.ts 格式(kebab-case)`},{pattern:/\.utils\.ts$/,caseStyle:`kebab-case`,description:`工具函数文件应使用 xxx.utils.ts 格式(kebab-case)`},{pattern:/\.constants\.ts$/,caseStyle:`kebab-case`,description:`常量文件应使用 xxx.constants.ts 格式(kebab-case)`},{pattern:/\.atom\.ts$/,caseStyle:`kebab-case`,description:`Atom 文件应使用 xxx.atom.ts 格式(kebab-case)`},{pattern:/\.vo\.ts$/,caseStyle:`kebab-case`,description:`值对象文件应使用 xxx.vo.ts 格式(kebab-case)`},{pattern:/\.usecase\.ts$/,caseStyle:`kebab-case`,description:`UseCase 文件应使用 xxx.usecase.ts 格式(kebab-case)`},{pattern:/\.styles\.css$/,caseStyle:`kebab-case`,description:`样式文件应使用 xxx.styles.css 格式(kebab-case)`},{pattern:/\.extension\.tsx?$/,caseStyle:`kebab-case`,description:`扩展文件应使用 xxx.extension.ts(x) 格式(kebab-case)`}],p=[{pattern:/^[A-Z][a-zA-Z0-9]*\.types\.ts$/,caseStyle:`PascalCase`,description:`类型文件可使用 PascalCase(如 DataExtractor.types.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.utils\.ts$/,caseStyle:`PascalCase`,description:`工具函数文件可使用 PascalCase(如 DataExtractor.utils.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.constants\.ts$/,caseStyle:`PascalCase`,description:`常量文件可使用 PascalCase(如 ByteVisualizer.constants.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.guards\.ts$/,caseStyle:`PascalCase`,description:`守卫文件可使用 PascalCase(如 DataExtractor.guards.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.helpers\.ts$/,caseStyle:`PascalCase`,description:`辅助函数文件可使用 PascalCase(如 TableVisualizer.helpers.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.groups\.ts$/,caseStyle:`PascalCase`,description:`分组文件可使用 PascalCase(如 TableVisualizer.groups.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.type-guards\.ts$/,caseStyle:`PascalCase`,description:`类型守卫文件可使用 PascalCase(如 TableVisualizer.type-guards.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.test\.ts$/,caseStyle:`PascalCase`,description:`测试文件可使用 PascalCase(如 DataExtractor.test.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.[a-z][-a-z]*\.test\.ts$/,caseStyle:`PascalCase`,description:`伴生测试文件可使用 PascalCase(如 DataExtractor.guards.test.ts)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.[a-z][-a-z]*\.test\.tsx$/,caseStyle:`PascalCase`,description:`伴生测试文件可使用 PascalCase(如 PacketCompare.test.tsx)`},{pattern:/^[A-Z][a-zA-Z0-9]*\.test\.tsx$/,caseStyle:`PascalCase`,description:`测试文件可使用 PascalCase(如 ByteVisualizer.test.tsx)`}],m={pattern:/^[a-z][a-zA-Z0-9_-]*\.tsx$/,caseStyle:`PascalCase`,description:`组件文件应使用 PascalCase(如 ChatPage.tsx),小写开头不允许`},h={pattern:/^[A-Z][a-zA-Z0-9]*\.tsx$/,caseStyle:`PascalCase`,description:`React 组件文件可使用 PascalCase(如 ChatPage.tsx)`},g=[...d,...p,...f,m,h];function _(e){return/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(e)}function v(e){return e.split(`.`).every(e=>_(e)&&e.length>0)}function y(e){return/^[A-Z][a-zA-Z0-9]*$/.test(e)}function b(e){return/^[a-z][a-zA-Z0-9]*$/.test(e)}function x(e){let t=e.split(`.`)[0];return t!==void 0&&t.length>0&&y(t)}function S(e){return e.split(`.`).every(e=>_(e)&&e.length>0)}function ee(e,t){switch(t){case`kebab-case`:return v(e);case`PascalCase`:return y(e);case`camelCase`:return b(e);case`kebab-case-test`:return S(e);default:return!0}}function te(e){return/^v\d+(-[a-z0-9-]+)?\.ts$/.test(e)}function C(e){let t=e.replace(/\.tsx?$/,``);for(let e of u){if(t.endsWith(`.${e}`))return e;let n=t.split(`.`);if(n.length>=2&&n[n.length-1]===e)return e}return null}function w(e){return!!(l.includes(e)||e.endsWith(`.d.ts`)||te(e)||e.startsWith(`[`)||e.startsWith(`_`))}function T(e,t){let n=e.replace(/\\/g,`/`);for(let e of t){let t=e.replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*\*\//g,`<<DOUBLE_STAR_SLASH>>`).replace(/\*\*/g,`<<DOUBLE_STAR>>`).replace(/\*/g,`[^/]*`).replace(/<<DOUBLE_STAR_SLASH>>/g,`(.*\\/)?`).replace(/<<DOUBLE_STAR>>/g,`.*`);if(RegExp(`.*${t}`).test(n))return!0}return!1}function E(e,t){if(t===h)return e.replace(/\.tsx$/,``);let n=t.pattern.source;if(n.startsWith(`^`)&&n.endsWith(`$`)){if(n.includes(`\\.test\\.`)||n.includes(`\\.spec\\.`))return e.replace(/\.(test|spec)\.(tsx?|jsx?)$/,``);let t=e.match(/^([A-Z][a-zA-Z0-9]*)\.[a-z][-a-z]*\.tsx?$/);return t&&t[1]?t[1]:n.includes(`\\.types\\.`)?e.replace(/\.types\.ts$/,``):e.replace(/\.[^.]+$/,``)}return e.replace(t.pattern,``)}[...l];const D=/* @__PURE__ */ new Map;function O(e){let t=D.get(e);if(t!==void 0)return t;let n;try{n=r(e)}catch{n=!1}return D.set(e,n),n}const k=/^([A-Z][a-zA-Z0-9]*)\.[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)*\.ts$/;function A(e){return e.match(k)?.[1]??null}function j(e,t){let n=A(t);if(!n)return!1;let r=`${n}.tsx`,i=e.substring(0,e.lastIndexOf(`/`));return O(a.join(i,r))}function M(e){let t=e.replace(/\.(test|spec)\.(tsx|ts)$/,``);return y(t)||x(t)}function N(e,t){if(!(t.endsWith(`.test.tsx`)||t.endsWith(`.spec.tsx`)||t.endsWith(`.test.ts`)||t.endsWith(`.spec.ts`))||!M(t))return{status:`not-component-test`};let n=t.replace(/\.(test|spec)\.(tsx|ts)$/,`.tsx`),r=t.replace(/\.(test|spec)\.(tsx|ts)$/,`.ts`);if(e.includes(`/__tests__/`))return F(e,n)||F(e,r)?{status:`component-test-found`}:{status:`not-component-test`};if(e.includes(`/components/`)){let t=e.substring(0,e.lastIndexOf(`/`)),i=e.indexOf(`/components/`),o=e.substring(0,i+11),s=t;for(;;){if(P(s,n)||P(s,r))return{status:`component-test-found`};if(s===o)break;let e=a.dirname(s);if(e===s)break;s=e}}return{status:`not-component-test`}}function P(e,t){if(O(a.join(e,t)))return!0;try{let n=i(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()&&O(a.join(e,r.name,t)))return!0}catch{}return!1}function F(e,t){let n=e.indexOf(`/__tests__/`),r=e.substring(0,n),i=e.substring(n+11),o=a.dirname(i),s=o===`.`?r:a.join(r,o);for(;;){if(P(s,t))return!0;if(s===r)break;let e=a.dirname(s);if(e===s)break;s=e}return!1}function I(e){return typeof e==`object`&&!!e}function L(e,t){let n=I(t)?t:void 0;return!!(n?.skipPatterns?.length&&T(e,n.skipPatterns))}const R=t({meta:{type:`problem`,docs:{description:`强制执行文件命名规范`},schema:[{type:`object`,properties:{skipPatterns:{type:`array`,items:{type:`string`}}},additionalProperties:!1}]},createOnce(e){return{before(){if(L(e.filename,e.options?.[0])||w(e.filename.replace(/\\/g,`/`).split(`/`).pop()??``))return!1},Program(t){if(L(e.filename,e.options?.[0]))return;let n=e.filename.replace(/\\/g,`/`).split(`/`).pop()??``,r=e.filename.replace(/\\/g,`/`),i=C(n);if(i!==`hooks`&&j(r,n))return;if(N(r,n).status===`component-test-found`){let e=n.replace(/\.(test|spec)\.(tsx|ts)$/,``);if(y(e)||x(e))return}if(i!==null){let r=i===`hooks`?`hook 文件应使用 use 前缀小驼峰且不带后缀,如 useRepos.ts`:i===`component`?`组件文件应使用大驼峰且不带后缀,如 RepoList.tsx`:`.${i} 后缀语义过于泛化,请改用具体语义后缀`;e.report({node:t,message:`文件命名违规: ${n}。禁用 .${i} 后缀,${r}`});return}let a=g.find(e=>e.pattern.test(n));a&&(ee(E(n,a),a.caseStyle)||e.report({node:t,message:`文件命名违规: ${n}。${a.description}`}))}}}}),ne=[`.types.ts`,`.types.d.ts`];function z(e){return ne.some(t=>e.endsWith(t))}const B=t({meta:{type:`problem`,docs:{description:`强制执行 types 文件中的接口命名规范(禁止 I 前缀)`}},createOnce(t){return{before(){let e=t.filename.replace(/\\/g,`/`).split(`/`).pop()??``;if(e.endsWith(`.test.ts`)||e.endsWith(`.spec.ts`)||!z(e))return!1},TSInterfaceDeclaration(n){let r=n.id.name;e(r)&&t.report({node:n,message:`类型文件中的接口名 "${r}" 使用了 I 前缀。现代 TypeScript 不推荐使用匈牙利命名法,建议使用 "${r.substring(1)}"`})}}}}),V=[`impl`,`functions`,`methods`,`handlers`,`classes`,`class`,`manager`,`object`,`processor`,`process`,`common`,`logic`],H=/* @__PURE__ */ new Set([`index.ts`,`index.tsx`,`main.ts`,`main.tsx`,`App.tsx`,`bootstrap.ts`,`types.ts`,`errors.ts`,`constants.ts`,`types.d.ts`,`persistence.ts`,`typeorm.ts`,`migrate.ts`,`seed.ts`,`hono.ts`,`react.ts`,`vue.ts`,`next.ts`,`electron.ts`,`browser.ts`,`node.ts`]);function U(e){if(!e.endsWith(`.ts`)&&!e.endsWith(`.tsx`))return!1;let t=e.replace(/\.tsx?$/,``);return/^use[A-Z][a-zA-Z0-9]*$/.test(t)}function W(e){if(!e.endsWith(`.tsx`))return!1;let t=e.replace(`.tsx`,``);return/^[A-Z][a-zA-Z0-9]*$/.test(t)}function G(e){return/^v\d+(-[a-z0-9-]+)?\.ts$/.test(e)}function K(e){let t=e.replace(/\.tsx?$/,``);return[/s$/,/es$/,/ies$/].some(e=>e.test(t))}function q(e){return e.endsWith(`.types.ts`)?!0:/^[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*\.tsx?$/.test(e)||/^[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*\.tsx?$/.test(e)}function J(e){let t=e.replace(/\.tsx?$/,``);for(let e of V){if(t.endsWith(`.${e}`))return e;let n=t.split(`.`);if(n.length>=2&&n[n.length-1]===e)return e}return null}function Y(e){let t=[],n=e.replace(/\.tsx?$/,``);return(n.includes(`service`)||n.includes(`Service`))&&t.push(`.service.ts`),(n.includes(`controller`)||n.includes(`Controller`))&&t.push(`.controller.ts`),(n.includes(`utils`)||n.includes(`helper`))&&t.push(`.utils.ts`),(n.includes(`constant`)||n.includes(`Constant`))&&t.push(`.constants.ts`),(n.includes(`config`)||n.includes(`Config`))&&t.push(`.config.ts`),t.length===0&&t.push(`.utils.ts`,`.config.ts`,`.constants.ts`),t}function X(e){for(let t of[`.test.ts`,`.test.tsx`,`.spec.ts`,`.spec.tsx`])if(e.endsWith(t)){let n=t.endsWith(`.tsx`)?`.tsx`:`.ts`;return e.replace(t,n)}return e}function Z(e){return typeof e==`object`&&!!e}function re(e,t,n,r){return!!(n?.skipPatterns&&T(r,n.skipPatterns)||H.has(t)||t.endsWith(`.d.ts`)||e.startsWith(`[`)||e.startsWith(`_`)||t.endsWith(`.tsx`)||e.endsWith(`.test.ts`)||e.endsWith(`.test.tsx`)||e.endsWith(`.spec.ts`)||e.endsWith(`.spec.tsx`)||G(t)||W(t)||U(t)||!J(t)&&K(t))}const Q=t({meta:{type:`problem`,docs:{description:`强制执行文件类型后缀规范,确保文件名明确表达其用途`},schema:[{type:`object`,properties:{skipPatterns:{type:`array`,items:{type:`string`}}},additionalProperties:!1}]},createOnce(e){return{Program(t){let n=e.options?.[0],r=Z(n)?n:void 0,i=e.filename.replace(/\\/g,`/`).split(`/`).pop()??``,a=X(i);if(re(i,a,r,e.filename))return;let o=J(a);if(o){e.report({node:t,message:`文件 "${i}" 使用了禁止的后缀 ".${o}"。该后缀语义过于泛化,无法表达文件用途。请使用更具体的后缀,如 ".utils"、".service" 等。`});return}if(q(a))return;let s=Y(a);e.report({node:t,message:`文件 "${i}" 缺少类型后缀。除特殊文件外,所有文件应使用 xxx.yyy.ts 格式明确表达用途。建议: ${s.join(`, `)}`})}}}}),$=n({meta:{name:`@longzai-intelligence-oxlint/file-naming-plugin`},rules:{"file-naming":R,"require-type-naming":B,"require-type-suffix":Q}});export{$ as default,$ as fileNamingPlugin,R as fileNamingRule,B as requireTypeNamingRule,Q as requireTypeSuffixRule};
package/dist/react.js CHANGED
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{o as e,t}from"./base.entry-CKst6rs9.js";function n(n){let r=t();return{extends:[r],plugins:[`react`,`jsx-a11y`],...n,ignorePatterns:e([...r.ignorePatterns??[],...n?.ignorePatterns??[]])}}const r=n();export{r as default,n as defineConfig};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{o as e,t}from"./base.entry-BRRJVhQW.js";function n(n){let r=t();return{extends:[r],plugins:[`react`,`jsx-a11y`],...n,ignorePatterns:e([...r.ignorePatterns??[],...n?.ignorePatterns??[]])}}const r=n();export{r as default,n as defineConfig};
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{o as e}from"./base.entry-CKst6rs9.js";import{defineConfig as t}from"./react.js";const n=[`src/app.ts`,`config/dev.ts`,`config/prod.ts`],r=[`src/app.tsx`];function i(i){let a=[...i?.typeSuffixBaseSkipPatterns??[],...n],o=[...i?.fileNamingBaseSkipPatterns??[],...r],s={files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":[`error`,{skipPatterns:a}]}},c={files:[`**/*.tsx`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/file-naming":[`error`,{skipPatterns:o}]}},l=t();return{extends:[l],overrides:[s,c,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:e([...l.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{n as i,a as n,r,i as t};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{o as e}from"./base.entry-BRRJVhQW.js";import{defineConfig as t}from"./react.js";const n=[`src/app.ts`,`config/dev.ts`,`config/prod.ts`],r=[`src/app.tsx`];function i(i){let a=[...i?.typeSuffixBaseSkipPatterns??[],...n],o=[...i?.fileNamingBaseSkipPatterns??[],...r],s={files:[`**/*.ts`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":[`error`,{skipPatterns:a}]}},c={files:[`**/*.tsx`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/file-naming":[`error`,{skipPatterns:o}]}},l=t();return{extends:[l],overrides:[s,c,...i?.overrides??[]],...i?.rules?{rules:i.rules}:{},ignorePatterns:e([...l.ignorePatterns??[],...i?.ignorePatterns??[]])}}const a=i();export{n as i,a as n,r,i as t};
package/dist/taro.js CHANGED
@@ -1 +1 @@
1
- import"./react.js";export{r as TARO_FILE_NAMING_EXEMPT_PATTERNS,i as TARO_SPECIAL_FILE_PATTERNS,n as default,t as defineConfig}from"./taro.entry-DV-L1NDJ.js";
1
+ import"./react.js";export{r as TARO_FILE_NAMING_EXEMPT_PATTERNS,i as TARO_SPECIAL_FILE_PATTERNS,n as default,t as defineConfig}from"./taro.entry-CHCKR0fA.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-oxlint/presets",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Longzai Intelligence oxlint 配置预设",
5
5
  "keywords": [
6
6
  "config",
@@ -100,33 +100,33 @@
100
100
  "zod": "^4.4.3"
101
101
  },
102
102
  "devDependencies": {
103
- "@longzai-intelligence-oxlint/architecture-core-plugin": "0.2.0",
104
- "@longzai-intelligence-oxlint/architecture-electron-plugin": "0.2.0",
105
- "@longzai-intelligence-oxlint/architecture-library-plugin": "0.2.0",
106
- "@longzai-intelligence-oxlint/code-style-plugin": "0.2.0",
107
- "@longzai-intelligence-oxlint/composer-plugin": "0.2.0",
108
- "@longzai-intelligence-oxlint/core": "0.2.0",
109
- "@longzai-intelligence-oxlint/design-rules-plugin": "0.2.0",
110
- "@longzai-intelligence-oxlint/elysia-route-plugin": "0.2.0",
111
- "@longzai-intelligence-oxlint/eslint-config-plugin": "0.2.0",
112
- "@longzai-intelligence-oxlint/file-naming-plugin": "0.2.0",
113
- "@longzai-intelligence-oxlint/lzi-builder-config-plugin": "0.2.0",
114
- "@longzai-intelligence-oxlint/lzi-config-plugin": "0.2.0",
115
- "@longzai-intelligence-oxlint/nestjs-route-plugin": "0.2.0",
116
- "@longzai-intelligence-oxlint/package-json-plugin": "0.2.0",
117
- "@longzai-intelligence-oxlint/perfectionist-plugin": "0.2.0",
118
- "@longzai-intelligence-oxlint/react-plugin": "0.2.0",
119
- "@longzai-intelligence-oxlint/schema-type-separation-plugin": "0.2.0",
120
- "@longzai-intelligence-oxlint/stylistic-plugin": "0.2.0",
121
- "@longzai-intelligence-oxlint/tsconfig-plugin": "0.2.0",
122
- "@longzai-intelligence-oxlint/tsdoc-plugin": "0.2.0",
123
- "@longzai-intelligence-oxlint/tsdown-config-plugin": "0.2.0",
124
- "@longzai-intelligence-oxlint/tsup-config-plugin": "0.2.0",
125
- "@longzai-intelligence-oxlint/typeorm-plugin": "0.2.0",
126
- "@longzai-intelligence-oxlint/typescript-eslint-plugin": "0.2.0",
127
- "@longzai-intelligence-oxlint/utils": "0.2.0",
128
- "@longzai-intelligence-oxlint/vitest-config-plugin": "0.2.0",
129
- "@longzai-intelligence-oxlint/zod-plugin": "0.2.0",
103
+ "@longzai-intelligence-oxlint/architecture-core-plugin": "0.2.2",
104
+ "@longzai-intelligence-oxlint/architecture-electron-plugin": "0.2.2",
105
+ "@longzai-intelligence-oxlint/architecture-library-plugin": "0.2.2",
106
+ "@longzai-intelligence-oxlint/code-style-plugin": "0.2.2",
107
+ "@longzai-intelligence-oxlint/composer-plugin": "0.2.2",
108
+ "@longzai-intelligence-oxlint/core": "0.2.2",
109
+ "@longzai-intelligence-oxlint/design-rules-plugin": "0.2.2",
110
+ "@longzai-intelligence-oxlint/elysia-route-plugin": "0.2.2",
111
+ "@longzai-intelligence-oxlint/eslint-config-plugin": "0.2.2",
112
+ "@longzai-intelligence-oxlint/file-naming-plugin": "0.2.2",
113
+ "@longzai-intelligence-oxlint/lzi-builder-config-plugin": "0.2.2",
114
+ "@longzai-intelligence-oxlint/lzi-config-plugin": "0.2.2",
115
+ "@longzai-intelligence-oxlint/nestjs-route-plugin": "0.2.2",
116
+ "@longzai-intelligence-oxlint/package-json-plugin": "0.2.2",
117
+ "@longzai-intelligence-oxlint/perfectionist-plugin": "0.2.2",
118
+ "@longzai-intelligence-oxlint/react-plugin": "0.2.2",
119
+ "@longzai-intelligence-oxlint/schema-type-separation-plugin": "0.2.2",
120
+ "@longzai-intelligence-oxlint/stylistic-plugin": "0.2.2",
121
+ "@longzai-intelligence-oxlint/tsconfig-plugin": "0.2.2",
122
+ "@longzai-intelligence-oxlint/tsdoc-plugin": "0.2.2",
123
+ "@longzai-intelligence-oxlint/tsdown-config-plugin": "0.2.2",
124
+ "@longzai-intelligence-oxlint/tsup-config-plugin": "0.2.2",
125
+ "@longzai-intelligence-oxlint/typeorm-plugin": "0.2.2",
126
+ "@longzai-intelligence-oxlint/typescript-eslint-plugin": "0.2.2",
127
+ "@longzai-intelligence-oxlint/utils": "0.2.2",
128
+ "@longzai-intelligence-oxlint/vitest-config-plugin": "0.2.2",
129
+ "@longzai-intelligence-oxlint/zod-plugin": "0.2.2",
130
130
  "@vitest/coverage-v8": "^4.1.10"
131
131
  },
132
132
  "peerDependencies": {
@@ -1 +0,0 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import"./rolldown-runtime-BqT_7tdF-BqT_7tdF.js";import"./rolldown-runtime-BqT_7tdF-DsHBzDG-.js";import"./rolldown-runtime-BqT_7tdF-BT7sSRF3.js";import{i as e,n as t}from"./typescript-eslint.rules-j0Y80OGu.js";import{existsSync as n,readFileSync as r}from"node:fs";import{dirname as i,join as a}from"node:path";import{fileURLToPath as o}from"node:url";import{VITEST_CONFIG_EXPORT_NAMES as s}from"@longzai-intelligence-vitest/config/meta";const c=[`!lzi-*.config.ts`,`!lzi-*.config.mts`];function l(e){return[...e.filter(e=>!c.includes(e)),...c]}const u=[{files:[`**/*.d.ts`],rules:{"typescript/consistent-type-definitions":`off`}},{files:[`**/*.tsx`],rules:{"max-lines-per-function":[`error`,{max:100,skipBlankLines:!0,skipComments:!0}]}},{files:[`**/*.test.ts`,`**/*.test.tsx`,`**/*.spec.ts`,`**/*.spec.tsx`,`test/**/*.ts`,`test/**/*.tsx`,`**/__tests__/**/*.ts`,`**/__tests__/**/*.tsx`,`**/__mocks__/**/*.ts`,`**/__mocks__/**/*.tsx`,`**/vitest.setup.ts`],rules:{"max-lines":[`error`,{max:750,skipBlankLines:!0,skipComments:!0}],"max-lines-per-function":`off`,"@longzai-intelligence-oxlint/typescript-eslint-plugin/consistent-type-assertions":`off`,"typescript/no-non-null-assertion":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-tsdoc":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-param":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-returns":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-description":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-param-description":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-returns-description":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-type-param":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-description-tag":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/param-hyphen-format":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-blank-line-before-tags":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/separator-format":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/todo-format":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-throws":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-throws-type":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-deprecated-alternative":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-legacy-jsdoc-tags":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-placeholder-description":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-commented-code":`off`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-multiline-property-comment":`off`}},{files:[`**/lzi-kol-markdown.config.ts`,`**/lzi-rss-markdown.config.ts`,`**/lzi-nation-data.config.ts`,`**/lzi-youtube.config.ts`,`**/lzi-task.config.ts`,`**/lzi-okr.config.ts`,`**/lzi-roadmap.config.ts`],rules:{"@longzai-intelligence-oxlint/lzi-config-plugin/require-define-config":`off`}},{files:[`**/__tests__/helpers/setup.ts`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":`off`}},{files:[`**/scripts/**`],rules:{"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":`off`}}],d=[{shortName:`code-style`,packageName:`@longzai-intelligence-oxlint/code-style-plugin`},{shortName:`composer`,packageName:`@longzai-intelligence-oxlint/composer-plugin`},{shortName:`design-rules`,packageName:`@longzai-intelligence-oxlint/design-rules-plugin`},{shortName:`package-json`,packageName:`@longzai-intelligence-oxlint/package-json-plugin`},{shortName:`schema-type-separation`,packageName:`@longzai-intelligence-oxlint/schema-type-separation-plugin`},{shortName:`architecture-core`,packageName:`@longzai-intelligence-oxlint/architecture-core-plugin`},{shortName:`architecture-library`,packageName:`@longzai-intelligence-oxlint/architecture-library-plugin`},{shortName:`react`,packageName:`@longzai-intelligence-oxlint/react-plugin`},{shortName:`tsdoc`,packageName:`@longzai-intelligence-oxlint/tsdoc-plugin`},{shortName:`stylistic`,packageName:`@longzai-intelligence-oxlint/stylistic-plugin`},{shortName:`perfectionist`,packageName:`@longzai-intelligence-oxlint/perfectionist-plugin`},{shortName:`typescript-eslint`,packageName:`@longzai-intelligence-oxlint/typescript-eslint-plugin`},{shortName:`typeorm`,packageName:`@longzai-intelligence-oxlint/typeorm-plugin`},{shortName:`zod`,packageName:`@longzai-intelligence-oxlint/zod-plugin`},{shortName:`file-naming`,packageName:`@longzai-intelligence-oxlint/file-naming-plugin`},{shortName:`tsconfig`,packageName:`@longzai-intelligence-oxlint/tsconfig-plugin`},{shortName:`eslint-config`,packageName:`@longzai-intelligence-oxlint/eslint-config-plugin`},{shortName:`lzi-builder-config`,packageName:`@longzai-intelligence-oxlint/lzi-builder-config-plugin`},{shortName:`lzi-config`,packageName:`@longzai-intelligence-oxlint/lzi-config-plugin`},{shortName:`tsdown-config`,packageName:`@longzai-intelligence-oxlint/tsdown-config-plugin`},{shortName:`tsup-config`,packageName:`@longzai-intelligence-oxlint/tsup-config-plugin`},{shortName:`vitest-config`,packageName:`@longzai-intelligence-oxlint/vitest-config-plugin`},{shortName:`architecture-electron`,packageName:`@longzai-intelligence-oxlint/architecture-electron-plugin`},{shortName:`elysia-route`,packageName:`@longzai-intelligence-oxlint/elysia-route-plugin`},{shortName:`nestjs-route`,packageName:`@longzai-intelligence-oxlint/nestjs-route-plugin`}],f=[`code-style`,`composer`,`design-rules`,`package-json`,`schema-type-separation`,`architecture-core`,`architecture-library`,`react`,`tsdoc`,`stylistic`,`perfectionist`,`typescript-eslint`,`typeorm`,`zod`,`file-naming`,`tsconfig`,`eslint-config`,`lzi-builder-config`,`lzi-config`,`tsdown-config`,`tsup-config`,`vitest-config`],p=`@longzai-intelligence-oxlint/presets`;function m(e){let t=i(o(e));for(;;){let e=a(t,`package.json`);if(n(e))try{if(JSON.parse(r(e,`utf8`)).name===p)return t}catch{}let o=i(t);if(o===t)throw Error(`未能定位 \`${p}\` 包根,内置插件路径解析失败`);t=o}}const h=m(import.meta.url);function g(e){if(!d.some(t=>t.shortName===e))throw Error(`未登记的内置插件短名 \`${e}\`,请先补录 bundled-plugins 清单`);return a(h,`dist`,`plugins`,`${e}.js`)}function _(){return f.map(e=>g(e))}const v=_(),y={"import/no-relative-parent-imports":`error`},b={"@longzai-intelligence-oxlint/tsup-config-plugin/require-tsup-config-import":[`error`,{configPackagePath:`@longzai-intelligence-config/core/tsup`}],"@longzai-intelligence-oxlint/tsdown-config-plugin/require-tsdown-config-import":[`error`,{configPackagePath:`@longzai-intelligence-tsdown/core`,correctPresetNames:[`defineDomainImplementationConfig`,`defineDomainContractConfig`,`defineSharedKernelConfig`,`defineReactComponentsConfig`,`defineConfigPackageConfig`,`definePackageConfig`]}],"@longzai-intelligence-oxlint/vitest-config-plugin/require-vitest-config-import":[`error`,{configPackagePaths:[`@longzai-intelligence-config/core/vitest`,`@longzai-intelligence-vitest/config`],allowedExportNames:s,forbiddenExportNames:[`defineConfig`],excludedPaths:[`infrastructure/configs/vitest/vitest.config.ts`]}],"@longzai-intelligence-oxlint/eslint-config-plugin/require-eslint-config-import":[`error`,{configPackagePath:`@longzai-intelligence-config/core/eslint`,allowedCreateFunctions:[`createLibraryConfig`,`createDomainConfig`,`createReactConfig`,`createReactPluginConfig`,`createElectronConfig`,`createNextConfig`,`createNodeConfig`,`createMcpConfig`,`createNestConfig`,`createHonoConfig`,`createExpoConfig`],forbiddenDefaultExports:[`coreConfig`,`createCoreConfig`,`libraryConfig`,`domainConfig`,`reactConfig`,`electronConfig`,`nextConfig`,`nodeConfig`,`mcpConfig`,`nestConfig`,`honoConfig`,`expoConfig`]}]},x={"@longzai-intelligence-oxlint/architecture-core-plugin/business-leak":`off`,"@longzai-intelligence-oxlint/architecture-core-plugin/no-cross-package-relative-import":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/implementation-export-control":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/no-implementation-import-in-apps":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/domain-export-compliance":`error`,"@longzai-intelligence-oxlint/architecture-core-plugin/dependency-direction":`error`},S={"@longzai-intelligence-oxlint/code-style-plugin/no-inline-type-definition":`error`,"@longzai-intelligence-oxlint/code-style-plugin/prefer-split-export-const":`off`,"@longzai-intelligence-oxlint/code-style-plugin/require-interface-naming":`off`,"@longzai-intelligence-oxlint/code-style-plugin/require-dto-naming":`error`,"@longzai-intelligence-oxlint/code-style-plugin/require-class-suffix":`error`,"@longzai-intelligence-oxlint/code-style-plugin/no-class-suffix-alias":`error`,"@longzai-intelligence-oxlint/code-style-plugin/no-console":`error`,"@longzai-intelligence-oxlint/code-style-plugin/no-handwritten-shebang":`error`},C={"@longzai-intelligence-oxlint/composer-plugin/define-capability-validity":`error`,"@longzai-intelligence-oxlint/composer-plugin/inject-graph-acyclic":`error`},w={"@longzai-intelligence-oxlint/design-rules-plugin/no-hardcoded-color":`error`,"@longzai-intelligence-oxlint/design-rules-plugin/no-hardcoded-spacing":`error`,"@longzai-intelligence-oxlint/design-rules-plugin/no-magic-z-index":`error`},T={"@longzai-intelligence-oxlint/eslint-config-plugin/require-eslint-config-import":`error`},E={"@longzai-intelligence-oxlint/file-naming-plugin/file-naming":`error`,"@longzai-intelligence-oxlint/file-naming-plugin/require-type-naming":`error`,"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":`error`},D={"@longzai-intelligence-oxlint/lzi-builder-config-plugin/require-bin-banner":`error`,"@longzai-intelligence-oxlint/lzi-builder-config-plugin/require-version-injection":`error`},O={"@longzai-intelligence-oxlint/lzi-config-plugin/no-empty-define-config":`error`,"@longzai-intelligence-oxlint/lzi-config-plugin/require-define-config":`error`},k={"@longzai-intelligence-oxlint/package-json-plugin/no-app-infrastructure-dependency":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-bare-tsgo-invocation":`warn`,"@longzai-intelligence-oxlint/package-json-plugin/no-domain-layer-subpath-export":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-hoistable-dev-dependency":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-mit-license":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-sibling-implementation-dependency":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-src-exports":`warn`,"@longzai-intelligence-oxlint/package-json-plugin/no-ui-domain-package-dependency":`error`,"@longzai-intelligence-oxlint/package-json-plugin/require-full-project-bin-name":`warn`},A={"@longzai-intelligence-oxlint/perfectionist-plugin/sort-imports":`error`,"@longzai-intelligence-oxlint/perfectionist-plugin/sort-named-imports":`error`},j={"@longzai-intelligence-oxlint/react-plugin/no-incorrect-hook-naming":`error`},M={"@longzai-intelligence-oxlint/schema-type-separation-plugin/no-type-in-schema":`off`,"@longzai-intelligence-oxlint/schema-type-separation-plugin/no-schema-in-types":`off`},N={"@longzai-intelligence-oxlint/stylistic-plugin/multiline-comment-style":`error`,"@longzai-intelligence-oxlint/stylistic-plugin/lines-around-comment":[`error`,{beforeBlockComment:!0,beforeLineComment:!1,allowBlockStart:!0,allowBlockEnd:!0,allowObjectStart:!0,allowObjectEnd:!0,allowArrayStart:!0,allowArrayEnd:!0,allowClassStart:!0,allowClassEnd:!0,allowInterfaceStart:!0,allowInterfaceEnd:!0,allowTypeStart:!0,allowTypeEnd:!0,allowEnumStart:!0,allowEnumEnd:!0,allowModuleStart:!0,allowModuleEnd:!0}],"@longzai-intelligence-oxlint/stylistic-plugin/padding-line-between-statements":`error`},P={"@longzai-intelligence-oxlint/tsconfig-plugin/tsconfig-references":`error`},F={"@longzai-intelligence-oxlint/tsdoc-plugin/require-tsdoc":[`error`,{checkAllVariables:!0}],"@longzai-intelligence-oxlint/tsdoc-plugin/require-param":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-returns":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-description":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-param-description":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-returns-description":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-type-param":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-description-tag":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/param-hyphen-format":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-blank-line-before-tags":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/separator-format":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/todo-format":`warn`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-throws":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-throws-type":`warn`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-deprecated-alternative":`warn`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-legacy-jsdoc-tags":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-placeholder-description":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-commented-code":`warn`,"@longzai-intelligence-oxlint/tsdoc-plugin/no-extra-param":`error`,"@longzai-intelligence-oxlint/tsdoc-plugin/require-multiline-property-comment":`error`},I={"@longzai-intelligence-oxlint/tsdown-config-plugin/require-tsdown-config-import":`error`},L={"@longzai-intelligence-oxlint/tsup-config-plugin/require-tsup-config-import":`error`},R={"@longzai-intelligence-oxlint/typeorm-plugin/no-string-entity-ref":`error`,"@longzai-intelligence-oxlint/typeorm-plugin/require-take-with-skip":`error`},z={"@longzai-intelligence-oxlint/typescript-eslint-plugin/consistent-type-assertions":`error`},B={"@longzai-intelligence-oxlint/vitest-config-plugin/require-vitest-config-import":`error`},V={"@longzai-intelligence-oxlint/zod-plugin/prefer-top-level-string-formats":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-int":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-finite":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-safe":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-step":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-is-finite":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-is-int":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-record-single-arg":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-deprecated-error-params":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-deprecated-format-methods":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-merge-method":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-superrefine":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-errors-property":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-deprecated-object-methods":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-native-enum":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-deep-partial":`error`,"@longzai-intelligence-oxlint/zod-plugin/no-promise-schema":`error`,"@longzai-intelligence-oxlint/zod-plugin/prefer-error-param":`error`,"@longzai-intelligence-oxlint/zod-plugin/prefer-zod-namespace":`warn`,"@longzai-intelligence-oxlint/zod-plugin/consistent-schema-var-name":`warn`,"@longzai-intelligence-oxlint/zod-plugin/no-any-schema":`warn`,"@longzai-intelligence-oxlint/zod-plugin/no-throw-in-refine":`warn`,"@longzai-intelligence-oxlint/zod-plugin/prefer-safe-parse":`warn`,"@longzai-intelligence-oxlint/zod-plugin/prefer-meta":`warn`,"@longzai-intelligence-oxlint/zod-plugin/require-error-message":`warn`,"@longzai-intelligence-oxlint/zod-plugin/no-optional-and-default-together":`error`,"@longzai-intelligence-oxlint/zod-plugin/prefer-enum-over-literal-union":`error`},H={...S,...C,...w,...k,...M,...x,...j,...F,...N,...A,...z,...R,...V,...E,...P,...T,...D,...O,...I,...L,...B},U={"@longzai-intelligence-oxlint/perfectionist-plugin/sort-imports":`off`,"@longzai-intelligence-oxlint/perfectionist-plugin/sort-named-imports":`off`,"@longzai-intelligence-oxlint/file-naming-plugin/require-type-suffix":`error`,"@longzai-intelligence-oxlint/zod-plugin/prefer-top-level-string-formats":`off`,"@longzai-intelligence-oxlint/zod-plugin/no-number-schema-with-int":`off`},W={...t,...y,...H,...b,...U};function G(t){return e({rules:{...W,...t?.rules},overrides:[...u,...t?.overrides??[]],jsPlugins:[...v],ignorePatterns:l(t?.ignorePatterns??[])})}const K=G();export{g as a,H as i,K as n,l as o,W as r,G as t};