base-paint 0.1.0 → 0.3.0

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.
Files changed (64) hide show
  1. package/dist/blocks.d.ts +169 -0
  2. package/dist/blocks.d.ts.map +1 -0
  3. package/dist/blocks.js +862 -0
  4. package/dist/blocks.js.map +1 -0
  5. package/dist/charts.d.ts +62 -0
  6. package/dist/charts.d.ts.map +1 -0
  7. package/dist/charts.js +1677 -0
  8. package/dist/charts.js.map +1 -0
  9. package/dist/contract.d.ts.map +1 -1
  10. package/dist/contract.js +7 -1
  11. package/dist/contract.js.map +1 -1
  12. package/dist/controls.d.ts +139 -0
  13. package/dist/controls.d.ts.map +1 -0
  14. package/dist/controls.js +1182 -0
  15. package/dist/controls.js.map +1 -0
  16. package/dist/help.d.ts +24 -0
  17. package/dist/help.d.ts.map +1 -0
  18. package/dist/help.js +604 -0
  19. package/dist/help.js.map +1 -0
  20. package/dist/index.d.ts +21 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +21 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/spec/charts.d.ts +222 -0
  25. package/dist/spec/charts.d.ts.map +1 -0
  26. package/dist/spec/charts.js +35 -0
  27. package/dist/spec/charts.js.map +1 -0
  28. package/dist/spec/controls.d.ts +329 -0
  29. package/dist/spec/controls.d.ts.map +1 -0
  30. package/dist/spec/controls.js +119 -0
  31. package/dist/spec/controls.js.map +1 -0
  32. package/dist/spec/help.d.ts +353 -0
  33. package/dist/spec/help.d.ts.map +1 -0
  34. package/dist/spec/help.js +167 -0
  35. package/dist/spec/help.js.map +1 -0
  36. package/dist/spec/index.d.ts +40 -0
  37. package/dist/spec/index.d.ts.map +1 -0
  38. package/dist/spec/index.js +164 -0
  39. package/dist/spec/index.js.map +1 -0
  40. package/dist/spec/style.d.ts +46 -0
  41. package/dist/spec/style.d.ts.map +1 -0
  42. package/dist/spec/style.js +39 -0
  43. package/dist/spec/style.js.map +1 -0
  44. package/dist/spec/template.d.ts +363 -0
  45. package/dist/spec/template.d.ts.map +1 -0
  46. package/dist/spec/template.js +252 -0
  47. package/dist/spec/template.js.map +1 -0
  48. package/dist/spec/text.d.ts +157 -0
  49. package/dist/spec/text.d.ts.map +1 -0
  50. package/dist/spec/text.js +83 -0
  51. package/dist/spec/text.js.map +1 -0
  52. package/dist/style.d.ts +19 -0
  53. package/dist/style.d.ts.map +1 -1
  54. package/dist/style.js +1091 -0
  55. package/dist/style.js.map +1 -1
  56. package/dist/template.d.ts +27 -0
  57. package/dist/template.d.ts.map +1 -0
  58. package/dist/template.js +362 -0
  59. package/dist/template.js.map +1 -0
  60. package/dist/text.d.ts +19 -0
  61. package/dist/text.d.ts.map +1 -0
  62. package/dist/text.js +448 -0
  63. package/dist/text.js.map +1 -0
  64. package/package.json +5 -3
