@hirokisakabe/pom 5.2.0 → 5.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 (106) hide show
  1. package/README.md +10 -11
  2. package/dist/autoFit/autoFit.d.ts +2 -1
  3. package/dist/autoFit/autoFit.d.ts.map +1 -1
  4. package/dist/autoFit/autoFit.js +7 -7
  5. package/dist/autoFit/strategies/reduceFontSize.js +1 -1
  6. package/dist/autoFit/strategies/reduceGapAndPadding.js +1 -1
  7. package/dist/autoFit/strategies/reduceTableRowHeight.js +1 -1
  8. package/dist/autoFit/strategies/uniformScale.js +1 -1
  9. package/dist/buildContext.d.ts +12 -0
  10. package/dist/buildContext.d.ts.map +1 -0
  11. package/dist/buildContext.js +8 -0
  12. package/dist/buildPptx.d.ts +1 -1
  13. package/dist/buildPptx.d.ts.map +1 -1
  14. package/dist/buildPptx.js +15 -15
  15. package/dist/calcYogaLayout/calcYogaLayout.d.ts +3 -1
  16. package/dist/calcYogaLayout/calcYogaLayout.d.ts.map +1 -1
  17. package/dist/calcYogaLayout/calcYogaLayout.js +43 -371
  18. package/dist/calcYogaLayout/measureText.d.ts +1 -5
  19. package/dist/calcYogaLayout/measureText.d.ts.map +1 -1
  20. package/dist/calcYogaLayout/measureText.js +2 -10
  21. package/dist/icons/renderIcon.d.ts +1 -1
  22. package/dist/icons/renderIcon.d.ts.map +1 -1
  23. package/dist/icons/renderIcon.js +3 -4
  24. package/dist/parseXml/coercionRules.d.ts +35 -0
  25. package/dist/parseXml/coercionRules.d.ts.map +1 -0
  26. package/dist/parseXml/coercionRules.js +479 -0
  27. package/dist/parseXml/inputSchema.d.ts +22 -105
  28. package/dist/parseXml/inputSchema.d.ts.map +1 -1
  29. package/dist/parseXml/inputSchema.js +5 -3
  30. package/dist/parseXml/parseXml.d.ts.map +1 -1
  31. package/dist/parseXml/parseXml.js +48 -277
  32. package/dist/registry/definitions/box.d.ts +3 -0
  33. package/dist/registry/definitions/box.d.ts.map +1 -0
  34. package/dist/registry/definitions/box.js +6 -0
  35. package/dist/registry/definitions/chart.d.ts +3 -0
  36. package/dist/registry/definitions/chart.d.ts.map +1 -0
  37. package/dist/registry/definitions/chart.js +8 -0
  38. package/dist/registry/definitions/compositeNodes.d.ts +8 -0
  39. package/dist/registry/definitions/compositeNodes.d.ts.map +1 -0
  40. package/dist/registry/definitions/compositeNodes.js +81 -0
  41. package/dist/registry/definitions/icon.d.ts +3 -0
  42. package/dist/registry/definitions/icon.d.ts.map +1 -0
  43. package/dist/registry/definitions/icon.js +50 -0
  44. package/dist/registry/definitions/image.d.ts +3 -0
  45. package/dist/registry/definitions/image.d.ts.map +1 -0
  46. package/dist/registry/definitions/image.js +34 -0
  47. package/dist/registry/definitions/layer.d.ts +3 -0
  48. package/dist/registry/definitions/layer.d.ts.map +1 -0
  49. package/dist/registry/definitions/layer.js +49 -0
  50. package/dist/registry/definitions/line.d.ts +3 -0
  51. package/dist/registry/definitions/line.d.ts.map +1 -0
  52. package/dist/registry/definitions/line.js +26 -0
  53. package/dist/registry/definitions/list.d.ts +4 -0
  54. package/dist/registry/definitions/list.d.ts.map +1 -0
  55. package/dist/registry/definitions/list.js +53 -0
  56. package/dist/registry/definitions/shape.d.ts +3 -0
  57. package/dist/registry/definitions/shape.d.ts.map +1 -0
  58. package/dist/registry/definitions/shape.js +37 -0
  59. package/dist/registry/definitions/stack.d.ts +4 -0
  60. package/dist/registry/definitions/stack.d.ts.map +1 -0
  61. package/dist/registry/definitions/stack.js +78 -0
  62. package/dist/registry/definitions/table.d.ts +3 -0
  63. package/dist/registry/definitions/table.d.ts.map +1 -0
  64. package/dist/registry/definitions/table.js +16 -0
  65. package/dist/registry/definitions/text.d.ts +3 -0
  66. package/dist/registry/definitions/text.d.ts.map +1 -0
  67. package/dist/registry/definitions/text.js +35 -0
  68. package/dist/registry/index.d.ts +2 -0
  69. package/dist/registry/index.d.ts.map +1 -0
  70. package/dist/registry/index.js +34 -0
  71. package/dist/registry/nodeRegistry.d.ts +7 -0
  72. package/dist/registry/nodeRegistry.d.ts.map +1 -0
  73. package/dist/registry/nodeRegistry.js +13 -0
  74. package/dist/registry/types.d.ts +26 -0
  75. package/dist/registry/types.d.ts.map +1 -0
  76. package/dist/registry/types.js +1 -0
  77. package/dist/renderPptx/nodes/icon.d.ts.map +1 -1
  78. package/dist/renderPptx/nodes/icon.js +22 -4
  79. package/dist/renderPptx/renderPptx.d.ts +2 -1
  80. package/dist/renderPptx/renderPptx.d.ts.map +1 -1
  81. package/dist/renderPptx/renderPptx.js +19 -60
  82. package/dist/renderPptx/types.d.ts +2 -0
  83. package/dist/renderPptx/types.d.ts.map +1 -1
  84. package/dist/renderPptx/utils/backgroundBorder.d.ts.map +1 -1
  85. package/dist/renderPptx/utils/backgroundBorder.js +1 -1
  86. package/dist/shared/freeYogaTree.d.ts.map +1 -0
  87. package/dist/shared/measureImage.d.ts +13 -3
  88. package/dist/shared/measureImage.d.ts.map +1 -1
  89. package/dist/shared/measureImage.js +14 -19
  90. package/dist/shared/walkTree.d.ts.map +1 -0
  91. package/dist/toPositioned/toPositioned.d.ts +8 -1
  92. package/dist/toPositioned/toPositioned.d.ts.map +1 -1
  93. package/dist/toPositioned/toPositioned.js +32 -189
  94. package/dist/types.d.ts +38 -54
  95. package/dist/types.d.ts.map +1 -1
  96. package/dist/types.js +11 -1
  97. package/package.json +3 -3
  98. package/dist/autoFit/freeYogaTree.d.ts.map +0 -1
  99. package/dist/autoFit/walkTree.d.ts.map +0 -1
  100. package/dist/renderPptx/nodes/index.d.ts +0 -15
  101. package/dist/renderPptx/nodes/index.d.ts.map +0 -1
  102. package/dist/renderPptx/nodes/index.js +0 -14
  103. /package/dist/{autoFit → shared}/freeYogaTree.d.ts +0 -0
  104. /package/dist/{autoFit → shared}/freeYogaTree.js +0 -0
  105. /package/dist/{autoFit → shared}/walkTree.d.ts +0 -0
  106. /package/dist/{autoFit → shared}/walkTree.js +0 -0
