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

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
@@ -1,13 +1,17 @@
1
1
  # @longzai-intelligence-oxlint/package-json-plugin
2
2
 
3
- Longzai Intelligence Oxlint 的 package.json 治理插件,守护包元数据的许可证合规。
3
+ Longzai Intelligence Oxlint 的 package.json 治理插件,守护包元数据的许可证、依赖边界与 bin 命名合规。
4
4
 
5
5
  ## 简介
6
6
 
7
- 治理包声明不合规的问题:package.json 文件中不合规的许可证声明在静态检查阶段校验并拦截,防止违规协议流入包元数据。
7
+ 治理包声明不合规的问题:package.json 文件中不合规的许可证声明、领域包依赖边越界与 bin 命令名缩写在静态检查阶段校验并拦截,防止违规内容流入包元数据。
8
8
 
9
9
  ## 能力
10
10
 
11
11
  - `no-mit-license` — 校验 package.json 是否使用 MIT 许可证并予以拦截
12
+ - `no-app-infrastructure-dependency` — 禁止领域包依赖应用基础设施包
13
+ - `no-domain-layer-subpath-export` — 禁止领域分层包的子路径导出
14
+ - `no-sibling-implementation-dependency` — 禁止领域基础设施包依赖同域实现包
15
+ - `require-full-project-bin-name` — 校验 bin 命令名使用 `lzi-` 前缀加项目全名,禁止缩写(ADR 0049,迁移期 warn 级别)
12
16
  - `isPackageJson` 文件判断工具导出
13
17
  - 同时兼容 Oxlint 与 ESLint 运行时
@@ -3,7 +3,9 @@ import { OxlintRules } from "@longzai-intelligence-oxlint/core";
3
3
  /**
4
4
  * 推荐规则配置
5
5
  *
6
- * 启用 no-mit-license 与领域包边界两规则为 error 级别(ADR 0101 门禁)
6
+ * 启用 no-mit-license 与领域包边界两规则为 error 级别(ADR 0101 门禁)。
7
+ * require-full-project-bin-name 为 warn 迁移期级别,工作区存量缩写命令名
8
+ * 清零后升为 error 收口,依据 ADR 0049 的 lint 收口时序
7
9
  */
8
10
  declare const recommended: OxlintRules;
9
11
  //#endregion
@@ -1 +1 @@
1
- const e={"@longzai-intelligence-oxlint/package-json-plugin/no-app-infrastructure-dependency":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-domain-layer-subpath-export":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-mit-license":`error`,"@longzai-intelligence-oxlint/package-json-plugin/no-sibling-implementation-dependency":`error`};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-domain-layer-subpath-export":`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/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{}}}}});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=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}});export{y as default,y 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,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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-oxlint/package-json-plugin",
3
- "version": "0.1.27",
3
+ "version": "0.1.29",
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.27",
46
+ "@longzai-intelligence-oxlint/core": "0.1.29",
47
47
  "@oxlint/plugins": "^1.74.0"
48
48
  },
49
49
  "devDependencies": {