json-renderers 1.16.1 → 1.17.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.
Files changed (43) hide show
  1. package/README.md +6 -1
  2. package/docs/dist/min.js +716 -1179
  3. package/docs/dist/v16/min.js +1576 -0
  4. package/docs/dist/v17/min.js +1047 -0
  5. package/package.json +2 -2
  6. package/src/index.js +2 -2
  7. package/src/v16/buildSpec/index.js +40 -40
  8. package/src/v16/common/deriveColumnsFromData.js +20 -20
  9. package/src/v16/guard.js +38 -38
  10. package/src/v16/index.js +106 -110
  11. package/src/v16/meta.js +6 -6
  12. package/src/v16/registerGlobal.js +27 -27
  13. package/src/v17/buildSpec/index.js +25 -0
  14. package/src/v17/configSpec.json +9 -0
  15. package/src/v17/getSpec.js +12 -0
  16. package/src/v17/guard.js +41 -0
  17. package/src/v17/index.js +32 -0
  18. package/src/{v11 → v17}/meta.js +1 -1
  19. package/src/v17/registerGlobal.js +28 -0
  20. package/src/v17/renderToDom/index.js +47 -0
  21. package/src/v17/validateConfig.js +37 -0
  22. package/src/v11/dataLists/fragments.json +0 -1
  23. package/src/v11/dataLists/index.js +0 -32
  24. package/src/v11/dataLists/skeleton.json +0 -38
  25. package/src/v11/index.js +0 -62
  26. package/src/v11/registerGlobal.js +0 -14
  27. package/src/v11/select/fragments.json +0 -1
  28. package/src/v11/select/index.js +0 -34
  29. package/src/v11/select/skeleton.json +0 -23
  30. package/src/v11/table/index.js +0 -35
  31. package/src/v11/table/skeleton.json +0 -47
  32. package/src/v12/common/deriveColumnsFromData.js +0 -20
  33. package/src/v12/index.js +0 -62
  34. package/src/v12/meta.js +0 -6
  35. package/src/v12/registerGlobal.js +0 -14
  36. package/src/v12/table/index.js +0 -35
  37. package/src/v12/table/skeleton.json +0 -47
  38. package/src/v13/buildSpec/index.js +0 -39
  39. package/src/v13/common/deriveColumnsFromData.js +0 -20
  40. package/src/v13/index.js +0 -81
  41. package/src/v13/meta.js +0 -6
  42. package/src/v13/registerGlobal.js +0 -14
  43. /package/src/{v11 → v17}/common/deriveColumnsFromData.js +0 -0