@@ -0,0 +1,479 @@
1
+ /**
2
+ * 明示的な型変換ルール定義
3
+ *
4
+ * Zod の内部構造(_def)に依存せず、XML 属性値の文字列→適切な型への変換ルールを
5
+ * 静的に定義する。各ノードタイプ・子要素タイプごとに変換テーブルを持つ。
6
+ */
7
+ // ===== 変換関数 =====
8
+ export function coerceWithRule(value, rule) {
9
+ if (rule === "number") {
10
+ if (value === "") {
11
+ return {
12
+ value: undefined,
13
+ error: `Cannot convert "${value}" to number`,
14
+ };
15
+ }
16
+ const num = Number(value);
17
+ if (isNaN(num)) {
18
+ return {
19
+ value: undefined,
20
+ error: `Cannot convert "${value}" to number`,
21
+ };
22
+ }
23
+ return { value: num, error: null };
24
+ }
25
+ if (rule === "boolean") {
26
+ if (value !== "true" && value !== "false") {
27
+ return {
28
+ value: undefined,
29
+ error: `Cannot convert "${value}" to boolean (expected "true" or "false")`,
30
+ };
31
+ }
32
+ return { value: value === "true", error: null };
33
+ }
34
+ if (rule === "string") {
35
+ return { value, error: null };
36
+ }
37
+ if (rule === "json") {
38
+ try {
39
+ return { value: JSON.parse(value), error: null };
40
+ }
41
+ catch {
42
+ return {
43
+ value: undefined,
44
+ error: `Cannot parse JSON value: "${value}"`,
45
+ };
46
+ }
47
+ }
48
+ // オブジェクト型のルール
49
+ if (rule.type === "literal") {
50
+ return { value: rule.value, error: null };
51
+ }
52
+ if (rule.type === "union") {
53
+ return { value: coerceUnionWithRules(value, rule.options), error: null };
54
+ }
55
+ if (rule.type === "object") {
56
+ try {
57
+ return { value: JSON.parse(value), error: null };
58
+ }
59
+ catch {
60
+ return {
61
+ value: undefined,
62
+ error: `Cannot parse JSON value: "${value}"`,
63
+ };
64
+ }
65
+ }
66
+ return { value: coerceFallback(value), error: null };
67
+ }
68
+ export function coerceUnionWithRules(value, options) {
69
+ // boolean を試行
70
+ if ((value === "true" || value === "false") && options.includes("boolean")) {
71
+ return value === "true";
72
+ }
73
+ // number を試行
74
+ if (options.includes("number")) {
75
+ const num = Number(value);
76
+ if (!isNaN(num) && value !== "") {
77
+ return num;
78
+ }
79
+ }
80
+ // literal を試行
81
+ for (const opt of options) {
82
+ if (typeof opt === "object" && opt.type === "literal") {
83
+ if (`${opt.value}` === value)
84
+ return opt.value;
85
+ }
86
+ }
87
+ // object/json を試行(JSON パース)
88
+ if (options.some((opt) => opt === "json" || (typeof opt === "object" && opt.type === "object"))) {
89
+ if (value.startsWith("{") || value.startsWith("[")) {
90
+ try {
91
+ return JSON.parse(value);
92
+ }
93
+ catch {
94
+ /* ignore */
95
+ }
96
+ }
97
+ }
98
+ // string にフォールバック
99
+ return value;
100
+ }
101
+ export function coerceFallback(value) {
102
+ if (value === "true")
103
+ return true;
104
+ if (value === "false")
105
+ return false;
106
+ const num = Number(value);
107
+ if (value !== "" && !isNaN(num))
108
+ return num;
109
+ if (value.startsWith("{") || value.startsWith("[")) {
110
+ try {
111
+ return JSON.parse(value);
112
+ }
113
+ catch {
114
+ /* ignore */
115
+ }
116
+ }
117
+ return value;
118
+ }
119
+ /**
120
+ * CoercionRule からオブジェクト型の shape を取得する。
121
+ * dot notation の展開で使用。
122
+ */
123
+ export function getObjectShapeFromRule(rule) {
124
+ if (typeof rule === "object" && rule.type === "object") {
125
+ return rule.shape;
126
+ }
127
+ if (typeof rule === "object" && rule.type === "union") {
128
+ const objectOpt = rule.options.find((opt) => typeof opt === "object" && opt.type === "object");
129
+ return objectOpt?.shape;
130
+ }
131
+ return undefined;
132
+ }
133
+ /**
134
+ * boolean と object の union かどうかを判定する。
135
+ * endArrow="true" と endArrow.type="triangle" の共存を許可するために使用。
136
+ */
137
+ export function isBooleanObjectUnionRule(rule) {
138
+ if (typeof rule === "string")
139
+ return false;
140
+ if (rule.type !== "union")
141
+ return false;
142
+ const hasBoolean = rule.options.includes("boolean");
143
+ const hasObject = rule.options.some((opt) => typeof opt === "object" && opt.type === "object");
144
+ return hasBoolean && hasObject;
145
+ }
146
+ // ===== 共通変換ルール =====
147
+ const LENGTH_RULE = {
148
+ type: "union",
149
+ options: ["number", { type: "literal", value: "max" }, "string"],
150
+ };
151
+ const PADDING_RULE = {
152
+ type: "union",
153
+ options: [
154
+ "number",
155
+ {
156
+ type: "object",
157
+ shape: {
158
+ top: "number",
159
+ right: "number",
160
+ bottom: "number",
161
+ left: "number",
162
+ },
163
+ },
164
+ ],
165
+ };
166
+ const BORDER_STYLE_RULE = {
167
+ type: "object",
168
+ shape: { color: "string", width: "number", dashType: "string" },
169
+ };
170
+ const FILL_STYLE_RULE = {
171
+ type: "object",
172
+ shape: { color: "string", transparency: "number" },
173
+ };
174
+ const SHADOW_STYLE_RULE = {
175
+ type: "object",
176
+ shape: {
177
+ type: "string",
178
+ opacity: "number",
179
+ blur: "number",
180
+ angle: "number",
181
+ offset: "number",
182
+ color: "string",
183
+ },
184
+ };
185
+ const UNDERLINE_RULE = {
186
+ type: "union",
187
+ options: [
188
+ "boolean",
189
+ { type: "object", shape: { style: "string", color: "string" } },
190
+ ],
191
+ };
192
+ const LINE_ARROW_RULE = {
193
+ type: "union",
194
+ options: ["boolean", { type: "object", shape: { type: "string" } }],
195
+ };
196
+ const BACKGROUND_IMAGE_RULE = {
197
+ type: "object",
198
+ shape: { src: "string", sizing: "string" },
199
+ };
200
+ const TREE_CONNECTOR_STYLE_RULE = {
201
+ type: "object",
202
+ shape: { color: "string", width: "number" },
203
+ };
204
+ const FLOW_CONNECTOR_STYLE_RULE = {
205
+ type: "object",
206
+ shape: { color: "string", width: "number", arrowType: "string" },
207
+ };
208
+ const IMAGE_SIZING_RULE = {
209
+ type: "object",
210
+ shape: {
211
+ type: "string",
212
+ w: "number",
213
+ h: "number",
214
+ x: "number",
215
+ y: "number",
216
+ },
217
+ };
218
+ // ===== Base node 属性 =====
219
+ const BASE_RULES = {
220
+ w: LENGTH_RULE,
221
+ h: LENGTH_RULE,
222
+ minW: "number",
223
+ maxW: "number",
224
+ minH: "number",
225
+ maxH: "number",
226
+ padding: PADDING_RULE,
227
+ margin: PADDING_RULE,
228
+ backgroundColor: "string",
229
+ backgroundImage: BACKGROUND_IMAGE_RULE,
230
+ border: BORDER_STYLE_RULE,
231
+ borderRadius: "number",
232
+ opacity: "number",
233
+ zIndex: "number",
234
+ position: "string",
235
+ top: "number",
236
+ right: "number",
237
+ bottom: "number",
238
+ left: "number",
239
+ alignSelf: "string",
240
+ };
241
+ // テキスト系の共通属性
242
+ const TEXT_STYLE_RULES = {
243
+ fontSize: "number",
244
+ color: "string",
245
+ textAlign: "string",
246
+ bold: "boolean",
247
+ italic: "boolean",
248
+ underline: UNDERLINE_RULE,
249
+ strike: "boolean",
250
+ highlight: "string",
251
+ fontFamily: "string",
252
+ lineHeight: "number",
253
+ };
254
+ // ===== ノードタイプ別の変換ルールマップ =====
255
+ export const NODE_COERCION_MAP = {
256
+ text: {
257
+ ...BASE_RULES,
258
+ text: "string",
259
+ ...TEXT_STYLE_RULES,
260
+ },
261
+ ul: {
262
+ ...BASE_RULES,
263
+ items: "json",
264
+ ...TEXT_STYLE_RULES,
265
+ },
266
+ ol: {
267
+ ...BASE_RULES,
268
+ items: "json",
269
+ ...TEXT_STYLE_RULES,
270
+ numberType: "string",
271
+ numberStartAt: "number",
272
+ },
273
+ image: {
274
+ ...BASE_RULES,
275
+ src: "string",
276
+ sizing: IMAGE_SIZING_RULE,
277
+ shadow: SHADOW_STYLE_RULE,
278
+ },
279
+ icon: {
280
+ ...BASE_RULES,
281
+ name: "string",
282
+ size: "number",
283
+ color: "string",
284
+ variant: "string",
285
+ bgColor: "string",
286
+ },
287
+ table: {
288
+ ...BASE_RULES,
289
+ columns: "json",
290
+ rows: "json",
291
+ defaultRowHeight: "number",
292
+ },
293
+ shape: {
294
+ ...BASE_RULES,
295
+ shapeType: "string",
296
+ text: "string",
297
+ fill: FILL_STYLE_RULE,
298
+ line: BORDER_STYLE_RULE,
299
+ shadow: SHADOW_STYLE_RULE,
300
+ ...TEXT_STYLE_RULES,
301
+ },
302
+ chart: {
303
+ ...BASE_RULES,
304
+ chartType: "string",
305
+ data: "json",
306
+ showLegend: "boolean",
307
+ showTitle: "boolean",
308
+ title: "string",
309
+ chartColors: "json",
310
+ radarStyle: "string",
311
+ },
312
+ timeline: {
313
+ ...BASE_RULES,
314
+ direction: "string",
315
+ items: "json",
316
+ },
317
+ matrix: {
318
+ ...BASE_RULES,
319
+ axes: "json",
320
+ quadrants: "json",
321
+ items: "json",
322
+ },
323
+ tree: {
324
+ ...BASE_RULES,
325
+ layout: "string",
326
+ nodeShape: "string",
327
+ data: "json",
328
+ connectorStyle: TREE_CONNECTOR_STYLE_RULE,
329
+ nodeWidth: "number",
330
+ nodeHeight: "number",
331
+ levelGap: "number",
332
+ siblingGap: "number",
333
+ },
334
+ flow: {
335
+ ...BASE_RULES,
336
+ direction: "string",
337
+ nodes: "json",
338
+ connections: "json",
339
+ connectorStyle: FLOW_CONNECTOR_STYLE_RULE,
340
+ nodeWidth: "number",
341
+ nodeHeight: "number",
342
+ nodeGap: "number",
343
+ },
344
+ processArrow: {
345
+ ...BASE_RULES,
346
+ direction: "string",
347
+ steps: "json",
348
+ itemWidth: "number",
349
+ itemHeight: "number",
350
+ gap: "number",
351
+ fontSize: "number",
352
+ bold: "boolean",
353
+ italic: "boolean",
354
+ underline: UNDERLINE_RULE,
355
+ strike: "boolean",
356
+ highlight: "string",
357
+ },
358
+ pyramid: {
359
+ ...BASE_RULES,
360
+ direction: "string",
361
+ levels: "json",
362
+ fontSize: "number",
363
+ bold: "boolean",
364
+ },
365
+ line: {
366
+ ...BASE_RULES,
367
+ x1: "number",
368
+ y1: "number",
369
+ x2: "number",
370
+ y2: "number",
371
+ color: "string",
372
+ lineWidth: "number",
373
+ dashType: "string",
374
+ beginArrow: LINE_ARROW_RULE,
375
+ endArrow: LINE_ARROW_RULE,
376
+ },
377
+ // コンテナノード
378
+ box: {
379
+ ...BASE_RULES,
380
+ shadow: SHADOW_STYLE_RULE,
381
+ },
382
+ vstack: {
383
+ ...BASE_RULES,
384
+ gap: "number",
385
+ alignItems: "string",
386
+ justifyContent: "string",
387
+ shadow: SHADOW_STYLE_RULE,
388
+ flexWrap: "string",
389
+ },
390
+ hstack: {
391
+ ...BASE_RULES,
392
+ gap: "number",
393
+ alignItems: "string",
394
+ justifyContent: "string",
395
+ shadow: SHADOW_STYLE_RULE,
396
+ flexWrap: "string",
397
+ },
398
+ layer: {
399
+ ...BASE_RULES,
400
+ },
401
+ };
402
+ // ===== 子要素の変換ルールマップ =====
403
+ export const CHILD_ELEMENT_COERCION_MAP = {
404
+ ProcessArrowStep: {
405
+ label: "string",
406
+ color: "string",
407
+ textColor: "string",
408
+ },
409
+ PyramidLevel: {
410
+ label: "string",
411
+ color: "string",
412
+ textColor: "string",
413
+ },
414
+ TimelineItem: {
415
+ date: "string",
416
+ title: "string",
417
+ description: "string",
418
+ color: "string",
419
+ },
420
+ MatrixAxes: {
421
+ x: "string",
422
+ y: "string",
423
+ },
424
+ MatrixQuadrants: {
425
+ topLeft: "string",
426
+ topRight: "string",
427
+ bottomLeft: "string",
428
+ bottomRight: "string",
429
+ },
430
+ MatrixItem: {
431
+ label: "string",
432
+ x: "number",
433
+ y: "number",
434
+ color: "string",
435
+ },
436
+ FlowNode: {
437
+ id: "string",
438
+ shape: "string",
439
+ text: "string",
440
+ color: "string",
441
+ textColor: "string",
442
+ width: "number",
443
+ height: "number",
444
+ },
445
+ FlowConnection: {
446
+ from: "string",
447
+ to: "string",
448
+ label: "string",
449
+ color: "string",
450
+ },
451
+ TableColumn: {
452
+ width: "number",
453
+ },
454
+ TableCell: {
455
+ text: "string",
456
+ fontSize: "number",
457
+ color: "string",
458
+ bold: "boolean",
459
+ italic: "boolean",
460
+ underline: UNDERLINE_RULE,
461
+ strike: "boolean",
462
+ highlight: "string",
463
+ textAlign: "string",
464
+ backgroundColor: "string",
465
+ colspan: "number",
466
+ rowspan: "number",
467
+ },
468
+ Li: {
469
+ text: "string",
470
+ bold: "boolean",
471
+ italic: "boolean",
472
+ underline: UNDERLINE_RULE,
473
+ strike: "boolean",
474
+ highlight: "string",
475
+ color: "string",
476
+ fontSize: "number",
477
+ fontFamily: "string",
478
+ },
479
+ };