@dsh-workbench/module-tools 0.2.12 → 0.2.14
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 +3 -3
- package/package.json +2 -2
- package/src/checks/bundles.mjs +36 -0
- package/src/checks/cards.mjs +410 -91
- package/src/checks/kit.mjs +2 -40
- package/src/checks/shell-artifact.mjs +51 -0
- package/src/checks/style.mjs +355 -13
- package/src/font-scale.mjs +213 -0
- package/template-diy/README.md.tpl +3 -3
package/README.md
CHANGED
|
@@ -22,14 +22,14 @@ dsh-wb-module publish # 发货前的清单:门禁 + 三张表 +
|
|
|
22
22
|
|---|---|
|
|
23
23
|
| `contracts` | 模块契约:单元 id 唯一、两个面、四个脚本、`files`、peer 下限;以及**清单 ↔ 代码**(真正注册的工具)与**底稿 ↔ 清单**(`design.json` 的能力名)两处对账(见下) |
|
|
24
24
|
| `protocol` | 模块声明协议:`dsh.workbench` 的 `apiVersion` 要在、静态半形状要对、不许有协议不认识的键(`scope` 现在**就是**不认识的键之一 —— 见下) |
|
|
25
|
-
| `bundles` | 产物边界:宿主面里不许出现浏览器侧的东西;浏览器产物里不许出现**内联的外壳 CSS**(模块从 `@dsh-workbench/shared` 根入口取运行期值就会这样)
|
|
25
|
+
| `bundles` | 产物边界:宿主面里不许出现浏览器侧的东西;浏览器产物里不许出现**内联的外壳 CSS**(模块从 `@dsh-workbench/shared` 根入口取运行期值就会这样) |;**产物里出现夹具标记(`wbMock` / `MockStrip` / `useFixturePick` / `-mock'` / `SCENES`…)判红** —— 模块不带夹具(见 `.scratch/dev-only-fixtures/spec.md`)
|
|
26
26
|
| `source` | 源码边界:不直接引 dsh 的包、不引不是种子词的 `@deepseek-ai/*` |
|
|
27
27
|
| `primitives` | dsh 原语只从模块表(`kit`)拿 |
|
|
28
28
|
| `kit` | 这份外壳的 kit 成员到底有哪些(缺什么会当场点名) |
|
|
29
|
-
| `cards` |
|
|
29
|
+
| `cards` | 卡片渲染:**七态 × zh/en 各渲一遍**(外壳侧输入 idle / loading / loading-刷新保留旧值 / ready / ready-空容器 / unreadable-error / unreadable-能力闸缺插件;`useApiResource` 与 `useCapabilityGate` 由判据喂,`useUnitBoard` 用模块仓里装的那份**真壳**)—— 不许抛、不许空白、文字里不许出现 `undefined` / `NaN` / `[object Object]` / `null`、不许裸键名、要套外壳的卡壳、清单 `titleKey` 在两语字典里都有落点。**不断言"画的是哪一态那一屏"**(那归模块自己的逐态测试与 `design.json` 状态矩阵);模块没装外壳时逐态那半跳过、单次全桩渲染照旧跑 |
|
|
30
30
|
| `standalone` | 独立构建:产物不依赖工坊里跑 |
|
|
31
31
|
| `markers` | 公开包无内部标识(内网域名、企业内部名) |
|
|
32
|
-
| `style` | 样式归属:模块不许定义外壳类(`wb-*`)的规则(判据看**复合选择器**,`:global(.wb-x)` 也算,只有同一个复合选择器里带模块自己的类才放行);**裸 `<a>` 与裸交互控件(`<button>` / `<input>` / `<select>`)都判红** —— 前者用 kit 的 `Link`,后者用 `Button` / `TextField` / `SelectField` / `ChoiceGroup`;只有 `<textarea>` 与 `input[type=hidden\|file]`
|
|
32
|
+
| `style` | 样式归属:模块不许定义外壳类(`wb-*`)的规则(判据看**复合选择器**,`:global(.wb-x)` 也算,只有同一个复合选择器里带模块自己的类才放行);**裸 `<a>` 与裸交互控件(`<button>` / `<input>` / `<select>`)都判红** —— 前者用 kit 的 `Link`,后者用 `Button` / `TextField` / `SelectField` / `ChoiceGroup`;只有 `<textarea>` 与 `input[type=hidden\|file]` 例外(两处都没有那种形态);**手写的「标签 + 控件」行(标签元素紧邻 `SelectField` / `TextField` / `ChoiceGroup` / `Input`)与模块自己给 `field`/`form` 容器设的行距(`gap` / 上下 `margin`)也判红** —— 这一层归 kit 的 `FormRow(s)`([ADR-0052](../../docs/adr/0052-the-form-row-is-one-component.md):面 → 行 → 控件);现存违规收进 `FORM_ROW_EXEMPT`(棘轮:迁一处删一行,且表里已经不再命中的行会当场报红);**手写的操作区(借了 `wb-formActions` 槽类手摆按钮)也判红** —— 操作区归 kit 的 `FormActions`([ADR-0054](../../docs/adr/0054-the-action-area-is-one-component.md):顺序 / 一个区一颗 `primary` / `danger` 的位置 / 间距 / 窄容器换行都由它定,调用点只给数据与语义),现存违规收进 `FORM_ACTIONS_EXEMPT`(同一套棘轮:迁一处删一行,表里不再命中的行当场报红) |
|
|
33
33
|
| `alias` | 模块不指外壳:源码里没有指向外壳 `@/` 的引用 |
|
|
34
34
|
|
|
35
35
|
三态输出:`✔ 通过` / `○ 不适用` / `✖ 不过`;有任何不过就退出 1。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dsh-workbench/module-tools",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.14",
|
|
4
4
|
"description": "模块包的构建与门禁工具:build(单文件 ESM 宿主侧 + 套 loader 壳的浏览器侧)、check(契约/产物边界/源码边界/卡片渲染)。模块包不再各带一份构建脚本。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"esbuild": "^0.28.2",
|
|
24
|
-
"@dsh-workbench/shared": "0.2.
|
|
24
|
+
"@dsh-workbench/shared": "0.2.14"
|
|
25
25
|
},
|
|
26
26
|
"scripts": {
|
|
27
27
|
"selfcheck": "node scripts/selfcheck.mjs"
|
package/src/checks/bundles.mjs
CHANGED
|
@@ -36,6 +36,30 @@ const HOST_FORBIDDEN = [
|
|
|
36
36
|
|
|
37
37
|
export const title = '模块产物边界';
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* 模块产物里的夹具标记 —— 这几串一出现就说明"夹具又长回模块里了"。
|
|
41
|
+
*
|
|
42
|
+
* 为什么是"串"而不是"符号":模块产物是打包后的 JS,符号名会被内联/保留,用固定串更稳。
|
|
43
|
+
* `-mock'` 那一条故意只匹配**带引号的模块路径尾巴**(`from './cmdb-mock'` 这类),
|
|
44
|
+
* 避免误伤 vitest 的 `vi.mock`(那在测试里,不进产物)。
|
|
45
|
+
*/
|
|
46
|
+
const FIXTURE_MARKERS = [
|
|
47
|
+
'wbMock',
|
|
48
|
+
'wbCrash',
|
|
49
|
+
'MockStrip',
|
|
50
|
+
'useFixturePick',
|
|
51
|
+
'mockModeOn',
|
|
52
|
+
'crashModeOn',
|
|
53
|
+
'-mock\'',
|
|
54
|
+
'"*-mock"',
|
|
55
|
+
'SCENES',
|
|
56
|
+
'fixtureOf',
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
function fixtureMarkersIn(source) {
|
|
60
|
+
return FIXTURE_MARKERS.filter((one) => source.includes(one));
|
|
61
|
+
}
|
|
62
|
+
|
|
39
63
|
export async function run() {
|
|
40
64
|
const modulePackages = discoverModulePackages({ root: process.cwd() });
|
|
41
65
|
const problems = [];
|
|
@@ -64,6 +88,18 @@ export async function run() {
|
|
|
64
88
|
);
|
|
65
89
|
}
|
|
66
90
|
}
|
|
91
|
+
// 夹具只属于**外壳开发者的调试**(.scratch/dev-only-fixtures/spec.md):外壳自 0.2.12 起
|
|
92
|
+
// 把它整棵树挪出发布构建,kit 面也不再提供那几个成员。模块带着夹具只有坏处:
|
|
93
|
+
// 取不到旧成员会当场抛(2026-10-17 实测三个模块无条件渲染的包装组件就是这么崩的),
|
|
94
|
+
// 而且夹具数据会跟真取数抢同一条渲染路径。这条盯**产物**:出现任何一个标记就红。
|
|
95
|
+
if (fixtureMarkersIn(source).length > 0) {
|
|
96
|
+
const hits = fixtureMarkersIn(source);
|
|
97
|
+
problems.push(
|
|
98
|
+
`${name}: ${artifact.what} ${artifact.file} 里有夹具(${hits.slice(0, 4).join(' · ')})—— ` +
|
|
99
|
+
'模块不带夹具:夹具只服务工作台开发者的调试(外壳那边走 `@/dev/surface` 接缝,发布构建里没有它),' +
|
|
100
|
+
'模块自己的 vitest 把几态各喂一遍就够。见 .scratch/dev-only-fixtures/spec.md',
|
|
101
|
+
);
|
|
102
|
+
}
|
|
67
103
|
// 外壳的组件样式**只有一份**(外壳注入那一次)。模块从 `@dsh-workbench/shared` 的**根入口**
|
|
68
104
|
// 取运行期值(`h` / `Fragment` / `useState` / 纯函数…)就会把整份组件 barrel 连 CSS 一起打进
|
|
69
105
|
// 自己的产物,注入后按顺序覆盖外壳那一份 —— 用户看到的是旧样式,而且外壳改了也不生效。
|