@hirokisakabe/pom 5.2.0 → 5.2.1

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 (104) 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 +477 -0
  27. package/dist/parseXml/inputSchema.d.ts +15 -105
  28. package/dist/parseXml/inputSchema.d.ts.map +1 -1
  29. package/dist/parseXml/inputSchema.js +2 -2
  30. package/dist/parseXml/parseXml.d.ts.map +1 -1
  31. package/dist/parseXml/parseXml.js +40 -272
  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 +28 -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/renderPptx.d.ts +2 -1
  78. package/dist/renderPptx/renderPptx.d.ts.map +1 -1
  79. package/dist/renderPptx/renderPptx.js +19 -60
  80. package/dist/renderPptx/types.d.ts +2 -0
  81. package/dist/renderPptx/types.d.ts.map +1 -1
  82. package/dist/renderPptx/utils/backgroundBorder.d.ts.map +1 -1
  83. package/dist/renderPptx/utils/backgroundBorder.js +1 -1
  84. package/dist/shared/freeYogaTree.d.ts.map +1 -0
  85. package/dist/shared/measureImage.d.ts +13 -3
  86. package/dist/shared/measureImage.d.ts.map +1 -1
  87. package/dist/shared/measureImage.js +14 -19
  88. package/dist/shared/walkTree.d.ts.map +1 -0
  89. package/dist/toPositioned/toPositioned.d.ts +8 -1
  90. package/dist/toPositioned/toPositioned.d.ts.map +1 -1
  91. package/dist/toPositioned/toPositioned.js +32 -189
  92. package/dist/types.d.ts +17 -54
  93. package/dist/types.d.ts.map +1 -1
  94. package/dist/types.js +1 -1
  95. package/package.json +3 -3
  96. package/dist/autoFit/freeYogaTree.d.ts.map +0 -1
  97. package/dist/autoFit/walkTree.d.ts.map +0 -1
  98. package/dist/renderPptx/nodes/index.d.ts +0 -15
  99. package/dist/renderPptx/nodes/index.d.ts.map +0 -1
  100. package/dist/renderPptx/nodes/index.js +0 -14
  101. /package/dist/{autoFit → shared}/freeYogaTree.d.ts +0 -0
  102. /package/dist/{autoFit → shared}/freeYogaTree.js +0 -0
  103. /package/dist/{autoFit → shared}/walkTree.d.ts +0 -0
  104. /package/dist/{autoFit → shared}/walkTree.js +0 -0
