@longzai-intelligence-oxlint/package-json-plugin 0.1.45 → 0.1.47
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.
- package/README.md +1 -0
- package/dist/configs/recommended.d.ts +3 -0
- package/dist/configs/recommended.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -15,5 +15,6 @@ Longzai Intelligence Oxlint 的 package.json 治理插件,守护包元数据
|
|
|
15
15
|
- `no-hoistable-dev-dependency` — 禁止子包声明应放 workspace 根的开发依赖(ADR 0036,error 级别,精确根清单比对门禁归 `lzi-dependencies` 的 `hoisting check` 命令)
|
|
16
16
|
- `require-full-project-bin-name` — 校验 bin 命令名使用 `lzi-` 前缀加项目全名,可追加功能后缀或本包子名全称,禁止缩写(ADR 0049,迁移期 warn 级别)
|
|
17
17
|
- `no-src-exports` — 禁止 exports 目标指向 `src` 源码,包导出一律指向 `dist` 产物,防止消费方程序拉入本包源码编译(统一 dist 产物范式,迁移期 warn 级别)
|
|
18
|
+
- `no-ui-domain-package-dependency` — 禁止 `domains/<域>/ui` 包声明域内四层依赖,`-domain`、`-contract`、`-implementation`、`-infrastructure` 后缀一律拦截,UI 面域外依赖唯一指向生成式 sdk 客户端(ADR 0127,error 级别)
|
|
18
19
|
- `isPackageJson` 文件判断工具导出
|
|
19
20
|
- 同时兼容 Oxlint 与 ESLint 运行时
|
|
@@ -13,6 +13,9 @@ import { OxlintRules } from "@longzai-intelligence-oxlint/core";
|
|
|
13
13
|
* no-src-exports 为 warn 迁移期级别,守护统一 dist 产物范式(包导出
|
|
14
14
|
* 一律指向产物、不被消费方拉入源码编译),产品群存量 src 导出清零后
|
|
15
15
|
* 升为 error 收口
|
|
16
|
+
* no-ui-domain-package-dependency 为 error 级别(ADR 0127 门禁),
|
|
17
|
+
* ui 层域内四层依赖属已裁定错误范式,存量经 domain-refactoring
|
|
18
|
+
* 工作流 007 分波清偿,各仓收口前存量红不阻塞
|
|
16
19
|
*/
|
|
17
20
|
declare const recommended: OxlintRules;
|
|
18
21
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e={"@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/require-full-project-bin-name":`warn`};export{e as recommended};
|
|
1
|
+
const e={"@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`};export{e as recommended};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineRule as e,eslintCompatPlugin as t}from"@oxlint/plugins";function n(e){return/\/(apps|packages)\//.test(e)&&e.endsWith(`/package.json`)}function r(e){return e.endsWith(`-infrastructure`)}function i(e){return typeof e==`object`&&!!e}const a=e({meta:{type:`problem`,docs:{description:`禁止 apps/packages 层声明领域基础设施包依赖(ADR 0102:域细节只经域公开面流出)`}},createOnce(e){return{before(){if(!n(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let a=JSON.parse(n);if(!i(a)||!i(a.dependencies))return;let o=Object.keys(a.dependencies).filter(r);o.length>0&&e.report({node:t,message:`禁止 apps/packages 层声明领域基础设施包依赖(ADR 0102):域的持久化实现细节只经域公开面流出。发现依赖 [${o.join(`, `)}]。`})}catch{}}}}}),o=/* @__PURE__ */ new Set([`tsgo`,`tsc`]),s={bareCompiler:`裸调 tsgo 或 tsc 执行类型检查`,legacyDevCliTypecheck:`使用 lzi-dev-cli typecheck 旧封装,应迁移至 lzi-tsgo typecheck`,wrapperWithoutConfig:`lzi-tsgo typecheck 未传 tsconfig 路径`,wrapperWithoutSubcommand:`调用 lzi-tsgo 未带 typecheck 子命令`};function ee(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}function c(e){return typeof e==`object`&&!!e}function l(e){return e===`typecheck`||e.startsWith(`typecheck:`)}function u(e){return e.split(/&&|\|\||;|\|/).map(e=>e.trim()).filter(e=>e.length>0)}function d(e){let t=e.split(/\s+/).filter(e=>e.length>0),n=``,r=[];for(let e of t)if(n)r.push(e);else{if(/^[A-Za-z_][A-Za-z0-9_]*=/.test(e))continue;n=e}return n?{command:n,args:r}:null}function
|
|
1
|
+
import{defineRule as e,eslintCompatPlugin as t}from"@oxlint/plugins";function n(e){return/\/(apps|packages)\//.test(e)&&e.endsWith(`/package.json`)}function r(e){return e.endsWith(`-infrastructure`)}function i(e){return typeof e==`object`&&!!e}const a=e({meta:{type:`problem`,docs:{description:`禁止 apps/packages 层声明领域基础设施包依赖(ADR 0102:域细节只经域公开面流出)`}},createOnce(e){return{before(){if(!n(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let a=JSON.parse(n);if(!i(a)||!i(a.dependencies))return;let o=Object.keys(a.dependencies).filter(r);o.length>0&&e.report({node:t,message:`禁止 apps/packages 层声明领域基础设施包依赖(ADR 0102):域的持久化实现细节只经域公开面流出。发现依赖 [${o.join(`, `)}]。`})}catch{}}}}}),o=/* @__PURE__ */ new Set([`tsgo`,`tsc`]),s={bareCompiler:`裸调 tsgo 或 tsc 执行类型检查`,legacyDevCliTypecheck:`使用 lzi-dev-cli typecheck 旧封装,应迁移至 lzi-tsgo typecheck`,wrapperWithoutConfig:`lzi-tsgo typecheck 未传 tsconfig 路径`,wrapperWithoutSubcommand:`调用 lzi-tsgo 未带 typecheck 子命令`};function ee(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}function c(e){return typeof e==`object`&&!!e}function l(e){return e===`typecheck`||e.startsWith(`typecheck:`)}function u(e){return e.split(/&&|\|\||;|\|/).map(e=>e.trim()).filter(e=>e.length>0)}function d(e){let t=e.split(/\s+/).filter(e=>e.length>0),n=``,r=[];for(let e of t)if(n)r.push(e);else{if(/^[A-Za-z_][A-Za-z0-9_]*=/.test(e))continue;n=e}return n?{command:n,args:r}:null}function f(e,t,n){let r=d(t);if(!r)return null;let i=r.command,a=r.args;return o.has(i)?n||a.includes(`--noEmit`)?{key:e,kind:`bareCompiler`,segment:t}:null:n?i===`lzi-tsgo`?a[0]===`typecheck`?a.slice(1).some(e=>!e.startsWith(`-`))?null:{key:e,kind:`wrapperWithoutConfig`,segment:t}:{key:e,kind:`wrapperWithoutSubcommand`,segment:t}:i===`lzi-dev-cli`&&a[0]===`typecheck`?{key:e,kind:`legacyDevCliTypecheck`,segment:t}:null:null}function te(e){let t=[];for(let[n,r]of Object.entries(e)){if(typeof r!=`string`)continue;let e=l(n);for(let i of u(r)){let r=f(n,i,e);r&&t.push(r)}}return t}function p(e){if(!c(e))return null;let t=e.scripts;return c(t)?t:null}function m(e){return`scripts 键 ${e.key} ${s[e.kind]}。类型检查统一使用 lzi-tsgo typecheck 加 tsconfig 路径,依据 ADR 0057 与 ADR 0117。`}const ne=e({meta:{type:`problem`,docs:{description:`禁止在 package.json scripts 中绕过 lzi-tsgo 封装执行类型检查`}},createOnce(e){return{before(){let t=e.filename;if(!ee(t))return!1},Program(t){let n=e.sourceCode.text;try{let r=p(JSON.parse(n));if(r){let n=te(r);for(let r of n)e.report({node:t,message:m(r)})}}catch{}}}}});function re(e){return/\/domains\/[^/]+\/implementation\/package\.json$/.test(e)}function h(e){return typeof e==`object`&&!!e}function ie(e,t){if(e===`./domain`)return!0;let n=typeof t==`string`?t:h(t)?[t.types,t.import,t.require,t.default].filter(e=>typeof e==`string`).join(` `):``;return/(^|\/)dist\/domain(\.|\/|$)/.test(n)||/(^|\/)src\/domain(\/|$)/.test(n)}const ae={noDomainLayerSubpathExport:"禁止领域实现包声明领域分层子路径导出(ADR 0101):领域分层(domain/)为 implementation 包内私有,仓储端口应落位 contract 包;`./domain` 类子导出属违规逃逸通道。"},g=e({meta:{type:`problem`,docs:{description:`禁止领域实现包声明领域分层子路径导出(ADR 0101 违规逃逸通道)`}},createOnce(e){return{before(){if(!re(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!h(r)||!h(r.exports))return;for(let[n,i]of Object.entries(r.exports))n!==`.`&&ie(n,i)&&e.report({node:t,message:`${ae.noDomainLayerSubpathExport}(发现子路径 "${n}")`})}catch{}}}}}),_=/* @__PURE__ */ new Set([`@types/bun`,`@types/node`,`@typescript/native-preview`,`oxfmt`,`oxlint`,`tsdown`,`turbo`]),v=[`@longzai-intelligence-agent-tools/`,`@longzai-intelligence-bun/`,`@longzai-intelligence-builder/`,`@longzai-intelligence-changelog/`,`@longzai-intelligence-decision/`,`@longzai-intelligence-dev-tools/`,`@longzai-intelligence-env/`,`@longzai-intelligence-git/`,`@longzai-intelligence-issues/`,`@longzai-intelligence-oxfmt/`,`@longzai-intelligence-oxlint/`,`@longzai-intelligence-release/`,`@longzai-intelligence-tsgo/`,`@longzai-intelligence-tsdown/`,`@longzai-intelligence-typescript/`,`@longzai-intelligence-vitest/`,`@longzai-intelligence-vscode/`],y=/* @__PURE__ */ new Set([`@longzai-intelligence/typescript-config`]),b=/* @__PURE__ */ new Set([`@longzai-intelligence-dev-tools/vite-plugin`,`@longzai-intelligence-typescript/rolldown-plugin-type-boundary`]);function x(e){return/\/(apps|packages|domains|plugins)\//.test(e)&&e.endsWith(`/package.json`)}function S(e){return b.has(e)?!1:_.has(e)||y.has(e)?!0:v.some(t=>e.startsWith(t))}function C(e){return typeof e==`object`&&!!e}const w=e({meta:{type:`problem`,docs:{description:`禁止子包声明应放 workspace 根的开发依赖,依据 ADR 0036 根已声明与应放根类别由根统一承载`}},createOnce(e){return{before(){if(!x(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!C(r)||!C(r.devDependencies)||`workspaces`in r)return;let i=Object.keys(r.devDependencies).filter(S);i.length>0&&e.report({node:t,message:`禁止子包声明应放 workspace 根的开发依赖,ADR 0036 判定根已声明与应放根类别均由根统一承载,子包经 Bun hoisting 取用。发现依赖 [${i.join(`, `)}]。`})}catch{}}}}});function T(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}function E(e){return typeof e==`object`&&!!e}const D={noMitLicense:`禁止使用 MIT 协议。项目中的所有包都应使用 "license": "UNLICENSED"。`},O=e({meta:{type:`problem`,docs:{description:`禁止在 package.json 中使用 MIT 协议`}},createOnce(e){return{before(){let t=e.filename;if(!T(t))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);E(r)&&r.license===`MIT`&&e.report({node:t,message:D.noMitLicense})}catch{}}}}});function k(e){return/\/domains\/[^/]+\/infrastructure\/package\.json$/.test(e)}function A(e){return e.endsWith(`-infrastructure`)?`${e.slice(0,-15)}-implementation`:null}function j(e){return typeof e==`object`&&!!e}const M=e({meta:{type:`problem`,docs:{description:`禁止领域基础设施包依赖同域实现包(ADR 0101 依赖图只允许 infrastructure ──> contract)`}},createOnce(e){return{before(){if(!k(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!j(r)||typeof r.name!=`string`)return;let i=A(r.name);if(!i||!j(r.dependencies))return;i in r.dependencies&&e.report({node:t,message:`禁止领域基础设施包依赖同域实现包(ADR 0101):依赖图只允许 infrastructure ──> contract,发现依赖 "${i}"。`})}catch{}}}}});function N(e){return e.endsWith(`/package.json`)}const P=/^(?:\.{1,2}\/)?src\//;function F(e){return typeof e==`object`&&!!e}function I(e,t,n){if(typeof t==`string`)P.test(t)&&n.push({subpath:e,target:t});else if(F(t))for(let r of Object.values(t))I(e,r,n)}function L(e){let t=[];if(typeof e==`string`)return I(`.`,e,t),t;if(F(e))for(let[n,r]of Object.entries(e))I(n,r,t);return t}const R={noSrcExports:`禁止 exports 指向 src 源码(统一 dist 产物范式):包导出一律指向 dist 产物,指向源码会使消费方程序拉入本包源码编译。`},z=e({meta:{type:`problem`,docs:{description:`禁止 exports 指向 src 源码(统一 dist 产物范式门禁)`}},createOnce(e){return{before(){if(!N(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!F(r))return;let i=L(r.exports);for(let n of i)e.report({node:t,message:`${R.noSrcExports}(发现 "${n.subpath}" 指向 "${n.target}")`})}catch{}}}}}),B=[`-domain`,`-contract`,`-implementation`,`-infrastructure`];function V(e){return/\/domains\/[^/]+\/ui\/package\.json$/.test(e)}function H(e){return B.some(t=>e.endsWith(t))}function U(e){return typeof e==`object`&&!!e}const W=e({meta:{type:`problem`,docs:{description:`禁止 domains ui 层声明域内四层包依赖,ADR 0127:UI 面域外依赖唯一指向生成式 sdk 客户端`}},createOnce(e){return{before(){if(!V(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!U(r)||!U(r.dependencies))return;let i=Object.keys(r.dependencies).filter(H);i.length>0&&e.report({node:t,message:`禁止 ui 层声明域内包依赖,ADR 0127:UI 面域外依赖唯一指向生成式 sdk 客户端,DDD 主体对 ui 全封闭。发现依赖 [${i.join(`, `)}]。`})}catch{}}}}}),G=[`mcp`,`cli`,`tui`,`dev`];function K(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}const q=/^@longzai-intelligence-([a-z0-9][a-z0-9-]*)\//,J=/^longzai-intelligence-[a-z0-9][a-z0-9-]*$/;function Y(e){return typeof e==`object`&&!!e}function oe(e){let t=e.replace(/\\/g,`/`).split(`/`);for(let e=t.length-2;e>=0;--e){let n=t[e];if(n!==void 0&&J.test(n))return n.slice(21)}return null}function se(e){let t=q.exec(e);return t===null?null:t[1]??null}function ce(e,t){return oe(e)??se(t)}function X(e){return`lzi-${e}`}function Z(e){return e.includes(`/`)?e.slice(e.indexOf(`/`)+1):e}function le(e,t,n){let r=X(t),i=G.find(t=>e===t||e.endsWith(`-${t}`));if(i!==void 0)return`${r}-${i}`;if(n===void 0)return r;let a=Z(n);return e.endsWith(`-${a}`)?`${r}-${a}`:r}function ue(e,t,n){let r=X(t);return e===r||G.some(t=>e===`${r}-${t}`)?!0:n!==void 0&&e===`${r}-${Z(n)}`}function Q(e,t){let n=e.bin;return typeof n==`string`?[Z(t)]:Y(n)?Object.keys(n):[]}const de={invalidBinName:`bin 命令名不符合 ADR 0049 完整名称规范,命令名须为 lzi- 前缀加项目全名的 kebab-case 形态,禁止缩写`};function fe(e,t){return`${de.invalidBinName},实际命令名为 "${e}",应为 "${t}"。`}const pe=e({meta:{type:`problem`,docs:{description:`校验 package.json 的 bin 命令名使用项目全名,禁止缩写,依据 ADR 0049`}},createOnce(e){return{before(){let t=e.filename;if(!K(t))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!Y(r)||typeof r.name!=`string`||r.bin===void 0||r.name.includes(`{{`))return;let i=ce(e.filename,r.name);if(i===null)return;let a=Q(r,r.name);for(let n of a)n.includes(`{{`)||ue(n,i,r.name)||e.report({node:t,message:fe(n,le(n,i,r.name))})}catch{}}}}}),$=t({meta:{name:`@longzai-intelligence-oxlint/package-json-plugin`},rules:{"no-app-infrastructure-dependency":a,"no-bare-tsgo-invocation":ne,"no-domain-layer-subpath-export":g,"no-hoistable-dev-dependency":w,"no-mit-license":O,"no-sibling-implementation-dependency":M,"no-src-exports":z,"no-ui-domain-package-dependency":W,"require-full-project-bin-name":pe}});export{$ as default,$ as packageJsonPlugin,T as isPackageJson,O as noMitLicenseRule};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longzai-intelligence-oxlint/package-json-plugin",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.47",
|
|
4
4
|
"description": "Longzai Intelligence oxlint package.json 规则插件",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"longzai-intelligence",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"typecheck:test": "lzi-tsgo typecheck tsconfig/test.json"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@longzai-intelligence-oxlint/core": "0.1.
|
|
46
|
+
"@longzai-intelligence-oxlint/core": "0.1.47",
|
|
47
47
|
"@oxlint/plugins": "^1.74.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|