package/dist/text.js ADDED
@@ -0,0 +1,448 @@
1
+ /** base-paint/text:复制文本序列化(#77 运行时)。
2
+ *
3
+ * 契约正本:`docs/base-paint-contract.md` §3.4(含「行为补遗」)/§6.4;冻结面:
4
+ * `packages/base-render/src/spec/text.ts`(本文件**只消费**,不改任何冻结签名)。
5
+ *
6
+ * 单一真相(禁止第二份表):
7
+ * - 逐 shape 投影恒读 `DATA_TEXT_PROJECTIONS`(`body`/`tail`/`csvSections`),
8
+ * 本文件**不写任何 shape→字段的映射表**;
9
+ * - 6 段数据源恒读 `LOG_SECTION_SOURCES`(`copyLog.<字段>` 的字段名从该常量派生,
10
+ * 故 `timestampVersion` ← `copyLog.timestamp` 不需要第二份对应表);
11
+ * - 敏感行判定与掩码恒读 `SENSITIVE_ROW_RULE`(字面 `true`,非真值判定);
12
+ * - 空值口径恒读 `TEXT_EMPTY_PLACEHOLDER`(数据)/`LOG_UNKNOWN_PLACEHOLDER`(日志);
13
+ * - `csv` 分隔/引号/行尾恒读 `CSV_DIALECT`;`json` 缩进/`<` 规则恒读
14
+ * `TEXT_JSON_INDENT`/`TEXT_JSON_LT_RULE`;输出头恒读 `TEXT_HEADER_TEMPLATE`。
15
+ *
16
+ * 依赖红线(AC-13):零运行时依赖,只 `import type` 消费 `base-link-core`。
17
+ *
18
+ * 契约未规定处的取值(全部记账在契约 §3.4「行为补遗」,不留暗猜):
19
+ * - **`json` 口径 `undefined` → `null` 归一(FX-77-1)**:JSON 无 `undefined` 值,`JSON.stringify`
20
+ * 默认**丢键**,与 `contract:609`「空值保留 `null`、键不省略」冲突;归一后同一输入的三种 format
21
+ * 键集/行数一一对应(`text` 占位符/`csv` 空串/`json` `null` 语义等价)。
22
+ * - **产出恒非空(FX-77-6)**:输出头行恒存在(`title` 空串视同缺省,退回 `TEXT_HEADER_TEMPLATE`
23
+ * 展开),故 `title: ''` + 空投影体不再产出空串(`copyText` 空串短路不会被误触)。
24
+ * - **输出头模板单趟展开(FX-77-8)**:替换位从 `TEXT_HEADER_TEMPLATE` 直接派生、只替换一次,
25
+ * `skill: '{key}'` 不会被二次展开。
26
+ * - 行文本格式(§3.4 `contract:616` 登记为「不冻结也不排除」,owner #77):
27
+ * 映射体(`metrics`/`item`)逐键 `键: 值`;数组体(`items`)逐项一行、**无前缀**;
28
+ * 标量与收尾行(`ok`/`summary`/`total`/`message`)`字段名: 值`;
29
+ * **敏感行整行恒为 `mask`**(不带键名,对齐「掩码行 `****`」的验收措辞)。
30
+ * - 值文本化:`null`/`undefined`/空串 → `未填写`;字符串原样;number/boolean/bigint →
31
+ * `String()`;对象/数组 → `JSON.stringify`(不可序列化(循环引用/`BigInt` 等)→
32
+ * `structure-invalid`,`message` 按因区分)。
33
+ * - 错误码次序:`format-unknown` → `shape-unsupported` → `structure-invalid`(由外到内)。
34
+ * - `text` 口径行内 CR/LF 替换为空格;`csv` 口径保留原样、由 RFC4180 引号包裹;
35
+ * `json` 口径按 JSON 转义。时间行文案 `时间: {occurredAt}`(沿用旧基线措辞)。
36
+ * - 日志段 = 标题行(`LOG_SECTION_TITLES` 逐字、**无** `①`–`⑥` 圈号)+ 内容行,段间无空行。
37
+ * - envelope 五字段(`version`/`skill`/`key`)**存在性不校验**(归 #74 `STRICT_ENVELOPE_FIELDS`);
38
+ * 非字符串的 `skill`/`key` 在 `text` 头与 `scene` 段按空串渲染、在 `json` 里原样透传
39
+ * (**`undefined`/缺失**归一为 `null` 以保键,FX-77-1)。
40
+ */
41
+ import { COPY_FORMATS, CSV_DIALECT, DATA_TEXT_PROJECTIONS, LOG_SECTIONS, LOG_SECTION_SOURCES, LOG_SECTION_TITLES, LOG_UNKNOWN_PLACEHOLDER, SENSITIVE_ROW_RULE, SERIALIZABLE_SHAPES, TEXT_EMPTY_PLACEHOLDER, TEXT_HEADER_TEMPLATE, TEXT_JSON_INDENT, TEXT_JSON_LT_RULE, } from './spec/text.js';
42
+ /** 复制序列化失败(形态逐字对齐冻结的 `TextErrorShape`:`{ name, code, message }`)。
43
+ *
44
+ * **不从 `src/index.ts` 导出**:`SPEC_FROZEN_SURFACE` 无该运行时条目,导出会打破
45
+ * 「新增运行时出口恰好等于清单 implemented 的运行时项」出口面锁。与 `TemplateError`
46
+ * /`ControlsError` 同口径,调用方按 `name`/`code` 判定。
47
+ */
48
+ export class TextError extends Error {
49
+ /** 逐字对齐 `TextErrorShape.name`。 */
50
+ name = 'TextError';
51
+ code;
52
+ constructor(code, message) {
53
+ super(message);
54
+ this.code = code;
55
+ }
56
+ }
57
+ /** 抛错并收窄控制流(`never` 返回,便于 TS 在断言后收窄)。 */
58
+ function fail(code, message) {
59
+ throw new TextError(code, message);
60
+ }
61
+ const LF = String.fromCharCode(10);
62
+ const CR = String.fromCharCode(13);
63
+ /** 时间行前缀(契约未规定文案;沿用旧基线 `base.js:254` 的 `'时间: '`,见 §3.4 行为补遗)。 */
64
+ const TIME_LABEL = '时间: ';
65
+ /** `csv` 口径的空值(`contract:610`:机器可读,写空字符串、不写占位符)。 */
66
+ const CSV_EMPTY = '';
67
+ /** 「由 envelope 派生」的段源哨兵:恒读冻结常量 `LOG_SECTION_SOURCES.scene`,不写第二份字面量。 */
68
+ const ENVELOPE_SOURCE = LOG_SECTION_SOURCES.scene;
69
+ /* ── 输入形态与校验 ─────────────────────────────────────────── */
70
+ /** 纯对象收窄(数组与 `null` 不算对象)。 */
71
+ function asRecord(value) {
72
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
73
+ ? value
74
+ : null;
75
+ }
76
+ /** 错误文案里的值描述(一码多义由 `message` 辨因,§3.1.2⑤ 同口径)。 */
77
+ function describeValue(value) {
78
+ if (value === null)
79
+ return 'null';
80
+ if (Array.isArray(value))
81
+ return '数组';
82
+ if (typeof value === 'object')
83
+ return '对象';
84
+ return typeof value + ' ' + String(value);
85
+ }
86
+ /** `format` 闭集判定(缺省 `text`);不在 `COPY_FORMATS` 内 → `format-unknown`。 */
87
+ function resolveFormat(value) {
88
+ if (value === undefined)
89
+ return 'text';
90
+ if (typeof value === 'string' && COPY_FORMATS.indexOf(value) >= 0) {
91
+ return value;
92
+ }
93
+ fail('format-unknown', 'format 不在 COPY_FORMATS 内:' + describeValue(value)
94
+ + '(允许:' + COPY_FORMATS.join('、') + ')');
95
+ }
96
+ /** `shape` 闭集判定:不在 `SERIALIZABLE_SHAPES`(含 `fallback`)→ `shape-unsupported`。 */
97
+ function resolveShape(value) {
98
+ if (typeof value === 'string' && SERIALIZABLE_SHAPES.indexOf(value) >= 0) {
99
+ return value;
100
+ }
101
+ fail('shape-unsupported', 'shape 不进复制文本:' + describeValue(value)
102
+ + '(可序列化:' + SERIALIZABLE_SHAPES.join('、') + ')');
103
+ }
104
+ /** `title`/`occurredAt` 类型校验(非字符串 → `structure-invalid`;缺省放行)。 */
105
+ function optionalString(value, field) {
106
+ if (value === undefined)
107
+ return undefined;
108
+ if (typeof value !== 'string') {
109
+ fail('structure-invalid', field + ' 必须是字符串,实为 ' + describeValue(value));
110
+ }
111
+ return value;
112
+ }
113
+ /** 逐 shape 结构校验(判据逐条对齐 `contract:624`,恒以 `EnvelopeDataByShape[shape]` 为准)。
114
+ *
115
+ * **不校验** `stat.metrics` 的逐值类型:敏感行包装 `{ text, sensitive: true }` 必须放行
116
+ * (`contract:612`/`:615`,FX-23),故只判容器形态。
117
+ */
118
+ function requireShapeData(shape, value) {
119
+ const data = asRecord(value);
120
+ if (data === null) {
121
+ fail('structure-invalid', shape + ' 形 data 必须是对象,实为 ' + describeValue(value));
122
+ }
123
+ switch (shape) {
124
+ case 'stat':
125
+ if (asRecord(data.metrics) === null) {
126
+ fail('structure-invalid', 'stat 形缺 metrics 对象(EnvelopeDataByShape.stat)');
127
+ }
128
+ break;
129
+ case 'list':
130
+ if (!Array.isArray(data.items)) {
131
+ fail('structure-invalid', 'list 形 items 必须是数组(EnvelopeDataByShape.list)');
132
+ }
133
+ break;
134
+ case 'detail':
135
+ if (asRecord(data.item) === null) {
136
+ fail('structure-invalid', 'detail 形缺 item 对象(EnvelopeDataByShape.detail)');
137
+ }
138
+ break;
139
+ case 'receipt':
140
+ if (typeof data.ok !== 'boolean' || typeof data.message !== 'string') {
141
+ fail('structure-invalid', 'receipt 形缺 ok(boolean)/message(string)(EnvelopeDataByShape.receipt)');
142
+ }
143
+ break;
144
+ case 'analysis':
145
+ if (typeof data.summary !== 'string' || data.summary.length === 0) {
146
+ fail('structure-invalid', 'analysis 形缺非空 summary(EnvelopeDataByShape.analysis)');
147
+ }
148
+ break;
149
+ default: {
150
+ // 穷尽性兜底(FX-77-7):冻结面日后新增可序列化 shape 时**不得静默跳过**校验。
151
+ const unreached = shape;
152
+ fail('structure-invalid', '未覆盖的可序列化 shape:' + String(unreached));
153
+ }
154
+ }
155
+ return data;
156
+ }
157
+ /** `copyLog` 形态校验:整体非对象/字段非字符串 → `structure-invalid`(`null`/`undefined` 视同缺失)。 */
158
+ function resolveCopyLog(value) {
159
+ if (value === undefined || value === null)
160
+ return null;
161
+ const record = asRecord(value);
162
+ if (record === null) {
163
+ fail('structure-invalid', 'copyLog 必须是对象,实为 ' + describeValue(value));
164
+ }
165
+ for (const [field, fieldValue] of Object.entries(record)) {
166
+ if (fieldValue === undefined || fieldValue === null)
167
+ continue;
168
+ if (typeof fieldValue !== 'string') {
169
+ fail('structure-invalid', 'copyLog.' + field + ' 必须是字符串,实为 ' + describeValue(fieldValue));
170
+ }
171
+ }
172
+ return record;
173
+ }
174
+ /* ── 行文本渲染(一行 = 一个投影值) ─────────────────────────── */
175
+ /** 敏感行判定:只看 `SENSITIVE_ROW_RULE.flagField` 是否为**字面** `flagValue`(非真值判定)。 */
176
+ function isSensitive(value) {
177
+ const record = asRecord(value);
178
+ return record !== null && record[SENSITIVE_ROW_RULE.flagField] === SENSITIVE_ROW_RULE.flagValue;
179
+ }
180
+ /** 单值 → 文本(三 format 共用的「值文本化」口径;空值文本由调用方按 format 传入)。 */
181
+ function valueText(value, empty) {
182
+ if (value === null || value === undefined)
183
+ return empty;
184
+ if (typeof value === 'string')
185
+ return value === '' ? empty : value;
186
+ if (typeof value === 'object') {
187
+ const text = stringifyJson(value, '投影值');
188
+ return text === undefined ? empty : text;
189
+ }
190
+ return String(value);
191
+ }
192
+ /** 投影值 → 一行(敏感行整行恒为 `mask`,不带键名)。 */
193
+ function rowOf(value, label, empty) {
194
+ if (isSensitive(value))
195
+ return { text: SENSITIVE_ROW_RULE.mask, sensitive: true };
196
+ const text = valueText(value, empty);
197
+ return { text: label === null ? text : label + ': ' + text, sensitive: false };
198
+ }
199
+ /** 主体行:字段值按 `EnvelopeDataByShape` 的形态推导展开策略,字段名恒取投影表。 */
200
+ function bodyRows(projection, data, empty) {
201
+ const value = data[projection.body];
202
+ if (Array.isArray(value))
203
+ return value.map((item) => rowOf(item, null, empty));
204
+ const map = asRecord(value);
205
+ if (map !== null)
206
+ return Object.entries(map).map(([key, item]) => rowOf(item, key, empty));
207
+ return [rowOf(value, projection.body, empty)];
208
+ }
209
+ /** 收尾行:`tail` 为 `null` 或该字段**缺省**(`undefined`)→ 省略,不报错(U1 定案);
210
+ * 显式 `null` 是「空值」而非「缺省」,按各 format 的空值口径渲染(text 占位符/json `null`/csv 空串)。 */
211
+ function tailRow(projection, data, empty) {
212
+ if (projection.tail === null)
213
+ return null;
214
+ const value = data[projection.tail];
215
+ if (value === undefined)
216
+ return null;
217
+ return rowOf(value, projection.tail, empty);
218
+ }
219
+ function dataRows(projection, data, empty) {
220
+ return { body: bodyRows(projection, data, empty), tail: tailRow(projection, data, empty) };
221
+ }
222
+ /** `text` 口径:行内换行(CR/LF)替换为空格(`contract:608`)。 */
223
+ function sanitizeLine(text) {
224
+ return text.split(CR).join(' ').split(LF).join(' ');
225
+ }
226
+ /* ── 输出头与 scene 段 ─────────────────────────────────────── */
227
+ /** 非字符串字段按空串渲染(`text` 口径的人类可读面,避免出现 `undefined`)。 */
228
+ function fieldText(value) {
229
+ return typeof value === 'string' ? value : '';
230
+ }
231
+ /** 输出头:`DataTextInput.title` 非空时覆盖,否则 `TEXT_HEADER_TEMPLATE` **单趟**展开。
232
+ *
233
+ * - 替换位从模板本身派生(`{字段}` → `envelope[字段]`),**无第二份字段清单**(FX-77-8)。
234
+ * - **单趟**:插入的值不再被扫描(`skill: '{key}'` → `【{key} · KK】`,不二次展开,FX-77-8)。
235
+ * - 空串 `title` 视同缺省(FX-77-6):输出头行恒存在、恒非空(模板含 `【】` 与 ` · `,
236
+ * `skill`/`key` 为空/非字符串时按空串替换,得 `【 · 】`)。
237
+ */
238
+ function headerLine(envelope, title) {
239
+ if (title !== undefined && title !== '')
240
+ return title;
241
+ let out = '';
242
+ let rest = TEXT_HEADER_TEMPLATE;
243
+ for (;;) {
244
+ const open = rest.indexOf('{');
245
+ if (open < 0)
246
+ return out + rest;
247
+ const close = rest.indexOf('}', open + 1);
248
+ if (close < 0)
249
+ return out + rest;
250
+ out += rest.slice(0, open) + fieldText(envelope[rest.slice(open + 1, close)]);
251
+ rest = rest.slice(close + 1);
252
+ }
253
+ }
254
+ /** `scene` 段:恒由 envelope 派生,形如 `{skill}.{key}({shape})`(`contract:595`)。 */
255
+ function sceneText(envelope, shape) {
256
+ return fieldText(envelope.skill) + '.' + fieldText(envelope.key) + '(' + shape + ')';
257
+ }
258
+ /* ── 三种 format 的编码器 ───────────────────────────────────── */
259
+ /** 不可 JSON 序列化的**原因文案**(一码多义由 `message` 辨因,§3.1.2⑤ 同口径):
260
+ * `BigInt` 与循环引用**不同因不同文**(FX-77-8:不得把 `BigInt` 误写成「循环引用」)。 */
261
+ function jsonFailReason(error) {
262
+ const text = error instanceof Error ? error.message : String(error);
263
+ if (text.indexOf('circular') >= 0)
264
+ return '循环引用';
265
+ if (text.indexOf('BigInt') >= 0)
266
+ return 'BigInt 等非 JSON 值';
267
+ return '含非 JSON 值';
268
+ }
269
+ /** `JSON.stringify` 的统一包装(**三 format 共用**;`prefix` 只用于辨因文案):
270
+ *
271
+ * - **`undefined` → `null`(保留键)**:JSON 无 `undefined` 值,`JSON.stringify` 默认**丢键**,
272
+ * 与 `contract:609`「空值保留 `null`、键不省略」冲突(FX-77-1)。`json` 口径的整串与
273
+ * `text`/`csv` 口径的对象值(§3.4.1「对象/数组 → `JSON.stringify`」)同口径归一,
274
+ * 故**同一输入的三 format 键集一一对应**(含嵌套对象)。
275
+ * - **`BigInt` 显式判因**:不依赖运行时文案(`typeof item === 'bigint'` 直接判),仍抛
276
+ * `structure-invalid`(不静默写 `null`)。
277
+ * - 其余不可序列化(循环引用等)→ `structure-invalid`,`message` 按因区分。
278
+ */
279
+ function stringifyJson(value, prefix, indent) {
280
+ try {
281
+ return JSON.stringify(value, (_key, item) => {
282
+ if (typeof item === 'bigint') {
283
+ fail('structure-invalid', prefix + '不可 JSON 序列化(BigInt 等非 JSON 值)');
284
+ }
285
+ return item === undefined ? null : item;
286
+ }, indent);
287
+ }
288
+ catch (error) {
289
+ if (error instanceof TextError)
290
+ throw error;
291
+ fail('structure-invalid', prefix + '不可 JSON 序列化(' + jsonFailReason(error) + ')');
292
+ }
293
+ }
294
+ /** `json` 口径:缩进恒取 `TEXT_JSON_INDENT`,`<` 一律写成反斜杠 + `TEXT_JSON_LT_RULE`。 */
295
+ function jsonText(value) {
296
+ const text = stringifyJson(value, '载荷', TEXT_JSON_INDENT);
297
+ if (text === undefined)
298
+ fail('structure-invalid', '载荷不可 JSON 序列化');
299
+ return text.split('<').join(String.fromCharCode(92) + TEXT_JSON_LT_RULE);
300
+ }
301
+ /** 敏感行在 `json` 口径写 `mask`(不写 `null`、不进第二套键名)。 */
302
+ function maskValue(value) {
303
+ return isSensitive(value) ? SENSITIVE_ROW_RULE.mask : value;
304
+ }
305
+ /** `json` 口径的 `data`:按投影值位置把敏感行换成 `mask`,其余原样透传(空值保留 `null`)。
306
+ * 收尾字段**缺省**(`undefined`)时**删键**(U1:缺省 ≠ 空值;`json` 省略该键,与 `text`/`csv` 省略该行一致)。 */
307
+ function maskData(projection, data) {
308
+ const out = { ...data };
309
+ const body = data[projection.body];
310
+ if (Array.isArray(body)) {
311
+ out[projection.body] = body.map(maskValue);
312
+ }
313
+ else {
314
+ const map = asRecord(body);
315
+ out[projection.body] = map === null
316
+ ? maskValue(body)
317
+ : Object.fromEntries(Object.entries(map).map(([key, item]) => [key, maskValue(item)]));
318
+ }
319
+ if (projection.tail !== null) {
320
+ if (data[projection.tail] === undefined)
321
+ delete out[projection.tail];
322
+ else
323
+ out[projection.tail] = maskValue(data[projection.tail]);
324
+ }
325
+ return out;
326
+ }
327
+ /** `csv` 字段编码:RFC4180——含分隔符/引号/换行(CR 或 LF)时用引号包裹,内部引号写成双写。 */
328
+ function csvField(value) {
329
+ const needsQuote = value.includes(CSV_DIALECT.delimiter)
330
+ || value.includes(CSV_DIALECT.quote)
331
+ || value.includes(CR)
332
+ || value.includes(LF);
333
+ if (!needsQuote)
334
+ return value;
335
+ return CSV_DIALECT.quote
336
+ + value.split(CSV_DIALECT.quote).join(CSV_DIALECT.quoteEscape)
337
+ + CSV_DIALECT.quote;
338
+ }
339
+ /** `csv` 行尾:恒读冻结常量 `CSV_DIALECT.lineEnding`(机读名 → 实际字符,不留未消费常量)。
340
+ * 未知取值 → `structure-invalid`(显式失败,不静默退回某个行尾)。 */
341
+ function csvLineEnding() {
342
+ const name = CSV_DIALECT.lineEnding;
343
+ if (name === 'LF')
344
+ return LF;
345
+ if (name === 'CRLF')
346
+ return CR + LF;
347
+ fail('structure-invalid', 'CSV_DIALECT.lineEnding 取值未定义:' + name);
348
+ }
349
+ /** `csv` 口径:表头恒为 `CSV_DIALECT.header`,行尾恒取 `CSV_DIALECT.lineEnding`。 */
350
+ function csvText(rows) {
351
+ const lines = [CSV_DIALECT.header.map(csvField).join(CSV_DIALECT.delimiter)];
352
+ for (const [section, row] of rows) {
353
+ lines.push([section, row].map(csvField).join(CSV_DIALECT.delimiter));
354
+ }
355
+ return lines.join(csvLineEnding());
356
+ }
357
+ /** `csv` 行序 = 主体行 → 收尾行;`section` 列逐行取投影表 `csvSections`(`contract:619`)。 */
358
+ function dataCsvRows(projection, rows) {
359
+ const out = [];
360
+ const bodySection = projection.csvSections[0];
361
+ for (const row of rows.body)
362
+ out.push([bodySection, row.text]);
363
+ if (rows.tail !== null)
364
+ out.push([projection.csvSections[1], rows.tail.text]);
365
+ return out;
366
+ }
367
+ /* ── 6 段日志 ───────────────────────────────────────────────── */
368
+ /** 6 段文本:`scene` 由 envelope 派生,其余 5 段取 `CopyLogFields`(字段名从 `LOG_SECTION_SOURCES` 派生)。
369
+ * 缺失(未给/非字符串/空串)→ `null`,由各 format 自行落空值口径。 */
370
+ function logTexts(envelope, shape, copyLog) {
371
+ const out = {};
372
+ for (const section of LOG_SECTIONS) {
373
+ const source = LOG_SECTION_SOURCES[section];
374
+ if (source === ENVELOPE_SOURCE) {
375
+ out[section] = sceneText(envelope, shape);
376
+ continue;
377
+ }
378
+ const dot = source.indexOf('.');
379
+ const field = dot >= 0 ? source.slice(dot + 1) : source;
380
+ const value = copyLog === null ? undefined : copyLog[field];
381
+ out[section] = typeof value === 'string' && value !== '' ? value : null;
382
+ }
383
+ return out;
384
+ }
385
+ /* ── 出口 ───────────────────────────────────────────────────── */
386
+ /** 数据文本:envelope 逐 shape 投影 → `text`/`json`/`csv`。失败抛 `TextError`(不返空、不降级)。 */
387
+ export function buildDataText(input) {
388
+ const record = asRecord(input);
389
+ if (record === null)
390
+ fail('structure-invalid', '入参必须是对象(DataTextInput),实为 ' + describeValue(input));
391
+ const format = resolveFormat(record.format);
392
+ const envelope = asRecord(record.envelope);
393
+ if (envelope === null)
394
+ fail('structure-invalid', 'envelope 必须是对象,实为 ' + describeValue(record.envelope));
395
+ const shape = resolveShape(envelope.shape);
396
+ const title = optionalString(record.title, 'title');
397
+ const occurredAt = optionalString(record.occurredAt, 'occurredAt');
398
+ const data = requireShapeData(shape, envelope.data);
399
+ const projection = DATA_TEXT_PROJECTIONS[shape];
400
+ if (format === 'json') {
401
+ return jsonText({
402
+ version: envelope.version,
403
+ skill: envelope.skill,
404
+ shape,
405
+ key: envelope.key,
406
+ data: maskData(projection, data),
407
+ });
408
+ }
409
+ const rows = dataRows(projection, data, format === 'csv' ? CSV_EMPTY : TEXT_EMPTY_PLACEHOLDER);
410
+ if (format === 'csv')
411
+ return csvText(dataCsvRows(projection, rows));
412
+ const lines = [sanitizeLine(headerLine(envelope, title))];
413
+ if (occurredAt !== undefined)
414
+ lines.push(sanitizeLine(TIME_LABEL + occurredAt));
415
+ for (const row of rows.tail === null ? rows.body : [...rows.body, rows.tail]) {
416
+ lines.push(sanitizeLine(row.text));
417
+ if (row.sensitive)
418
+ lines.push(SENSITIVE_ROW_RULE.textNotice);
419
+ }
420
+ return lines.join(LF);
421
+ }
422
+ /** 日志文本:6 段(1 段 envelope 派生 + 5 段 `CopyLogFields`)→ `text`/`json`/`csv`。
423
+ * 结构校验与 `buildDataText` **同口径**(U14 定案:`data` 不符 shape 同样抛 `structure-invalid`)。 */
424
+ export function buildLogText(input) {
425
+ const record = asRecord(input);
426
+ if (record === null)
427
+ fail('structure-invalid', '入参必须是对象(LogTextInput),实为 ' + describeValue(input));
428
+ const format = resolveFormat(record.format);
429
+ const envelope = asRecord(record.envelope);
430
+ if (envelope === null)
431
+ fail('structure-invalid', 'envelope 必须是对象,实为 ' + describeValue(record.envelope));
432
+ const shape = resolveShape(envelope.shape);
433
+ const copyLog = resolveCopyLog(record.copyLog);
434
+ requireShapeData(shape, envelope.data);
435
+ const texts = logTexts(envelope, shape, copyLog);
436
+ if (format === 'json')
437
+ return jsonText(texts);
438
+ if (format === 'csv') {
439
+ return csvText(LOG_SECTIONS.map((section) => [section, texts[section] ?? '']));
440
+ }
441
+ const lines = [];
442
+ for (const section of LOG_SECTIONS) {
443
+ lines.push(sanitizeLine(LOG_SECTION_TITLES[section]));
444
+ lines.push(sanitizeLine(texts[section] ?? LOG_UNKNOWN_PLACEHOLDER));
445
+ }
446
+ return lines.join(LF);
447
+ }
448
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "base-paint",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "渲染包:ui+style+injector+渲染契约,装配唯一 owner",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "exports": {
9
- ".": "./dist/index.js"
9
+ ".": "./dist/index.js",
10
+ "./blocks": "./dist/blocks.js",
11
+ "./package.json": "./package.json"
10
12
  },
11
13
  "files": [
12
14
  "dist"
@@ -15,7 +17,7 @@
15
17
  "node": ">=22.13"
16
18
  },
17
19
  "devDependencies": {
18
- "base-link-core": "workspace:^0.1.0"
20
+ "base-link-core": "^0.2.0"
19
21
  },
20
22
  "scripts": {
21
23
  "build": "tsc -b",