@@ -0,0 +1,1047 @@
1
+ const q = {
2
+ version: "v17.0.0",
3
+ description: "build table from store data and render to DOM uses json-to-spec, json-to-dom under the hood"
4
+ }, _ = (e) => {
5
+ const t = e;
6
+ if (typeof globalThis > "u" || !t) return;
7
+ globalThis.ks ?? (globalThis.ks = {});
8
+ const o = typeof t == "function" ? t : t.render, n = typeof t == "object" ? t.getSpec : void 0;
9
+ globalThis.ks.jsonRenderers = {
10
+ meta: q,
11
+ ...typeof t == "object" ? t : {},
12
+ render: o,
13
+ renderToDom: o,
14
+ domMount: t == null ? void 0 : t.renderToDom,
15
+ ...n ? { getSpec: n } : {}
16
+ };
17
+ }, J = "table", Y = "", U = [], X = [], Q = "", W = "replace", Z = !1, b = {
18
+ type: J,
19
+ targetHtmlId: Y,
20
+ data: U,
21
+ columns: X,
22
+ classToApply: Q,
23
+ appendPosition: W,
24
+ showLog: Z
25
+ }, tt = ({ inConfig: e } = {}) => {
26
+ const t = e;
27
+ if (!t || typeof t != "object")
28
+ throw console.error("Config must be an object"), new TypeError("Config must be an object");
29
+ for (const o of Object.keys(b)) {
30
+ if (!(o in t) || t[o] === void 0)
31
+ throw console.error(`Missing compulsory key: "${o}"`), new Error(`Missing compulsory key: "${o}"`);
32
+ if (Array.isArray(b[o])) {
33
+ if (!Array.isArray(t[o]))
34
+ throw console.error(`${o} must be an Array`), new TypeError(`${o} must be an Array`);
35
+ } else if (typeof t[o] != typeof b[o])
36
+ throw console.error(`${o} must be of type ${typeof b[o]}`), new TypeError(`${o} must be of type ${typeof b[o]}`);
37
+ }
38
+ if (typeof t.targetHtmlId == "string" && !t.targetHtmlId.trim())
39
+ throw console.error("targetHtmlId must be a non-empty string"), new TypeError("targetHtmlId must be a non-empty string");
40
+ return !0;
41
+ }, O = ({
42
+ type: e = "table",
43
+ targetHtmlId: t,
44
+ data: o,
45
+ columns: n,
46
+ classToApply: a = "",
47
+ appendPosition: r = "replace",
48
+ showLog: s = !1
49
+ } = {}) => {
50
+ const y = {
51
+ type: e,
52
+ targetHtmlId: t,
53
+ data: o,
54
+ columns: n,
55
+ classToApply: a,
56
+ appendPosition: r,
57
+ showLog: s
58
+ };
59
+ return tt({ inConfig: y }), y;
60
+ }, P = () => ({ ...b });
61
+ Object.assign(P, b);
62
+ const et = {
63
+ version: "1.15.0",
64
+ name: "json-renderers-build"
65
+ }, ot = (e) => {
66
+ const t = e;
67
+ if (typeof globalThis > "u" || !t) return;
68
+ globalThis.ks ?? (globalThis.ks = {});
69
+ const o = typeof t == "function" ? t : t.render, n = typeof t == "object" ? t.getSpec : void 0;
70
+ globalThis.ks.jsonRenderersBuild = {
71
+ meta: et,
72
+ renderToDom: o,
73
+ render: o,
74
+ ...n ? { getSpec: n } : {},
75
+ ...typeof t == "object" ? t : {}
76
+ };
77
+ }, N = ["table", "tableFromSpec", "select", "selectOptionsOnly", "dataList", "datalist"], nt = ["table", "tableFromSpec"], F = ({ inConfig: e } = {}) => {
78
+ const t = e;
79
+ if (!t || typeof t != "object")
80
+ throw console.error("Config must be an object"), new TypeError("Config must be an object");
81
+ if (typeof t.type != "string" || !N.includes(t.type))
82
+ throw console.error(`type must be one of: ${N.join(", ")}`), new Error(`type must be one of: ${N.join(", ")}`);
83
+ if (t.showLog !== void 0 && typeof t.showLog != "boolean")
84
+ throw console.error("showLog must be a boolean"), new TypeError("showLog must be a boolean");
85
+ if (!Array.isArray(t.data))
86
+ throw console.error("data must be an Array"), new TypeError("data must be an Array");
87
+ if (nt.includes(t.type)) {
88
+ if (!Array.isArray(t.columns))
89
+ throw console.error("columns must be an array for table rendering"), new TypeError("columns must be an array for table rendering");
90
+ for (let o = 0; o < t.columns.length; o++) {
91
+ const n = t.columns[o];
92
+ if (!n || typeof n != "object")
93
+ throw console.error(`columns[${o}] must be an object`), new TypeError(`columns[${o}] must be an object`);
94
+ if (typeof n.columnName != "string" || !n.columnName.trim())
95
+ throw console.error(`columns[${o}].columnName must be a non-empty string`), new TypeError(`columns[${o}].columnName must be a non-empty string`);
96
+ }
97
+ for (let o = 0; o < t.data.length; o++) {
98
+ const n = t.data[o];
99
+ if (!n || typeof n != "object")
100
+ throw console.error(`data[${o}] must be an object`), new TypeError(`data[${o}] must be an object`);
101
+ }
102
+ if (t.columns.length > 0 && t.data.length > 0) {
103
+ const o = t.columns.map((r) => r.columnName), n = Object.keys(t.data[0]);
104
+ if (!o.some((r) => n.includes(r))) {
105
+ const r = `Data alignment error: None of the columns [${o.join(", ")}] match any keys in data rows [${n.join(", ")}]`;
106
+ throw console.error(r), new Error(r);
107
+ }
108
+ }
109
+ }
110
+ return !0;
111
+ }, rt = "table", at = [], lt = [], st = {}, ct = !1, h = {
112
+ type: rt,
113
+ columns: at,
114
+ data: lt,
115
+ options: st,
116
+ showLog: ct
117
+ }, it = [
118
+ {
119
+ columnName: "Name",
120
+ width: "150px"
121
+ },
122
+ {
123
+ columnName: "Designation",
124
+ width: "100px"
125
+ }
126
+ ], ut = [
127
+ {
128
+ Name: "Keshav",
129
+ Designation: "Founder"
130
+ }
131
+ ], dt = {
132
+ columns: it,
133
+ data: ut
134
+ }, f = {
135
+ ...h,
136
+ ...dt
137
+ }, x = ({
138
+ type: e = f.type,
139
+ data: t = f.data,
140
+ columns: o = f.columns,
141
+ options: n = f.options,
142
+ showLog: a = f.showLog
143
+ } = {}) => {
144
+ const l = {
145
+ type: e,
146
+ data: t,
147
+ columns: o,
148
+ options: n,
149
+ showLog: a
150
+ };
151
+ return F({ inConfig: l }), l;
152
+ };
153
+ Object.assign(x, f);
154
+ x.toJSON = () => structuredClone(f);
155
+ const pt = (e) => typeof e == "object" && e !== null && !Array.isArray(e), ft = (e, t) => {
156
+ if (!pt(e)) return;
157
+ let o = {};
158
+ for (const [n, a] of Object.entries(e))
159
+ o[n] = w(a, t);
160
+ return o;
161
+ }, bt = (e, t) => {
162
+ const o = structuredClone(e);
163
+ return Array.isArray(o) ? o.map((a) => w(t, a)) : void 0;
164
+ }, k = (e, t, o) => {
165
+ if (e === "${agg:count}" && "rowData" in t) {
166
+ if (Array.isArray(t == null ? void 0 : t.rowData))
167
+ return t == null ? void 0 : t.rowData.length;
168
+ } else
169
+ return e === "${rowValue}" && "rowData" in t ? t == null ? void 0 : t.rowData : e.replace(/\$\{(\w+)\}/g, (n, a) => t[a] !== void 0 ? t[a] : n);
170
+ }, ht = (e, t) => k(e, t), mt = (e, t, o) => {
171
+ if (e == null)
172
+ throw new TypeError("inTemplate is required");
173
+ if (typeof e != "object" && typeof e != "string")
174
+ throw new TypeError("inTemplate must be an object or string");
175
+ if (!t || typeof t != "object" || Array.isArray(t))
176
+ throw new TypeError("inElement must be an object");
177
+ return !0;
178
+ }, w = (e, t, o) => {
179
+ const n = e, a = t;
180
+ mt(n, a);
181
+ const r = structuredClone(a);
182
+ return typeof r == "string" ? k(r, n) : (r === null || typeof r != "object" || ("textContent" in r && (r.textContent = ht(r == null ? void 0 : r.textContent, n)), "attributes" in r && (r.attributes = ft(r == null ? void 0 : r.attributes, n)), "children" in r && (r.children = bt(r == null ? void 0 : r.children, n))), r);
183
+ }, gt = (e, t) => {
184
+ if (!Array.isArray(e))
185
+ throw new TypeError("inSource must be an Array");
186
+ if (e.length === 0)
187
+ throw new Error("inSource cannot be empty");
188
+ for (let o = 0; o < e.length; o++)
189
+ if (!e[o] || typeof e[o] != "object")
190
+ throw new TypeError(`inSource[${o}] must be an object`);
191
+ if (!t || typeof t != "object" && typeof t != "string")
192
+ throw new TypeError("inTemplate must be an object or string");
193
+ return !0;
194
+ }, C = (e, t) => {
195
+ const o = e, n = t;
196
+ return gt(o, n), o.map((a) => w(a, n));
197
+ }, wt = (e, t) => e.map((n) => ({
198
+ ...n,
199
+ rowData: t[n.columnName]
200
+ })), yt = (e, t, o) => {
201
+ var a, r, s, c, i, u;
202
+ if (!Array.isArray(e))
203
+ throw new TypeError("inColumns must be an Array");
204
+ if (e.length === 0)
205
+ throw new Error("inColumns cannot be empty");
206
+ for (let l = 0; l < e.length; l++) {
207
+ const d = e[l];
208
+ if (!d || typeof d != "object")
209
+ throw new TypeError(`inColumns[${l}] must be an object`);
210
+ if (typeof d.columnName != "string" || !d.columnName.trim())
211
+ throw new TypeError(`inColumns[${l}].columnName must be a non-empty string`);
212
+ }
213
+ if (!Array.isArray(t))
214
+ throw new TypeError("inData must be an Array");
215
+ for (let l = 0; l < t.length; l++) {
216
+ const d = t[l];
217
+ if (!d || typeof d != "object")
218
+ throw new TypeError(`inData[${l}] must be an object`);
219
+ }
220
+ if (!o || typeof o != "object" || Array.isArray(o))
221
+ throw new TypeError("inSpec must be an object");
222
+ const n = ((s = (r = (a = e[0]) == null ? void 0 : a.template) == null ? void 0 : r.body) == null ? void 0 : s.tr) || "buildBodyTr";
223
+ if (!(n in o))
224
+ throw new Error(`Row template "${n}" not found in inSpec`);
225
+ for (let l = 0; l < e.length; l++) {
226
+ const d = e[l], p = ((i = (c = d.template) == null ? void 0 : c.body) == null ? void 0 : i.cell) || ((u = d.template) == null ? void 0 : u.bodyCell) || "buildBodyCell";
227
+ if (!(p in o))
228
+ throw new Error(`Cell template "${p}" for column "${d.columnName}" not found in inSpec`);
229
+ }
230
+ return !0;
231
+ }, Tt = (e, t) => e.map((n) => {
232
+ var c, i, u;
233
+ const a = ((i = (c = n.template) == null ? void 0 : c.body) == null ? void 0 : i.cell) || ((u = n.template) == null ? void 0 : u.bodyCell) || "buildBodyCell", r = t[a];
234
+ return w(n, r);
235
+ }), Ct = (e, t, o) => {
236
+ var u, l, d;
237
+ yt(e, t, o);
238
+ const n = e, a = t, r = o, s = ((d = (l = (u = n[0]) == null ? void 0 : u.template) == null ? void 0 : l.body) == null ? void 0 : d.tr) || "buildBodyTr", c = r[s];
239
+ return a.map((p) => {
240
+ const A = w(p, c), y = wt(n, p), z = Tt(y, r);
241
+ return A.children = z, A;
242
+ });
243
+ }, S = (e, t) => {
244
+ var o;
245
+ if (((o = e == null ? void 0 : e.attributes) == null ? void 0 : o["data-role"]) === t) return e;
246
+ for (const n of (e == null ? void 0 : e.children) ?? []) {
247
+ const a = S(n, t);
248
+ if (a) return a;
249
+ }
250
+ return null;
251
+ }, At = (e, t) => {
252
+ const o = e[t.fileName], n = t.dataRole ? S(o, t.dataRole) : o;
253
+ return (t.filePath ?? []).reduce((a, r) => a[r], n);
254
+ }, Nt = {
255
+ tagName: "tr",
256
+ attributes: {
257
+ class: "align-middle"
258
+ },
259
+ children: []
260
+ }, $t = {
261
+ tagName: "col",
262
+ attributes: {
263
+ width: "${width}"
264
+ }
265
+ }, xt = {
266
+ tagName: "th",
267
+ textContent: "${columnName}",
268
+ attributes: {
269
+ class: "py-3 px-3 fw-semibold text-uppercase small"
270
+ }
271
+ }, St = {
272
+ tagName: "td",
273
+ children: [
274
+ {
275
+ tagName: "input",
276
+ attributes: {
277
+ type: "text",
278
+ placeholder: "enter ${columnName}",
279
+ name: "${columnName}",
280
+ class: "form-control"
281
+ }
282
+ }
283
+ ]
284
+ }, jt = {
285
+ tagName: "td",
286
+ textContent: "${rowValue}",
287
+ attributes: {
288
+ class: "py-3 px-3 text-secondary"
289
+ }
290
+ }, Lt = {
291
+ tagName: "button",
292
+ textContent: "${columnName}",
293
+ attributes: {
294
+ class: "btn btn-primary btn-sm"
295
+ }
296
+ }, Dt = {
297
+ tagName: "td",
298
+ attributes: {
299
+ class: "py-2 px-3 text-center"
300
+ },
301
+ children: [
302
+ {
303
+ tagName: "button",
304
+ textContent: "${agg:count}",
305
+ attributes: {
306
+ class: "btn btn-primary btn-sm"
307
+ }
308
+ }
309
+ ]
310
+ }, Et = {
311
+ tagName: "option",
312
+ textContent: "${rowValue}",
313
+ attributes: {
314
+ value: "${rowValue}"
315
+ }
316
+ }, Ot = {
317
+ tagName: "select",
318
+ attributes: {
319
+ id: "LedgerName"
320
+ },
321
+ children: []
322
+ }, Pt = {
323
+ tagName: "datalist",
324
+ attributes: {
325
+ "data-name": "${columnName}"
326
+ },
327
+ children: []
328
+ }, j = {
329
+ buildBodyTr: Nt,
330
+ buildColGroup: $t,
331
+ buildHeader: xt,
332
+ buildFooter: St,
333
+ buildBodyCell: jt,
334
+ button: Lt,
335
+ buttonCell: Dt,
336
+ buildOption: Et,
337
+ buildSelect: Ot,
338
+ buildDataList: Pt
339
+ }, Ft = "table", kt = {
340
+ class: "table table-hover table-striped align-middle border mb-0"
341
+ }, It = [
342
+ {
343
+ tagName: "colgroup",
344
+ attributes: {
345
+ "data-role": "table-colgroup"
346
+ },
347
+ children: []
348
+ },
349
+ {
350
+ tagName: "thead",
351
+ attributes: {
352
+ class: "table-dark",
353
+ "data-role": "table-header"
354
+ },
355
+ children: [
356
+ {
357
+ tagName: "tr",
358
+ attributes: {
359
+ "data-role": "table-header-row"
360
+ },
361
+ children: []
362
+ }
363
+ ]
364
+ },
365
+ {
366
+ tagName: "tbody",
367
+ attributes: {
368
+ "data-role": "table-body"
369
+ },
370
+ children: []
371
+ },
372
+ {
373
+ tagName: "tfoot",
374
+ attributes: {
375
+ "data-role": "table-footer"
376
+ },
377
+ children: [
378
+ {
379
+ tagName: "tr",
380
+ attributes: {
381
+ "data-role": "table-footer-row"
382
+ },
383
+ children: []
384
+ }
385
+ ]
386
+ }
387
+ ], I = {
388
+ tagName: Ft,
389
+ attributes: kt,
390
+ children: It
391
+ }, Rt = [
392
+ {
393
+ narration: "Build the column widths for the table using the configured columns.",
394
+ destinationPath: {
395
+ fileName: "base",
396
+ dataRole: "table-colgroup",
397
+ filePath: [
398
+ "children"
399
+ ]
400
+ },
401
+ sourcePath: {
402
+ fileName: "data",
403
+ filePath: [
404
+ "columns"
405
+ ]
406
+ },
407
+ templateKey: "buildColGroup",
408
+ func: "fromCollection"
409
+ },
410
+ {
411
+ narration: "Build the header row for the table using the configured columns.",
412
+ destinationPath: {
413
+ fileName: "base",
414
+ dataRole: "table-header-row",
415
+ filePath: [
416
+ "children"
417
+ ]
418
+ },
419
+ sourcePath: {
420
+ fileName: "data",
421
+ filePath: [
422
+ "columns"
423
+ ]
424
+ },
425
+ templateKey: "buildHeader",
426
+ func: "fromCollection"
427
+ }
428
+ ], vt = [
429
+ {
430
+ narration: "Build the table body rows for the table using the configured columns and data.",
431
+ destinationPath: {
432
+ fileName: "base",
433
+ dataRole: "table-body",
434
+ filePath: [
435
+ "children"
436
+ ]
437
+ },
438
+ sourcePath: {
439
+ fileName: "data",
440
+ filePath: [
441
+ "columns"
442
+ ]
443
+ },
444
+ func: "twoDimensional"
445
+ }
446
+ ], T = (e) => Array.isArray(e) ? e : [e], L = {
447
+ set: (e, t, o) => {
448
+ e[t] = o;
449
+ },
450
+ push: (e, t, o) => {
451
+ e[t].push(...T(o));
452
+ },
453
+ unshift: (e, t, o) => {
454
+ e[t].unshift(...T(o));
455
+ },
456
+ pushToRows: (e, t, o) => {
457
+ e[t].forEach((n) => {
458
+ n.children.push(...structuredClone(T(o)));
459
+ });
460
+ },
461
+ unshiftToRows: (e, t, o) => {
462
+ e[t].forEach((n) => {
463
+ n.children.unshift(...structuredClone(T(o)));
464
+ });
465
+ },
466
+ unshiftSerialToRows: (e, t, o) => {
467
+ e[t].forEach((n, a) => {
468
+ const r = structuredClone(o);
469
+ r.textContent = a + 1, n.children.unshift(r);
470
+ });
471
+ }
472
+ }, R = (e, t, o) => {
473
+ const n = t.dataRole ? S(e[t.fileName], t.dataRole) : e[t.fileName], a = [...t.filePath ?? []], r = a.pop(), s = a.reduce((i, u) => i[u], n);
474
+ (L[t.action] || L.set)(s, r, o);
475
+ }, m = { data: {}, base: I, spec: j }, v = {
476
+ fromCollection: C,
477
+ twoDimensional: Ct
478
+ }, Ht = (e) => {
479
+ e.forEach((t) => {
480
+ const o = At(m, t.sourcePath);
481
+ if (o) {
482
+ const n = v[t.func](o, j[t.templateKey]);
483
+ R(m, t.destinationPath, n);
484
+ } else
485
+ console.log(" !instruction : ", t), console.log(" !source : ", o);
486
+ });
487
+ }, Vt = (e) => {
488
+ e.forEach((t) => {
489
+ const o = v[t.func](
490
+ m.data.columns,
491
+ m.data.data,
492
+ j
493
+ );
494
+ R(m, t.destinationPath, o);
495
+ });
496
+ }, Bt = (e) => (m.data = e, Ht(Rt), Vt(vt), I), D = ({
497
+ inData: e,
498
+ inColumns: t,
499
+ footer: o = [],
500
+ options: n
501
+ } = {}) => Bt({
502
+ columns: t,
503
+ data: e
504
+ }), Mt = {
505
+ tagName: "option",
506
+ textContent: "${rowValue}",
507
+ attributes: {
508
+ value: "${rowValue}"
509
+ }
510
+ }, Gt = {
511
+ tagName: "select",
512
+ attributes: {
513
+ id: "LedgerName"
514
+ },
515
+ children: []
516
+ }, Kt = {
517
+ tagName: "datalist",
518
+ attributes: {
519
+ "data-name": "${columnName}"
520
+ },
521
+ children: []
522
+ }, g = {
523
+ buildOption: Mt,
524
+ buildSelect: Gt,
525
+ buildDataList: Kt
526
+ }, zt = ({ inData: e = [] } = {}) => {
527
+ const t = (e ?? []).map(
528
+ (n) => typeof n == "object" && n !== null ? n : { rowValue: n }
529
+ ), o = structuredClone(g.buildSelect);
530
+ return o.children = C(t, g.buildOption), o;
531
+ }, qt = ({ inData: e = [], inColumns: t = [] } = {}) => t.map((n) => {
532
+ const a = structuredClone(g.buildOption);
533
+ return a.textContent = a.textContent.replace("rowValue", n.columnName), a.attributes.value = a.attributes.value.replace("rowValue", n.columnName), C(e, a);
534
+ }), E = ({ inData: e = [] } = {}) => {
535
+ const t = (e ?? []).map(
536
+ (n) => typeof n == "object" && n !== null ? n : { rowValue: n }
537
+ ), o = structuredClone(g.buildDataList);
538
+ return o.children = C(t, g.buildOption), o;
539
+ }, _t = {
540
+ table: D,
541
+ tableFromSpec: D,
542
+ select: zt,
543
+ selectOptionsOnly: qt,
544
+ dataList: E,
545
+ datalist: E
546
+ }, H = ({
547
+ type: e = h.type,
548
+ data: t = h.data,
549
+ columns: o = h.columns,
550
+ options: n = h.options,
551
+ showLog: a = h.showLog
552
+ } = {}) => {
553
+ const l = {
554
+ type: e,
555
+ data: t,
556
+ columns: o,
557
+ options: n,
558
+ showLog: a
559
+ };
560
+ F({ inConfig: l });
561
+ const d = _t[l.type];
562
+ if (!d)
563
+ throw new Error(`Renderer for type "${l.type}" not found.`);
564
+ const p = d({
565
+ inColumns: l.columns,
566
+ inData: l.data,
567
+ options: l.options
568
+ });
569
+ return l.showLog && console.log("json-renderers-build output:", p), p;
570
+ };
571
+ ot({ render: H, getSpec: x, spec: f });
572
+ const V = ({
573
+ inColumns: e,
574
+ inType: t = "table",
575
+ inData: o,
576
+ inShowLog: n = !1
577
+ } = {}) => H({
578
+ type: t,
579
+ data: o ?? [],
580
+ columns: e,
581
+ showLog: n
582
+ }), Jt = {
583
+ version: "v9",
584
+ description: "JSON-to-DOM engine with SVG namespace support, mixed text content, and centralized traversal"
585
+ }, Yt = ({ inFuncDefinition: e, inReviewSpec: t } = {}) => {
586
+ if (typeof globalThis > "u" || !e) return;
587
+ globalThis.ks ?? (globalThis.ks = {});
588
+ const o = {
589
+ meta: Jt,
590
+ buildSpecElement: e,
591
+ reviewSpec: t
592
+ };
593
+ globalThis.ks["json-to-tag"] = o, globalThis.ks.jsonToTag = o;
594
+ }, Ut = (e) => e == null ? null : typeof Node < "u" && e instanceof Node ? e : typeof e == "string" || typeof e == "number" ? document.createTextNode(String(e)) : typeof e == "object" && (e.nodeType === 3 || e.tagName === "#text" || !e.tagName && (e.textContent !== void 0 || e.text !== void 0)) ? document.createTextNode(e.textContent ?? e.text ?? "") : M(e), B = (e) => Array.isArray(e) ? e.map(Ut).flat(1 / 0).filter(Boolean) : [], Xt = (e) => (e == null, e), Qt = "http://www.w3.org/2000/svg", Wt = /* @__PURE__ */ new Set([
595
+ "svg",
596
+ "path",
597
+ "symbol",
598
+ "use",
599
+ "g",
600
+ "circle",
601
+ "ellipse",
602
+ "rect",
603
+ "line",
604
+ "polyline",
605
+ "polygon",
606
+ "text",
607
+ "tspan",
608
+ "defs",
609
+ "clippath",
610
+ "mask",
611
+ "pattern",
612
+ "marker",
613
+ "lineargradient",
614
+ "radialgradient",
615
+ "stop",
616
+ "image",
617
+ "filter",
618
+ "fegaussianblur",
619
+ "femerge",
620
+ "femergenode"
621
+ ]), Zt = ({ inTagName: e }) => {
622
+ const t = e == null ? void 0 : e.toLowerCase();
623
+ if (!t) return null;
624
+ if (t === "checkbox") {
625
+ const o = document.createElement("input");
626
+ return o.type = "checkbox", o;
627
+ }
628
+ return Wt.has(t) ? document.createElementNS(Qt, t) : document.createElement(t);
629
+ }, te = ({ inElement: e, inTextContent: t }) => (!e || t === void 0 || t === null || (e.textContent = t), e), ee = ({ inElement: e, inProperties: t }) => (e && t && typeof t == "object" && Object.assign(e, t), e), oe = "http://www.w3.org/1999/xlink", ne = ({ inElement: e, inAttributes: t }) => {
630
+ const o = e, n = t;
631
+ if (!o || !n || typeof n != "object")
632
+ return o;
633
+ const a = typeof SVGElement < "u" ? o instanceof SVGElement : o.namespaceURI === "http://www.w3.org/2000/svg";
634
+ return Object.entries(n).forEach(([r, s]) => {
635
+ if (r === "class") {
636
+ a ? o.setAttribute("class", String(s)) : o.className = s;
637
+ return;
638
+ }
639
+ if (r === "xlink:href" || r === "href") {
640
+ if (s != null) {
641
+ const c = String(s);
642
+ if (a)
643
+ try {
644
+ o.setAttributeNS(oe, "href", c);
645
+ } catch {
646
+ }
647
+ o.setAttribute("href", c), o.setAttribute("xlink:href", c);
648
+ }
649
+ return;
650
+ }
651
+ if (typeof s == "boolean") {
652
+ s ? o.setAttribute(r, "") : o.removeAttribute(r);
653
+ return;
654
+ }
655
+ s != null && o.setAttribute(r, String(s));
656
+ }), o;
657
+ }, re = ({ inElement: e, inClassList: t }) => {
658
+ if (!e || !t) return e;
659
+ const o = typeof t == "string" ? t.split(/\s+/).filter(Boolean) : Array.isArray(t) ? t.filter((n) => typeof n == "string" && n.trim()) : [];
660
+ return o.length && e.classList.add(...o), e;
661
+ }, ae = (e) => {
662
+ if (!e || typeof e != "object" || Array.isArray(e) || !e.tagName) return null;
663
+ const t = Zt({ inTagName: e.tagName });
664
+ if (!t) return null;
665
+ if (te({
666
+ inElement: t,
667
+ inTextContent: Xt(e.textContent),
668
+ inTagName: e.tagName
669
+ }), ee({
670
+ inElement: t,
671
+ inProperties: e.properties
672
+ }), ne({
673
+ inElement: t,
674
+ inAttributes: e.attributes
675
+ }), re({
676
+ inElement: t,
677
+ inClassList: e.classList
678
+ }), Array.isArray(e.children)) {
679
+ const o = B(e.children);
680
+ o.length && t.append(...o);
681
+ }
682
+ return t;
683
+ }, M = (e) => e == null ? null : typeof Node < "u" && e instanceof Node ? e : Array.isArray(e) ? B(e) : typeof e == "object" ? ae(e) : typeof e == "string" || typeof e == "number" ? document.createTextNode(String(e)) : null, le = "./tags.schema.json", se = {
684
+ allowsTextContent: !1,
685
+ allowsChildren: !0,
686
+ allowedAttributes: [
687
+ "title",
688
+ "role"
689
+ ],
690
+ childTags: []
691
+ }, ce = {
692
+ allowsTextContent: !1,
693
+ allowsChildren: !1,
694
+ allowedAttributes: [
695
+ "type",
696
+ "placeholder",
697
+ "value",
698
+ "name",
699
+ "disabled",
700
+ "readonly",
701
+ "required",
702
+ "list"
703
+ ]
704
+ }, ie = {
705
+ allowsTextContent: !1,
706
+ allowsChildren: !1,
707
+ allowedAttributes: [
708
+ "type",
709
+ "checked",
710
+ "name",
711
+ "value",
712
+ "disabled",
713
+ "required"
714
+ ]
715
+ }, ue = {
716
+ allowsTextContent: !1,
717
+ allowsChildren: !0,
718
+ allowedAttributes: [
719
+ "span"
720
+ ],
721
+ childTags: [
722
+ "col"
723
+ ]
724
+ }, de = {
725
+ allowsTextContent: !1,
726
+ allowsChildren: !1,
727
+ allowedAttributes: [
728
+ "span",
729
+ "style",
730
+ "width"
731
+ ]
732
+ }, pe = {
733
+ allowsTextContent: !0,
734
+ allowsChildren: !0,
735
+ allowedAttributes: [
736
+ "for"
737
+ ],
738
+ childTags: []
739
+ }, fe = {
740
+ allowsTextContent: !1,
741
+ allowsChildren: !0,
742
+ allowedAttributes: [
743
+ "action",
744
+ "method",
745
+ "autocomplete",
746
+ "enctype",
747
+ "name",
748
+ "novalidate",
749
+ "target"
750
+ ],
751
+ childTags: []
752
+ }, be = {
753
+ allowsTextContent: !1,
754
+ allowsChildren: !0,
755
+ allowedAttributes: [
756
+ "name",
757
+ "disabled",
758
+ "required",
759
+ "multiple",
760
+ "size"
761
+ ],
762
+ childTags: [
763
+ "option"
764
+ ]
765
+ }, he = {
766
+ allowsTextContent: !0,
767
+ allowsChildren: !0,
768
+ allowedAttributes: [],
769
+ childTags: []
770
+ }, me = {
771
+ allowsTextContent: !0,
772
+ allowsChildren: !0,
773
+ allowedAttributes: [],
774
+ childTags: []
775
+ }, ge = {
776
+ allowsTextContent: !0,
777
+ allowsChildren: !0,
778
+ allowedAttributes: [],
779
+ childTags: []
780
+ }, we = {
781
+ allowsTextContent: !0,
782
+ allowsChildren: !0,
783
+ allowedAttributes: [],
784
+ childTags: []
785
+ }, ye = {
786
+ allowsTextContent: !1,
787
+ allowsChildren: !1,
788
+ allowedAttributes: [
789
+ "src",
790
+ "alt",
791
+ "width",
792
+ "height",
793
+ "loading"
794
+ ]
795
+ }, Te = {
796
+ allowsTextContent: !0,
797
+ allowsChildren: !0,
798
+ allowedAttributes: [
799
+ "type",
800
+ "disabled",
801
+ "name",
802
+ "value"
803
+ ],
804
+ childTags: []
805
+ }, Ce = {
806
+ allowsTextContent: !1,
807
+ allowsChildren: !0,
808
+ allowedAttributes: [
809
+ "border",
810
+ "cellpadding",
811
+ "cellspacing"
812
+ ],
813
+ childTags: [
814
+ "caption",
815
+ "colgroup",
816
+ "thead",
817
+ "tbody",
818
+ "tfoot",
819
+ "tr"
820
+ ]
821
+ }, Ae = {
822
+ allowsTextContent: !1,
823
+ allowsChildren: !0,
824
+ allowedAttributes: [],
825
+ childTags: [
826
+ "tr"
827
+ ]
828
+ }, Ne = {
829
+ allowsTextContent: !1,
830
+ allowsChildren: !0,
831
+ allowedAttributes: [],
832
+ childTags: [
833
+ "tr"
834
+ ]
835
+ }, $e = {
836
+ allowsTextContent: !1,
837
+ allowsChildren: !0,
838
+ allowedAttributes: [],
839
+ childTags: [
840
+ "tr"
841
+ ]
842
+ }, xe = {
843
+ allowsTextContent: !1,
844
+ allowsChildren: !0,
845
+ allowedAttributes: [],
846
+ childTags: [
847
+ "td",
848
+ "th"
849
+ ]
850
+ }, Se = {
851
+ allowsTextContent: !0,
852
+ allowsChildren: !0,
853
+ allowedAttributes: [
854
+ "scope",
855
+ "colspan",
856
+ "rowspan"
857
+ ],
858
+ childTags: []
859
+ }, je = {
860
+ allowsTextContent: !0,
861
+ allowsChildren: !0,
862
+ allowedAttributes: [
863
+ "colspan",
864
+ "rowspan"
865
+ ],
866
+ childTags: []
867
+ }, Le = {
868
+ allowsTextContent: !1,
869
+ allowsChildren: !0,
870
+ allowedAttributes: [],
871
+ childTags: [
872
+ "option"
873
+ ]
874
+ }, De = {
875
+ allowsTextContent: !0,
876
+ allowsChildren: !1,
877
+ allowedAttributes: [
878
+ "value",
879
+ "label",
880
+ "selected",
881
+ "disabled"
882
+ ]
883
+ }, Ee = {
884
+ allowsTextContent: !1,
885
+ allowsChildren: !0,
886
+ allowedAttributes: [
887
+ "role"
888
+ ],
889
+ childTags: []
890
+ }, Oe = {
891
+ allowsTextContent: !0,
892
+ allowsChildren: !0,
893
+ allowedAttributes: [
894
+ "href",
895
+ "target",
896
+ "rel",
897
+ "title",
898
+ "download"
899
+ ],
900
+ childTags: []
901
+ }, Pe = {
902
+ allowsTextContent: !0,
903
+ allowsChildren: !0,
904
+ allowedAttributes: [
905
+ "aria-hidden"
906
+ ],
907
+ childTags: []
908
+ }, Fe = {
909
+ allowsTextContent: !0,
910
+ allowsChildren: !0,
911
+ allowedAttributes: [],
912
+ childTags: []
913
+ }, ke = {
914
+ allowsTextContent: !1,
915
+ allowsChildren: !0,
916
+ allowedAttributes: [
917
+ "type"
918
+ ],
919
+ childTags: [
920
+ "li"
921
+ ]
922
+ }, Ie = {
923
+ allowsTextContent: !0,
924
+ allowsChildren: !0,
925
+ allowedAttributes: [
926
+ "value"
927
+ ],
928
+ childTags: []
929
+ }, Re = {
930
+ allowsTextContent: !1,
931
+ allowsChildren: !1,
932
+ allowedAttributes: []
933
+ }, ve = {
934
+ $schema: le,
935
+ div: se,
936
+ input: ce,
937
+ checkbox: ie,
938
+ colgroup: ue,
939
+ col: de,
940
+ label: pe,
941
+ form: fe,
942
+ select: be,
943
+ p: he,
944
+ h1: me,
945
+ h2: ge,
946
+ span: we,
947
+ img: ye,
948
+ button: Te,
949
+ table: Ce,
950
+ thead: Ae,
951
+ tbody: Ne,
952
+ tfoot: $e,
953
+ tr: xe,
954
+ th: Se,
955
+ td: je,
956
+ datalist: Le,
957
+ option: De,
958
+ header: Ee,
959
+ a: Oe,
960
+ i: Pe,
961
+ small: Fe,
962
+ ul: ke,
963
+ li: Ie,
964
+ hr: Re
965
+ }, $ = ({ inSpec: e }) => {
966
+ const t = e;
967
+ if (!t) return [];
968
+ if (Array.isArray(t))
969
+ return t.flatMap((n) => $({ inSpec: n }));
970
+ if (typeof t != "object") return [];
971
+ const o = [];
972
+ return typeof t.tagName == "string" && t.tagName.trim().length > 0 && o.push(t.tagName.toLowerCase()), Array.isArray(t.children) && t.children.length > 0 && t.children.forEach((n) => {
973
+ const a = $({ inSpec: n });
974
+ o.push(...a);
975
+ }), o;
976
+ }, He = ({ inTagsFound: e, inAllowedTags: t }) => {
977
+ const o = e ?? [], n = t ?? {}, a = new Set(
978
+ Object.keys(n).filter((l) => l !== "$schema").map((l) => l.toLowerCase())
979
+ ), r = {}, s = [], c = [];
980
+ o.forEach((l) => {
981
+ r[l] = (r[l] || 0) + 1, a.has(l) ? s.includes(l) || s.push(l) : c.includes(l) || c.push(l);
982
+ });
983
+ const i = o.length, u = c.length === 0;
984
+ return {
985
+ totalTags: i,
986
+ tagCounts: r,
987
+ uniqueTags: Object.keys(r),
988
+ recognizedTags: s,
989
+ unrecognizedTags: c,
990
+ areAllTagsPresent: u
991
+ };
992
+ }, Ve = ({ inSpec: e, inTags: t = ve } = {}) => {
993
+ const o = e, n = t, a = $({ inSpec: o }), r = He({
994
+ inTagsFound: a,
995
+ inAllowedTags: n
996
+ });
997
+ return {
998
+ areAllTagsPresent: r.areAllTagsPresent,
999
+ totalTags: r.totalTags,
1000
+ tagCounts: r.tagCounts,
1001
+ uniqueTags: r.uniqueTags,
1002
+ recognizedTags: r.recognizedTags,
1003
+ unrecognizedTags: r.unrecognizedTags
1004
+ };
1005
+ }, G = (e = {}) => {
1006
+ const t = (e == null ? void 0 : e.spec) ?? (e == null ? void 0 : e.inSpec) ?? e;
1007
+ return M(t);
1008
+ };
1009
+ Yt({
1010
+ inFuncDefinition: G,
1011
+ inReviewSpec: Ve
1012
+ });
1013
+ const K = ({
1014
+ inSpec: e,
1015
+ inTargetHtmlId: t,
1016
+ inAppendPosition: o,
1017
+ inShowLog: n = !1
1018
+ } = {}) => {
1019
+ const a = e, r = t, s = o, c = n, i = G(a);
1020
+ c && console.log("renderToDom 1 (content):", i);
1021
+ const u = document.getElementById(r);
1022
+ return u ? (Array.isArray(i) || i instanceof NodeList || i instanceof HTMLCollection ? s === "prepend" ? u.prepend(...i) : u.append(...i) : s === "prepend" ? u.prepend(i) : (u.innerHTML = "", u.append(i)), c && console.log("renderToDom 2 (mounted):", u), u) : null;
1023
+ }, Be = (e = {}) => {
1024
+ const t = O(e);
1025
+ (t == null ? void 0 : t.showLog) && console.log("first : ", t == null ? void 0 : t.columns, t == null ? void 0 : t.data);
1026
+ const n = V({
1027
+ inColumns: t.columns,
1028
+ inData: t.data,
1029
+ inType: t.type,
1030
+ inShowLog: t.showLog
1031
+ });
1032
+ return K({
1033
+ inSpec: n,
1034
+ inTargetHtmlId: t.targetHtmlId,
1035
+ inAppendPosition: t.appendPosition,
1036
+ inShowLog: t.showLog
1037
+ });
1038
+ };
1039
+ _({ render: Be, getSpec: P, validateConfig: O, buildSpec: V, renderToDom: K });
1040
+ export {
1041
+ V as buildSpec,
1042
+ Be as default,
1043
+ P as getSpec,
1044
+ Be as render,
1045
+ K as renderToDom,
1046
+ O as validateConfig
1047
+ };