z-biz-tool-shared 0.1.6 → 0.1.7
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/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/product.d.ts +1 -1
- package/dist/types/product.d.ts.map +1 -1
- package/dist/types/product.js +2 -0
- package/dist/types/product.js.map +1 -1
- package/dist/types/productManifest.d.ts +91 -0
- package/dist/types/productManifest.d.ts.map +1 -0
- package/dist/types/productManifest.js +116 -0
- package/dist/types/productManifest.js.map +1 -0
- package/package.json +1 -1
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC"}
|
package/dist/types/index.js
CHANGED
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC"}
|
package/dist/types/product.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ import type { DeepLinkResult } from "../protocol/deeplink.js";
|
|
|
27
27
|
* 与 bundle id / 数据目录命名保持一致(`z-biz-tool-db` → `db`),
|
|
28
28
|
* 减少用户与开发者的心智负担。
|
|
29
29
|
*/
|
|
30
|
-
export type ProductId = "aigen" | "box" | "cpu" | "db" | "file" | "kb" | "math" | "mind" | "music" | "note" | "pet" | "sys" | "terminal" | "worker";
|
|
30
|
+
export type ProductId = "aigen" | "box" | "cpu" | "db" | "file" | "history" | "kb" | "math" | "mind" | "music" | "note" | "pet" | "remote" | "sys" | "terminal" | "worker";
|
|
31
31
|
/** 全部产品 id 的运行时列表。 */
|
|
32
32
|
export declare const PRODUCT_IDS: readonly ProductId[];
|
|
33
33
|
/** 判断一个字符串是不是合法的产品 id。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../../src/types/product.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,KAAK,GACL,KAAK,GACL,IAAI,GACJ,MAAM,GACN,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,GACL,KAAK,GACL,UAAU,GACV,QAAQ,CAAC;AAEb,sBAAsB;AACtB,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,
|
|
1
|
+
{"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../../src/types/product.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,KAAK,GACL,KAAK,GACL,IAAI,GACJ,MAAM,GACN,SAAS,GACT,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,GACL,QAAQ,GACR,KAAK,GACL,UAAU,GACV,QAAQ,CAAC;AAEb,sBAAsB;AACtB,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAiBlC,CAAC;AAEX,0BAA0B;AAC1B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAE7D;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,aAAa;IACb,EAAE,EAAE,SAAS,CAAC;IACd,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB,mCAAmC;IACnC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CA4B9E;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;CACxD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,WAAW,EAAE,GAC5B,eAAe,CAajB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,GACxB,WAAW,EAAE,CAOf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,GACb,WAAW,EAAE,CAEf"}
|
package/dist/types/product.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/types/product.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/types/product.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 产品自报文件的**读取与汇总** —— 「每条记录都有主人」的机器那一半。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么需要这一层
|
|
5
|
+
*
|
|
6
|
+
* `product.ts` 提供类型与校验,但真值分散在 16 个仓各自的 `product.json` 里。
|
|
7
|
+
* 谁来读、读完怎么对账,是这一层的事:
|
|
8
|
+
*
|
|
9
|
+
* - **读取**:把一个仓根目录下的 `product.json` 读成 `ProductMeta`,
|
|
10
|
+
* 并在读的时候就地校验(不合规的仓不该等到汇总时才被发现)。
|
|
11
|
+
* - **汇总**:把 N 份自报汇成一份 registry,重复 id 直接炸。
|
|
12
|
+
* - **对账**:把「自报的真值」与「协议层认识的产品集合」对齐 ——
|
|
13
|
+
* 少一个仓自报、或某个仓声明了协议层不存在的 id,都属于**家族契约破损**,
|
|
14
|
+
* 必须在 CI 里红,不能等用户在 box 面板上看到一张打不开的卡片才发现。
|
|
15
|
+
*
|
|
16
|
+
* ## 为什么不内置真值
|
|
17
|
+
*
|
|
18
|
+
* 见 `product.ts` 顶部:本模块只做**机制**,一条真值都不带。
|
|
19
|
+
* 谁的产品叫什么、支持什么动作,只有那个仓知道。
|
|
20
|
+
*/
|
|
21
|
+
import { isProductId, type ProductId, type ProductMeta, type ProductRegistry } from "./product.js";
|
|
22
|
+
import type { DeepLinkResult } from "../protocol/deeplink.js";
|
|
23
|
+
/**
|
|
24
|
+
* 自报文件在仓根的**相对路径**。
|
|
25
|
+
*
|
|
26
|
+
* 固定在仓根而不是 `src/` 里:这份文件是「这个仓向家族报什么」,
|
|
27
|
+
* 属于仓级契约,不是前端代码的一部分 —— 放在 `src/` 下会被
|
|
28
|
+
* 「前端源码」的构建/打包规则误伤。
|
|
29
|
+
*/
|
|
30
|
+
export declare const PRODUCT_MANIFEST_PATH = "product.json";
|
|
31
|
+
/**
|
|
32
|
+
* 自报文件的磁盘形状(camelCase,与 `ProductMeta` 的 JSON 序列化一致)。
|
|
33
|
+
*
|
|
34
|
+
* 与 `ProductMeta` 分开声明,是因为磁盘上的字段是**外部输入**:
|
|
35
|
+
* 多一个字段少一个字段都可能是别人的笔误,解析时要能指名报错,
|
|
36
|
+
* 而不是被 TS 的类型断言悄悄放过。
|
|
37
|
+
*/
|
|
38
|
+
export interface ProductManifestFile {
|
|
39
|
+
readonly id: string;
|
|
40
|
+
readonly displayName: string;
|
|
41
|
+
readonly description: string;
|
|
42
|
+
readonly acceptsDeepLink: boolean;
|
|
43
|
+
readonly actions: readonly string[];
|
|
44
|
+
readonly keywords?: readonly string[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 解析一个自报文件的内容。
|
|
48
|
+
*
|
|
49
|
+
* 与 `validateProductMeta` 的区别:这里管**磁盘形状**(字段在不在、类型对不对),
|
|
50
|
+
* 那里管**语义自洽**(id 合不合法、声明了动作却说自己不接深链这种矛盾)。
|
|
51
|
+
* 两层都要过。
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseProductManifest(raw: unknown): DeepLinkResult<ProductMeta>;
|
|
54
|
+
/**
|
|
55
|
+
* 把若干份自报汇总成 registry。
|
|
56
|
+
*
|
|
57
|
+
* 重复 id 直接抛错 —— 两个仓声明同一个产品 id 意味着有人改了协议没同步,
|
|
58
|
+
* 这在协议层必须炸出来,不能静默取最后一份。
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildRegistryFromManifests(manifests: readonly ProductManifestFile[]): ProductRegistry;
|
|
61
|
+
/**
|
|
62
|
+
* 对账结果。
|
|
63
|
+
*
|
|
64
|
+
* `missing` = 协议层认识、但没人生存自报的产品(**没人认领**)。
|
|
65
|
+
* `unknown` = 自报了自己、但协议层不认这个 id(**协议没同步**)。
|
|
66
|
+
*/
|
|
67
|
+
export interface ManifestReconciliation {
|
|
68
|
+
readonly ok: boolean;
|
|
69
|
+
/** 协议层认识但无人自报的产品 id */
|
|
70
|
+
readonly missing: readonly ProductId[];
|
|
71
|
+
/** 自报了但协议层不认识的 id */
|
|
72
|
+
readonly unknown: readonly string[];
|
|
73
|
+
/** 重复声明的 id */
|
|
74
|
+
readonly duplicated: readonly string[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 把「自报的真值」与「协议层认识的产品集合」对账。
|
|
78
|
+
*
|
|
79
|
+
* 两种破损都要报出来:
|
|
80
|
+
* - **无人认领**(missing):协议层说这个产品存在,但没有任何仓声明它 ——
|
|
81
|
+
* 要么那个仓忘了加 `product.json`,要么它已经下线了。
|
|
82
|
+
* - **协议没同步**(unknown):某个仓声明了协议层不存在的 id ——
|
|
83
|
+
* 多半是加了新产品但忘了同步 `cap-hub` / `shared` 的产品集合。
|
|
84
|
+
*
|
|
85
|
+
* @param declared 自报的产品 id 集合
|
|
86
|
+
* @param known 协议层认识的产品 id 集合
|
|
87
|
+
*/
|
|
88
|
+
export declare function reconcileManifests(declared: readonly string[], known: readonly string[]): ManifestReconciliation;
|
|
89
|
+
/** 便捷判断:id 是否是协议层认识的产品 id(供各仓自检用)。 */
|
|
90
|
+
export { isProductId };
|
|
91
|
+
//# sourceMappingURL=productManifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"productManifest.d.ts","sourceRoot":"","sources":["../../src/types/productManifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAEL,WAAW,EAEX,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,WAAW,CAAC;AAInB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,OAAO,GACX,cAAc,CAAC,WAAW,CAAC,CA4B7B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,SAAS,mBAAmB,EAAE,GACxC,eAAe,CAUjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,qBAAqB;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,eAAe;IACf,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,sBAAsB,CAkBxB;AAED,sCAAsC;AACtC,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 产品自报文件的**读取与汇总** —— 「每条记录都有主人」的机器那一半。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么需要这一层
|
|
5
|
+
*
|
|
6
|
+
* `product.ts` 提供类型与校验,但真值分散在 16 个仓各自的 `product.json` 里。
|
|
7
|
+
* 谁来读、读完怎么对账,是这一层的事:
|
|
8
|
+
*
|
|
9
|
+
* - **读取**:把一个仓根目录下的 `product.json` 读成 `ProductMeta`,
|
|
10
|
+
* 并在读的时候就地校验(不合规的仓不该等到汇总时才被发现)。
|
|
11
|
+
* - **汇总**:把 N 份自报汇成一份 registry,重复 id 直接炸。
|
|
12
|
+
* - **对账**:把「自报的真值」与「协议层认识的产品集合」对齐 ——
|
|
13
|
+
* 少一个仓自报、或某个仓声明了协议层不存在的 id,都属于**家族契约破损**,
|
|
14
|
+
* 必须在 CI 里红,不能等用户在 box 面板上看到一张打不开的卡片才发现。
|
|
15
|
+
*
|
|
16
|
+
* ## 为什么不内置真值
|
|
17
|
+
*
|
|
18
|
+
* 见 `product.ts` 顶部:本模块只做**机制**,一条真值都不带。
|
|
19
|
+
* 谁的产品叫什么、支持什么动作,只有那个仓知道。
|
|
20
|
+
*/
|
|
21
|
+
import { buildProductRegistry, isProductId, validateProductMeta, } from "./product.js";
|
|
22
|
+
/**
|
|
23
|
+
* 自报文件在仓根的**相对路径**。
|
|
24
|
+
*
|
|
25
|
+
* 固定在仓根而不是 `src/` 里:这份文件是「这个仓向家族报什么」,
|
|
26
|
+
* 属于仓级契约,不是前端代码的一部分 —— 放在 `src/` 下会被
|
|
27
|
+
* 「前端源码」的构建/打包规则误伤。
|
|
28
|
+
*/
|
|
29
|
+
export const PRODUCT_MANIFEST_PATH = "product.json";
|
|
30
|
+
/**
|
|
31
|
+
* 解析一个自报文件的内容。
|
|
32
|
+
*
|
|
33
|
+
* 与 `validateProductMeta` 的区别:这里管**磁盘形状**(字段在不在、类型对不对),
|
|
34
|
+
* 那里管**语义自洽**(id 合不合法、声明了动作却说自己不接深链这种矛盾)。
|
|
35
|
+
* 两层都要过。
|
|
36
|
+
*/
|
|
37
|
+
export function parseProductManifest(raw) {
|
|
38
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
39
|
+
return { ok: false, reason: "产品自报文件不是对象" };
|
|
40
|
+
}
|
|
41
|
+
const m = raw;
|
|
42
|
+
const missing = (field) => ({
|
|
43
|
+
ok: false,
|
|
44
|
+
reason: `产品自报文件缺少字段 ${field}`,
|
|
45
|
+
});
|
|
46
|
+
if (typeof m.id !== "string" || m.id.length === 0)
|
|
47
|
+
return missing("id");
|
|
48
|
+
if (typeof m.displayName !== "string")
|
|
49
|
+
return missing("displayName");
|
|
50
|
+
if (typeof m.description !== "string")
|
|
51
|
+
return missing("description");
|
|
52
|
+
if (typeof m.acceptsDeepLink !== "boolean")
|
|
53
|
+
return missing("acceptsDeepLink");
|
|
54
|
+
if (!Array.isArray(m.actions))
|
|
55
|
+
return missing("actions");
|
|
56
|
+
if (m.actions.some((a) => typeof a !== "string")) {
|
|
57
|
+
return { ok: false, reason: "产品自报文件的 actions 里有非字符串" };
|
|
58
|
+
}
|
|
59
|
+
if (m.keywords !== undefined) {
|
|
60
|
+
if (!Array.isArray(m.keywords))
|
|
61
|
+
return missing("keywords");
|
|
62
|
+
if (m.keywords.some((k) => typeof k !== "string")) {
|
|
63
|
+
return { ok: false, reason: "产品自报文件的 keywords 里有非字符串" };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// 交给语义层校验(id 合法性、动作与 acceptsDeepLink 的自洽性)
|
|
67
|
+
return validateProductMeta(m);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 把若干份自报汇总成 registry。
|
|
71
|
+
*
|
|
72
|
+
* 重复 id 直接抛错 —— 两个仓声明同一个产品 id 意味着有人改了协议没同步,
|
|
73
|
+
* 这在协议层必须炸出来,不能静默取最后一份。
|
|
74
|
+
*/
|
|
75
|
+
export function buildRegistryFromManifests(manifests) {
|
|
76
|
+
return buildProductRegistry(manifests.map((m) => {
|
|
77
|
+
const v = parseProductManifest(m);
|
|
78
|
+
if (!v.ok) {
|
|
79
|
+
throw new Error(`产品自报校验失败:${v.reason}`);
|
|
80
|
+
}
|
|
81
|
+
return v.value;
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 把「自报的真值」与「协议层认识的产品集合」对账。
|
|
86
|
+
*
|
|
87
|
+
* 两种破损都要报出来:
|
|
88
|
+
* - **无人认领**(missing):协议层说这个产品存在,但没有任何仓声明它 ——
|
|
89
|
+
* 要么那个仓忘了加 `product.json`,要么它已经下线了。
|
|
90
|
+
* - **协议没同步**(unknown):某个仓声明了协议层不存在的 id ——
|
|
91
|
+
* 多半是加了新产品但忘了同步 `cap-hub` / `shared` 的产品集合。
|
|
92
|
+
*
|
|
93
|
+
* @param declared 自报的产品 id 集合
|
|
94
|
+
* @param known 协议层认识的产品 id 集合
|
|
95
|
+
*/
|
|
96
|
+
export function reconcileManifests(declared, known) {
|
|
97
|
+
const seen = new Set();
|
|
98
|
+
const duplicated = [];
|
|
99
|
+
for (const id of declared) {
|
|
100
|
+
if (seen.has(id))
|
|
101
|
+
duplicated.push(id);
|
|
102
|
+
seen.add(id);
|
|
103
|
+
}
|
|
104
|
+
const knownSet = new Set(known);
|
|
105
|
+
const missing = known.filter((id) => !seen.has(id));
|
|
106
|
+
const unknown = [...seen].filter((id) => !knownSet.has(id));
|
|
107
|
+
return {
|
|
108
|
+
ok: missing.length === 0 && unknown.length === 0 && duplicated.length === 0,
|
|
109
|
+
missing: missing,
|
|
110
|
+
unknown,
|
|
111
|
+
duplicated,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** 便捷判断:id 是否是协议层认识的产品 id(供各仓自检用)。 */
|
|
115
|
+
export { isProductId };
|
|
116
|
+
//# sourceMappingURL=productManifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"productManifest.js","sourceRoot":"","sources":["../../src/types/productManifest.ts"],"names":[],"mappings":"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"}
|