@longzai-intelligence-oxlint/package-json-plugin 0.1.34 → 0.1.36
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 +5 -0
- package/dist/configs/recommended.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -14,5 +14,6 @@ Longzai Intelligence Oxlint 的 package.json 治理插件,守护包元数据
|
|
|
14
14
|
- `no-sibling-implementation-dependency` — 禁止领域基础设施包依赖同域实现包
|
|
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
|
+
- `no-src-exports` — 禁止 exports 目标指向 `src` 源码,包导出一律指向 `dist` 产物,防止消费方程序拉入本包源码编译(统一 dist 产物范式,迁移期 warn 级别)
|
|
17
18
|
- `isPackageJson` 文件判断工具导出
|
|
18
19
|
- 同时兼容 Oxlint 与 ESLint 运行时
|
|
@@ -8,6 +8,11 @@ import { OxlintRules } from "@longzai-intelligence-oxlint/core";
|
|
|
8
8
|
* 强制执行落地),升级预设版本的仓立即受门禁约束。
|
|
9
9
|
* require-full-project-bin-name 为 warn 迁移期级别,工作区存量缩写命令名
|
|
10
10
|
* 清零后升为 error 收口,依据 ADR 0049 的 lint 收口时序
|
|
11
|
+
* no-bare-tsgo-invocation 为 warn 迁移期级别,typecheck 域现存 B2 类裸调
|
|
12
|
+
* tsc 存量清零后升为 error 收口,依据 ADR 0117 的 lint 收口时序
|
|
13
|
+
* no-src-exports 为 warn 迁移期级别,守护统一 dist 产物范式(包导出
|
|
14
|
+
* 一律指向产物、不被消费方拉入源码编译),产品群存量 src 导出清零后
|
|
15
|
+
* 升为 error 收口
|
|
11
16
|
*/
|
|
12
17
|
declare const recommended: OxlintRules;
|
|
13
18
|
//#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-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/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/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
|
|
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 te(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 f(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=te(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 h=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=f(r);for(let r of n)e.report({node:t,message:m(r)})}}catch{}}}}});function g(e){return/\/domains\/[^/]+\/implementation\/package\.json$/.test(e)}function _(e){return typeof e==`object`&&!!e}function ne(e,t){if(e===`./domain`)return!0;let n=typeof t==`string`?t:_(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 v={noDomainLayerSubpathExport:"禁止领域实现包声明领域分层子路径导出(ADR 0101):领域分层(domain/)为 implementation 包内私有,仓储端口应落位 contract 包;`./domain` 类子导出属违规逃逸通道。"},y=e({meta:{type:`problem`,docs:{description:`禁止领域实现包声明领域分层子路径导出(ADR 0101 违规逃逸通道)`}},createOnce(e){return{before(){if(!g(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!_(r)||!_(r.exports))return;for(let[n,i]of Object.entries(r.exports))n!==`.`&&ne(n,i)&&e.report({node:t,message:`${v.noDomainLayerSubpathExport}(发现子路径 "${n}")`})}catch{}}}}}),b=/* @__PURE__ */ new Set([`@types/bun`,`@types/node`,`@typescript/native-preview`,`oxfmt`,`oxlint`,`tsdown`,`turbo`]),x=[`@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/`],S=/* @__PURE__ */ new Set([`@longzai-intelligence/typescript-config`]),C=/* @__PURE__ */ new Set([`@longzai-intelligence-dev-tools/vite-plugin`,`@longzai-intelligence-typescript/rolldown-plugin-type-boundary`]);function w(e){return/\/(apps|packages|domains|plugins)\//.test(e)&&e.endsWith(`/package.json`)}function T(e){return C.has(e)?!1:b.has(e)||S.has(e)?!0:x.some(t=>e.startsWith(t))}function E(e){return typeof e==`object`&&!!e}const D=e({meta:{type:`problem`,docs:{description:`禁止子包声明应放 workspace 根的开发依赖,依据 ADR 0036 根已声明与应放根类别由根统一承载`}},createOnce(e){return{before(){if(!w(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!E(r)||!E(r.devDependencies)||`workspaces`in r)return;let i=Object.keys(r.devDependencies).filter(T);i.length>0&&e.report({node:t,message:`禁止子包声明应放 workspace 根的开发依赖,ADR 0036 判定根已声明与应放根类别均由根统一承载,子包经 Bun hoisting 取用。发现依赖 [${i.join(`, `)}]。`})}catch{}}}}});function O(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}function k(e){return typeof e==`object`&&!!e}const A={noMitLicense:`禁止使用 MIT 协议。项目中的所有包都应使用 "license": "UNLICENSED"。`},j=e({meta:{type:`problem`,docs:{description:`禁止在 package.json 中使用 MIT 协议`}},createOnce(e){return{before(){let t=e.filename;if(!O(t))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);k(r)&&r.license===`MIT`&&e.report({node:t,message:A.noMitLicense})}catch{}}}}});function M(e){return/\/domains\/[^/]+\/infrastructure\/package\.json$/.test(e)}function N(e){return e.endsWith(`-infrastructure`)?`${e.slice(0,-15)}-implementation`:null}function P(e){return typeof e==`object`&&!!e}const F=e({meta:{type:`problem`,docs:{description:`禁止领域基础设施包依赖同域实现包(ADR 0101 依赖图只允许 infrastructure ──> contract)`}},createOnce(e){return{before(){if(!M(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!P(r)||typeof r.name!=`string`)return;let i=N(r.name);if(!i||!P(r.dependencies))return;i in r.dependencies&&e.report({node:t,message:`禁止领域基础设施包依赖同域实现包(ADR 0101):依赖图只允许 infrastructure ──> contract,发现依赖 "${i}"。`})}catch{}}}}});function I(e){return e.endsWith(`/package.json`)}const L=/^(?:\.{1,2}\/)?src\//;function R(e){return typeof e==`object`&&!!e}function z(e,t,n){if(typeof t==`string`){L.test(t)&&n.push({subpath:e,target:t});return}if(R(t))for(let r of Object.values(t))z(e,r,n)}function B(e){let t=[];if(typeof e==`string`)return z(`.`,e,t),t;if(R(e))for(let[n,r]of Object.entries(e))z(n,r,t);return t}const V={noSrcExports:`禁止 exports 指向 src 源码(统一 dist 产物范式):包导出一律指向 dist 产物,指向源码会使消费方程序拉入本包源码编译。`},H=e({meta:{type:`problem`,docs:{description:`禁止 exports 指向 src 源码(统一 dist 产物范式门禁)`}},createOnce(e){return{before(){if(!I(e.filename.replace(/\\/g,`/`)))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!R(r))return;let i=B(r.exports);for(let n of i)e.report({node:t,message:`${V.noSrcExports}(发现 "${n.subpath}" 指向 "${n.target}")`})}catch{}}}}}),U=[`mcp`,`cli`,`tui`,`dev`];function W(e){return e.replace(/\\/g,`/`).endsWith(`/package.json`)}const G=/^@longzai-intelligence-([a-z0-9][a-z0-9-]*)\//,K=/^longzai-intelligence-[a-z0-9][a-z0-9-]*$/;function q(e){return typeof e==`object`&&!!e}function J(e){let t=e.replace(/\\/g,`/`).split(`/`);for(let e=t.length-2;e>=0;--e){let n=t[e];if(n!==void 0&&K.test(n))return n.slice(21)}return null}function Y(e){let t=G.exec(e);return t===null?null:t[1]??null}function X(e,t){return J(e)??Y(t)}function Z(e){return`lzi-${e}`}function Q(e){return e.includes(`/`)?e.slice(e.indexOf(`/`)+1):e}function re(e,t,n){let r=Z(t),i=U.find(t=>e===t||e.endsWith(`-${t}`));if(i!==void 0)return`${r}-${i}`;if(n===void 0)return r;let a=Q(n);return e.endsWith(`-${a}`)?`${r}-${a}`:r}function ie(e,t,n){let r=Z(t);return e===r||U.some(t=>e===`${r}-${t}`)?!0:n!==void 0&&e===`${r}-${Q(n)}`}function ae(e,t){let n=e.bin;return typeof n==`string`?[Q(t)]:q(n)?Object.keys(n):[]}const oe={invalidBinName:`bin 命令名不符合 ADR 0049 完整名称规范,命令名须为 lzi- 前缀加项目全名的 kebab-case 形态,禁止缩写`};function se(e,t){return`${oe.invalidBinName},实际命令名为 "${e}",应为 "${t}"。`}const ce=e({meta:{type:`problem`,docs:{description:`校验 package.json 的 bin 命令名使用项目全名,禁止缩写,依据 ADR 0049`}},createOnce(e){return{before(){let t=e.filename;if(!W(t))return!1},Program(t){let n=e.sourceCode.text;try{let r=JSON.parse(n);if(!q(r)||typeof r.name!=`string`||r.bin===void 0||r.name.includes(`{{`))return;let i=X(e.filename,r.name);if(i===null)return;let a=ae(r,r.name);for(let n of a)n.includes(`{{`)||ie(n,i,r.name)||e.report({node:t,message:se(n,re(n,i,r.name))})}catch{}}}}}),$=t({meta:{name:`@longzai-intelligence-oxlint/package-json-plugin`},rules:{"no-app-infrastructure-dependency":a,"no-bare-tsgo-invocation":h,"no-domain-layer-subpath-export":y,"no-hoistable-dev-dependency":D,"no-mit-license":j,"no-sibling-implementation-dependency":F,"no-src-exports":H,"require-full-project-bin-name":ce}});export{$ as default,$ as packageJsonPlugin,O as isPackageJson,j 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.36",
|
|
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.36",
|
|
47
47
|
"@oxlint/plugins": "^1.74.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|