@@ -0,0 +1,477 @@
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
+ },
285
+ table: {
286
+ ...BASE_RULES,
287
+ columns: "json",
288
+ rows: "json",
289
+ defaultRowHeight: "number",
290
+ },
291
+ shape: {
292
+ ...BASE_RULES,
293
+ shapeType: "string",
294
+ text: "string",
295
+ fill: FILL_STYLE_RULE,
296
+ line: BORDER_STYLE_RULE,
297
+ shadow: SHADOW_STYLE_RULE,
298
+ ...TEXT_STYLE_RULES,
299
+ },
300
+ chart: {
301
+ ...BASE_RULES,
302
+ chartType: "string",
303
+ data: "json",
304
+ showLegend: "boolean",
305
+ showTitle: "boolean",
306
+ title: "string",
307
+ chartColors: "json",
308
+ radarStyle: "string",
309
+ },
310
+ timeline: {
311
+ ...BASE_RULES,
312
+ direction: "string",
313
+ items: "json",
314
+ },
315
+ matrix: {
316
+ ...BASE_RULES,
317
+ axes: "json",
318
+ quadrants: "json",
319
+ items: "json",
320
+ },
321
+ tree: {
322
+ ...BASE_RULES,
323
+ layout: "string",
324
+ nodeShape: "string",
325
+ data: "json",
326
+ connectorStyle: TREE_CONNECTOR_STYLE_RULE,
327
+ nodeWidth: "number",
328
+ nodeHeight: "number",
329
+ levelGap: "number",
330
+ siblingGap: "number",
331
+ },
332
+ flow: {
333
+ ...BASE_RULES,
334
+ direction: "string",
335
+ nodes: "json",
336
+ connections: "json",
337
+ connectorStyle: FLOW_CONNECTOR_STYLE_RULE,
338
+ nodeWidth: "number",
339
+ nodeHeight: "number",
340
+ nodeGap: "number",
341
+ },
342
+ processArrow: {
343
+ ...BASE_RULES,
344
+ direction: "string",
345
+ steps: "json",
346
+ itemWidth: "number",
347
+ itemHeight: "number",
348
+ gap: "number",
349
+ fontSize: "number",
350
+ bold: "boolean",
351
+ italic: "boolean",
352
+ underline: UNDERLINE_RULE,
353
+ strike: "boolean",
354
+ highlight: "string",
355
+ },
356
+ pyramid: {
357
+ ...BASE_RULES,
358
+ direction: "string",
359
+ levels: "json",
360
+ fontSize: "number",
361
+ bold: "boolean",
362
+ },
363
+ line: {
364
+ ...BASE_RULES,
365
+ x1: "number",
366
+ y1: "number",
367
+ x2: "number",
368
+ y2: "number",
369
+ color: "string",
370
+ lineWidth: "number",
371
+ dashType: "string",
372
+ beginArrow: LINE_ARROW_RULE,
373
+ endArrow: LINE_ARROW_RULE,
374
+ },
375
+ // コンテナノード
376
+ box: {
377
+ ...BASE_RULES,
378
+ shadow: SHADOW_STYLE_RULE,
379
+ },
380
+ vstack: {
381
+ ...BASE_RULES,
382
+ gap: "number",
383
+ alignItems: "string",
384
+ justifyContent: "string",
385
+ shadow: SHADOW_STYLE_RULE,
386
+ flexWrap: "string",
387
+ },
388
+ hstack: {
389
+ ...BASE_RULES,
390
+ gap: "number",
391
+ alignItems: "string",
392
+ justifyContent: "string",
393
+ shadow: SHADOW_STYLE_RULE,
394
+ flexWrap: "string",
395
+ },
396
+ layer: {
397
+ ...BASE_RULES,
398
+ },
399
+ };
400
+ // ===== 子要素の変換ルールマップ =====
401
+ export const CHILD_ELEMENT_COERCION_MAP = {
402
+ ProcessArrowStep: {
403
+ label: "string",
404
+ color: "string",
405
+ textColor: "string",
406
+ },
407
+ PyramidLevel: {
408
+ label: "string",
409
+ color: "string",
410
+ textColor: "string",
411
+ },
412
+ TimelineItem: {
413
+ date: "string",
414
+ title: "string",
415
+ description: "string",
416
+ color: "string",
417
+ },
418
+ MatrixAxes: {
419
+ x: "string",
420
+ y: "string",
421
+ },
422
+ MatrixQuadrants: {
423
+ topLeft: "string",
424
+ topRight: "string",
425
+ bottomLeft: "string",
426
+ bottomRight: "string",
427
+ },
428
+ MatrixItem: {
429
+ label: "string",
430
+ x: "number",
431
+ y: "number",
432
+ color: "string",
433
+ },
434
+ FlowNode: {
435
+ id: "string",
436
+ shape: "string",
437
+ text: "string",
438
+ color: "string",
439
+ textColor: "string",
440
+ width: "number",
441
+ height: "number",
442
+ },
443
+ FlowConnection: {
444
+ from: "string",
445
+ to: "string",
446
+ label: "string",
447
+ color: "string",
448
+ },
449
+ TableColumn: {
450
+ width: "number",
451
+ },
452
+ TableCell: {
453
+ text: "string",
454
+ fontSize: "number",
455
+ color: "string",
456
+ bold: "boolean",
457
+ italic: "boolean",
458
+ underline: UNDERLINE_RULE,
459
+ strike: "boolean",
460
+ highlight: "string",
461
+ textAlign: "string",
462
+ backgroundColor: "string",
463
+ colspan: "number",
464
+ rowspan: "number",
465
+ },
466
+ Li: {
467
+ text: "string",
468
+ bold: "boolean",
469
+ italic: "boolean",
470
+ underline: UNDERLINE_RULE,
471
+ strike: "boolean",
472
+ highlight: "string",
473
+ color: "string",
474
+ fontSize: "number",
475
+ fontFamily: "string",
476
+ },
477
+ };