@longzai-intelligence-oxlint/package-json-plugin 0.1.29 → 0.1.31

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 CHANGED
@@ -12,6 +12,6 @@ Longzai Intelligence Oxlint 的 package.json 治理插件,守护包元数据
12
12
  - `no-app-infrastructure-dependency` — 禁止领域包依赖应用基础设施包
13
13
  - `no-domain-layer-subpath-export` — 禁止领域分层包的子路径导出
14
14
  - `no-sibling-implementation-dependency` — 禁止领域基础设施包依赖同域实现包
15
- - `require-full-project-bin-name` — 校验 bin 命令名使用 `lzi-` 前缀加项目全名,禁止缩写(ADR 0049,迁移期 warn 级别)
15
+ - `require-full-project-bin-name` — 校验 bin 命令名使用 `lzi-` 前缀加项目全名,可追加功能后缀或本包子名全称,禁止缩写(ADR 0049,迁移期 warn 级别)
16
16
  - `isPackageJson` 文件判断工具导出
17
17
  - 同时兼容 Oxlint 与 ESLint 运行时
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{}}}}});function o(e){return/\/domains\/[^/]+\/implementation\/package\.json$/.test(e)}function s(e){return typeof e==`object`&&!!e}function c(e,t){if(e===`./domain`)return!0;let n=typeof t==`string`?t:s(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 l={noDomainLayerSubpathExport:"禁止领域实现包声明领域分层子路径导出(ADR 0101):领域分层(domain/)为 implementation 包内私有,仓储端口应落位 contract 包;`./domain` 类子导出属违规逃逸通道。"},u=e({meta:{type:`problem`,docs:{description:`禁止领域实现包声明领域分层子路径导出(ADR 0101 违规逃逸通道)`}},createOnce(e){return{before(){if(!o(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!s(r)||!s(r.exports))return;for(let[n,i]of Object.entries(r.exports))n!==`.`&&c(n,i)&&e.report({node:t,message:`${l.noDomainLayerSubpathExport}(发现子路径 "${n}")`})}catch{}}}}});function d(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}function f(e){return typeof e==`object`&&!!e}const p={noMitLicense:`禁止使用 MIT 协议。项目中的所有包都应使用 "license": "UNLICENSED"。`},m=e({meta:{type:`problem`,docs:{description:`禁止在 package.json 中使用 MIT 协议`}},createOnce(e){return{before(){let t=e.filename;if(!d(t))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);f(r)&&r.license===`MIT`&&e.report({node:t,message:p.noMitLicense})}catch{}}}}});function h(e){return/\/domains\/[^/]+\/infrastructure\/package\.json$/.test(e)}function g(e){return e.endsWith(`-infrastructure`)?`${e.slice(0,-15)}-implementation`:null}function _(e){return typeof e==`object`&&!!e}const v=e({meta:{type:`problem`,docs:{description:`禁止领域基础设施包依赖同域实现包(ADR 0101 依赖图只允许 infrastructure ──> contract)`}},createOnce(e){return{before(){if(!h(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!_(r)||typeof r.name!=`string`)return;let i=g(r.name);if(!i||!_(r.dependencies))return;i in r.dependencies&&e.report({node:t,message:`禁止领域基础设施包依赖同域实现包(ADR 0101):依赖图只允许 infrastructure ──> contract,发现依赖 "${i}"。`})}catch{}}}}}),y=[`mcp`,`cli`,`tui`,`dev`];function b(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}const x=/^@longzai-intelligence-([a-z0-9][a-z0-9-]*)\//,S=/^longzai-intelligence-[a-z0-9][a-z0-9-]*$/;function C(e){return typeof e==`object`&&!!e}function w(e){let t=e.replace(/\\/g,`/`).split(`/`);for(let e=t.length-2;e>=0;--e){let n=t[e];if(n!==void 0&&S.test(n))return n.slice(21)}return null}function T(e){let t=x.exec(e);return t===null?null:t[1]??null}function E(e,t){return w(e)??T(t)}function D(e){return`lzi-${e}`}function O(e,t){let n=y.find(t=>e===t||e.endsWith(`-${t}`));return n===void 0?D(t):`${D(t)}-${n}`}function k(e,t){let n=D(t);return e===n||y.some(t=>e===`${n}-${t}`)}function A(e,t){let n=e.bin;return typeof n==`string`?[t.includes(`/`)?t.slice(t.indexOf(`/`)+1):t]:C(n)?Object.keys(n):[]}const j={invalidBinName:`bin 命令名不符合 ADR 0049 完整名称规范,命令名须为 lzi- 前缀加项目全名的 kebab-case 形态,禁止缩写`};function M(e,t){return`${j.invalidBinName},实际命令名为 "${e}",应为 "${t}"。`}const N=e({meta:{type:`problem`,docs:{description:`校验 package.json 的 bin 命令名使用项目全名,禁止缩写,依据 ADR 0049`}},createOnce(e){return{before(){let t=e.filename;if(!b(t))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!C(r)||typeof r.name!=`string`||r.bin===void 0||r.name.includes(`{{`))return;let i=E(e.filename,r.name);if(i===null)return;let a=A(r,r.name);for(let n of a)n.includes(`{{`)||k(n,i)||e.report({node:t,message:M(n,O(n,i))})}catch{}}}}}),P=t({meta:{name:`@longzai-intelligence-oxlint/package-json-plugin`},rules:{"no-app-infrastructure-dependency":a,"no-domain-layer-subpath-export":u,"no-mit-license":m,"no-sibling-implementation-dependency":v,"require-full-project-bin-name":N}});export{P as default,P as packageJsonPlugin,d as isPackageJson,m as noMitLicenseRule};
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{}}}}});function o(e){return/\/domains\/[^/]+\/implementation\/package\.json$/.test(e)}function s(e){return typeof e==`object`&&!!e}function c(e,t){if(e===`./domain`)return!0;let n=typeof t==`string`?t:s(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 l={noDomainLayerSubpathExport:"禁止领域实现包声明领域分层子路径导出(ADR 0101):领域分层(domain/)为 implementation 包内私有,仓储端口应落位 contract 包;`./domain` 类子导出属违规逃逸通道。"},u=e({meta:{type:`problem`,docs:{description:`禁止领域实现包声明领域分层子路径导出(ADR 0101 违规逃逸通道)`}},createOnce(e){return{before(){if(!o(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!s(r)||!s(r.exports))return;for(let[n,i]of Object.entries(r.exports))n!==`.`&&c(n,i)&&e.report({node:t,message:`${l.noDomainLayerSubpathExport}(发现子路径 "${n}")`})}catch{}}}}});function d(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}function f(e){return typeof e==`object`&&!!e}const p={noMitLicense:`禁止使用 MIT 协议。项目中的所有包都应使用 "license": "UNLICENSED"。`},m=e({meta:{type:`problem`,docs:{description:`禁止在 package.json 中使用 MIT 协议`}},createOnce(e){return{before(){let t=e.filename;if(!d(t))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);f(r)&&r.license===`MIT`&&e.report({node:t,message:p.noMitLicense})}catch{}}}}});function h(e){return/\/domains\/[^/]+\/infrastructure\/package\.json$/.test(e)}function g(e){return e.endsWith(`-infrastructure`)?`${e.slice(0,-15)}-implementation`:null}function _(e){return typeof e==`object`&&!!e}const v=e({meta:{type:`problem`,docs:{description:`禁止领域基础设施包依赖同域实现包(ADR 0101 依赖图只允许 infrastructure ──> contract)`}},createOnce(e){return{before(){if(!h(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!_(r)||typeof r.name!=`string`)return;let i=g(r.name);if(!i||!_(r.dependencies))return;i in r.dependencies&&e.report({node:t,message:`禁止领域基础设施包依赖同域实现包(ADR 0101):依赖图只允许 infrastructure ──> contract,发现依赖 "${i}"。`})}catch{}}}}}),y=[`mcp`,`cli`,`tui`,`dev`];function b(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}const x=/^@longzai-intelligence-([a-z0-9][a-z0-9-]*)\//,S=/^longzai-intelligence-[a-z0-9][a-z0-9-]*$/;function C(e){return typeof e==`object`&&!!e}function w(e){let t=e.replace(/\\/g,`/`).split(`/`);for(let e=t.length-2;e>=0;--e){let n=t[e];if(n!==void 0&&S.test(n))return n.slice(21)}return null}function T(e){let t=x.exec(e);return t===null?null:t[1]??null}function E(e,t){return w(e)??T(t)}function D(e){return`lzi-${e}`}function O(e){return e.includes(`/`)?e.slice(e.indexOf(`/`)+1):e}function k(e,t,n){let r=D(t),i=y.find(t=>e===t||e.endsWith(`-${t}`));if(i!==void 0)return`${r}-${i}`;if(n===void 0)return r;let a=O(n);return e.endsWith(`-${a}`)?`${r}-${a}`:r}function A(e,t,n){let r=D(t);return e===r||y.some(t=>e===`${r}-${t}`)?!0:n!==void 0&&e===`${r}-${O(n)}`}function j(e,t){let n=e.bin;return typeof n==`string`?[O(t)]:C(n)?Object.keys(n):[]}const M={invalidBinName:`bin 命令名不符合 ADR 0049 完整名称规范,命令名须为 lzi- 前缀加项目全名的 kebab-case 形态,禁止缩写`};function N(e,t){return`${M.invalidBinName},实际命令名为 "${e}",应为 "${t}"。`}const P=e({meta:{type:`problem`,docs:{description:`校验 package.json 的 bin 命令名使用项目全名,禁止缩写,依据 ADR 0049`}},createOnce(e){return{before(){let t=e.filename;if(!b(t))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!C(r)||typeof r.name!=`string`||r.bin===void 0||r.name.includes(`{{`))return;let i=E(e.filename,r.name);if(i===null)return;let a=j(r,r.name);for(let n of a)n.includes(`{{`)||A(n,i,r.name)||e.report({node:t,message:N(n,k(n,i,r.name))})}catch{}}}}}),F=t({meta:{name:`@longzai-intelligence-oxlint/package-json-plugin`},rules:{"no-app-infrastructure-dependency":a,"no-domain-layer-subpath-export":u,"no-mit-license":m,"no-sibling-implementation-dependency":v,"require-full-project-bin-name":P}});export{F as default,F as packageJsonPlugin,d as isPackageJson,m 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.29",
3
+ "version": "0.1.31",
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.29",
46
+ "@longzai-intelligence-oxlint/core": "0.1.31",
47
47
  "@oxlint/plugins": "^1.74.0"
48
48
  },
49
49
  "devDependencies": {