@cocreate/render 1.45.4 → 1.45.6
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/.github/workflows/automated.yml +5 -6
- package/CHANGELOG.md +14 -0
- package/package.json +1 -1
- package/src/index.js +110 -51
|
@@ -22,13 +22,13 @@ jobs:
|
|
|
22
22
|
runs-on: ubuntu-latest
|
|
23
23
|
steps:
|
|
24
24
|
- name: Checkout
|
|
25
|
-
uses: actions/checkout@
|
|
25
|
+
uses: actions/checkout@v4
|
|
26
26
|
- name: Setup Node.js
|
|
27
|
-
uses: actions/setup-node@
|
|
27
|
+
uses: actions/setup-node@v4
|
|
28
28
|
with:
|
|
29
|
-
node-version:
|
|
29
|
+
node-version: 22 # Required for the latest semantic-release plugins
|
|
30
30
|
- name: Semantic Release
|
|
31
|
-
uses: cycjimmy/semantic-release-action@
|
|
31
|
+
uses: cycjimmy/semantic-release-action@v4 # Update to v4 for better Node 20+ support
|
|
32
32
|
id: semantic
|
|
33
33
|
with:
|
|
34
34
|
extra_plugins: |
|
|
@@ -36,9 +36,8 @@ jobs:
|
|
|
36
36
|
@semantic-release/git
|
|
37
37
|
@semantic-release/github
|
|
38
38
|
env:
|
|
39
|
-
GITHUB_TOKEN: "${{ secrets.
|
|
39
|
+
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" # Use the built-in token if possible
|
|
40
40
|
NPM_TOKEN: "${{ secrets.NPM_TOKEN }}"
|
|
41
41
|
outputs:
|
|
42
42
|
new_release_published: "${{ steps.semantic.outputs.new_release_published }}"
|
|
43
43
|
new_release_version: "${{ steps.semantic.outputs.new_release_version }}"
|
|
44
|
-
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [1.45.6](https://github.com/CoCreate-app/CoCreate-render/compare/v1.45.5...v1.45.6) (2026-02-04)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* update worklow ([d98917c](https://github.com/CoCreate-app/CoCreate-render/commit/d98917c98cc2c38b426f3c720f08d67e066836e6))
|
|
7
|
+
|
|
8
|
+
## [1.45.5](https://github.com/CoCreate-app/CoCreate-render/compare/v1.45.4...v1.45.5) (2025-11-16)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* improve template rendering logic and error handling in renderTemplate function ([decd034](https://github.com/CoCreate-app/CoCreate-render/commit/decd034e0087981dac3abc15a9f3ee79e7d0870a))
|
|
14
|
+
|
|
1
15
|
## [1.45.4](https://github.com/CoCreate-app/CoCreate-render/compare/v1.45.3...v1.45.4) (2025-09-01)
|
|
2
16
|
|
|
3
17
|
|
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -66,6 +66,22 @@ function init(element) {
|
|
|
66
66
|
await render({ source: element[i], data });
|
|
67
67
|
element[i].getData = () => sources.get(element[i]).data;
|
|
68
68
|
}
|
|
69
|
+
|
|
70
|
+
let dataAttr = element[i].getAttribute("render-data");
|
|
71
|
+
|
|
72
|
+
if (dataAttr) {
|
|
73
|
+
try {
|
|
74
|
+
// Parse the string into a usable object
|
|
75
|
+
const parsedData = JSON.parse(dataAttr);
|
|
76
|
+
|
|
77
|
+
// Ensure the method exists before calling it
|
|
78
|
+
if (typeof element[i].renderValue === "function") {
|
|
79
|
+
element[i].renderValue(parsedData);
|
|
80
|
+
}
|
|
81
|
+
} catch (error) {
|
|
82
|
+
console.error("Failed to parse render-data:", error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
69
85
|
}
|
|
70
86
|
}
|
|
71
87
|
|
|
@@ -195,7 +211,7 @@ async function render({
|
|
|
195
211
|
}
|
|
196
212
|
|
|
197
213
|
let clones = renderedNode.clones; // || renderedNode.template.clones..
|
|
198
|
-
if (!clones) {
|
|
214
|
+
if (!clones && renderedNode.template) {
|
|
199
215
|
clones = renderedNode.template.clones;
|
|
200
216
|
console.log("renderedNode.template.clones", clones);
|
|
201
217
|
}
|
|
@@ -273,17 +289,25 @@ async function render({
|
|
|
273
289
|
async function renderTemplate(template, data, key, index, keyPath) {
|
|
274
290
|
// if (!key)
|
|
275
291
|
// key = template.getAttribute('render')
|
|
276
|
-
|
|
292
|
+
if (!(template instanceof HTMLElement)) {
|
|
293
|
+
console.log("template not an element but should be")
|
|
294
|
+
}
|
|
277
295
|
let templateData = renderedNodes.get(template);
|
|
278
296
|
if (!templateData) {
|
|
279
|
-
templateData = {
|
|
297
|
+
templateData = {element: template, clones: new Map() };
|
|
280
298
|
renderedNodes.set(template, templateData);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (!templateData.parent && !templateData.source) {
|
|
302
|
+
let parentRender = template.parentElement.closest("[render]")
|
|
303
|
+
if (parentRender || template.source)
|
|
304
|
+
templateData.parent = renderedNodes.get(parentRender) || template.source
|
|
305
|
+
else
|
|
306
|
+
console.log("template parent missing is there no parent or is this an error? and source is", templateData.source)
|
|
281
307
|
}
|
|
282
308
|
|
|
283
|
-
templateData.parent
|
|
284
|
-
|
|
285
|
-
if (templateData.parent) {
|
|
286
|
-
templateData.parent = renderedNodes.get(templateData.parent);
|
|
309
|
+
if(!templateData.source && templateData.parent && templateData.parent.source){
|
|
310
|
+
templateData.source = templateData.parent.source
|
|
287
311
|
}
|
|
288
312
|
|
|
289
313
|
if (!templateData.keyPath) {
|
|
@@ -296,28 +320,41 @@ async function renderTemplate(template, data, key, index, keyPath) {
|
|
|
296
320
|
}
|
|
297
321
|
}
|
|
298
322
|
|
|
299
|
-
template = templateData;
|
|
300
|
-
|
|
301
323
|
let renderData;
|
|
302
324
|
if (key) {
|
|
303
|
-
renderData = getRenderValue(
|
|
304
|
-
}
|
|
325
|
+
renderData = getRenderValue(templateData.element, data, key);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (!renderData) {
|
|
305
329
|
renderData = data;
|
|
306
330
|
}
|
|
331
|
+
|
|
332
|
+
// else if (Array.isArray(data)) {
|
|
333
|
+
// renderData = data;
|
|
334
|
+
// }
|
|
335
|
+
|
|
336
|
+
// if (!renderData && data) {
|
|
337
|
+
// if (Array.isArray(data)) {
|
|
338
|
+
// renderData = data;
|
|
339
|
+
// } else {
|
|
340
|
+
// renderData = [data];
|
|
341
|
+
// }
|
|
342
|
+
// } else return;
|
|
343
|
+
|
|
344
|
+
templateData.renderData = renderData;
|
|
345
|
+
let el = templateData.element;
|
|
346
|
+
if (el.nodeType !== 1) {
|
|
347
|
+
el = templateData.parent.element;
|
|
348
|
+
}
|
|
307
349
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
let renderAs =
|
|
317
|
-
template.element.getAttribute("render-as") ||
|
|
318
|
-
template.source.element.getAttribute("render-as") ||
|
|
319
|
-
key;
|
|
320
|
-
template.renderAs = renderAs;
|
|
350
|
+
let renderAs = templateData.renderAs
|
|
351
|
+
if (!templateData.renderAs) {
|
|
352
|
+
renderAs =
|
|
353
|
+
el.getAttribute("render-as") ||
|
|
354
|
+
el.getAttribute("render") ||
|
|
355
|
+
key;
|
|
356
|
+
templateData.renderAs = renderAs;
|
|
357
|
+
}
|
|
321
358
|
|
|
322
359
|
let renderType;
|
|
323
360
|
if (templateData.source && templateData.source.element)
|
|
@@ -328,28 +365,40 @@ async function renderTemplate(template, data, key, index, keyPath) {
|
|
|
328
365
|
renderReverse =
|
|
329
366
|
templateData.source.element.getAttribute("render-reverse");
|
|
330
367
|
if (!renderReverse)
|
|
331
|
-
renderReverse =
|
|
368
|
+
renderReverse = el.getAttribute("render-reverse");
|
|
332
369
|
}
|
|
333
370
|
|
|
334
|
-
let exclude =
|
|
371
|
+
let exclude = el.getAttribute("render-exclude") || "";
|
|
335
372
|
if (exclude) {
|
|
336
373
|
exclude = exclude.replace(/ /g, "").split(",");
|
|
337
374
|
}
|
|
338
|
-
let reference =
|
|
375
|
+
let reference = el.getAttribute("render-reference");
|
|
339
376
|
|
|
340
377
|
let isInsert = data.$filter && (data.$filter.create || data.$filter.update);
|
|
341
378
|
if (renderType !== "object") {
|
|
342
379
|
if ((!isInsert && !index) || data.$filter.overwrite) {
|
|
343
|
-
if (!
|
|
344
|
-
|
|
380
|
+
if (!templateData.clones) {
|
|
381
|
+
return
|
|
382
|
+
if (templateData.template) {
|
|
383
|
+
templateData.clones = templateData.template.clones
|
|
384
|
+
} else if (templateData.parent && templateData.parent.template) {
|
|
385
|
+
templateData.clones = templateData.parent.template.clones
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// if (!templateData.clones) {
|
|
390
|
+
// templateData
|
|
391
|
+
// templateData = templateData.templateData;
|
|
392
|
+
// }
|
|
393
|
+
for (const [key, element] of templateData.clones) {
|
|
345
394
|
renderedNodes.delete(element);
|
|
346
395
|
element.remove();
|
|
347
|
-
|
|
396
|
+
templateData.clones.delete(key);
|
|
348
397
|
}
|
|
349
398
|
} //
|
|
350
399
|
// else if (index) {
|
|
351
400
|
// updates data that has already been rendered
|
|
352
|
-
//
|
|
401
|
+
// templateData.data = dotNotationToObject(renderData, templateData.data)
|
|
353
402
|
// }
|
|
354
403
|
}
|
|
355
404
|
|
|
@@ -359,7 +408,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
|
|
|
359
408
|
|
|
360
409
|
const keys = Object.keys(renderData);
|
|
361
410
|
for (let i = 0; i < keys.length; i++) {
|
|
362
|
-
let clone =
|
|
411
|
+
let clone = templateData.clones.get(keys[i]);
|
|
363
412
|
clone = renderedNodes.get(clone);
|
|
364
413
|
|
|
365
414
|
if (
|
|
@@ -370,7 +419,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
|
|
|
370
419
|
if (clone) {
|
|
371
420
|
renderedNodes.delete(clone.element);
|
|
372
421
|
clone.element.remove();
|
|
373
|
-
|
|
422
|
+
templateData.clones.delete(keys[i]);
|
|
374
423
|
}
|
|
375
424
|
continue;
|
|
376
425
|
}
|
|
@@ -384,26 +433,26 @@ async function renderTemplate(template, data, key, index, keyPath) {
|
|
|
384
433
|
let Data = { [renderAs]: { key: keys[i], value, type } };
|
|
385
434
|
|
|
386
435
|
if (!clone) {
|
|
387
|
-
clone = cloneTemplate(
|
|
436
|
+
clone = cloneTemplate(templateData);
|
|
388
437
|
} else {
|
|
389
438
|
if (clone.renderedValue === value) {
|
|
390
439
|
continue;
|
|
391
440
|
}
|
|
392
441
|
}
|
|
393
442
|
clone.renderedValue = value;
|
|
394
|
-
// let clone = cloneTemplate(
|
|
443
|
+
// let clone = cloneTemplate(templateData);
|
|
395
444
|
|
|
396
445
|
let renderedKey = key.split(".");
|
|
397
446
|
renderedKey = renderedKey[renderedKey.length - 1];
|
|
398
447
|
//renderedKey needs to remove the parent.renderAs/key
|
|
399
448
|
|
|
400
449
|
clone.key = keys[i];
|
|
401
|
-
clone.keyPath =
|
|
450
|
+
clone.keyPath = templateData.keyPath + "." + renderedKey;
|
|
402
451
|
clone.parentKey = renderedKey;
|
|
403
452
|
clone.renderKey = key;
|
|
404
453
|
clone.element.setAttribute("renderedKey", keys[i]);
|
|
405
454
|
await renderValues(clone.element, Data, keys[i], renderAs);
|
|
406
|
-
insertElement(
|
|
455
|
+
insertElement(templateData, clone.element, index);
|
|
407
456
|
}
|
|
408
457
|
} else {
|
|
409
458
|
if (!key && !Array.isArray(renderData)) {
|
|
@@ -413,20 +462,20 @@ async function renderTemplate(template, data, key, index, keyPath) {
|
|
|
413
462
|
}
|
|
414
463
|
|
|
415
464
|
if (!renderData) {
|
|
416
|
-
let clone = cloneTemplate(
|
|
417
|
-
clone.keyPath =
|
|
465
|
+
let clone = cloneTemplate(templateData);
|
|
466
|
+
clone.keyPath = templateData.keyPath;
|
|
418
467
|
await renderValues(clone.element, data, key, renderAs);
|
|
419
|
-
insertElement(
|
|
468
|
+
insertElement(templateData, clone.element, index);
|
|
420
469
|
} else {
|
|
421
470
|
if (!Array.isArray(renderData)) renderData = [renderData];
|
|
422
471
|
|
|
423
472
|
for (let i = 0; i < renderData.length; i++) {
|
|
424
|
-
let clone = cloneTemplate(
|
|
473
|
+
let clone = cloneTemplate(templateData);
|
|
425
474
|
|
|
426
475
|
let test = clone.element.getAttribute("render-as");
|
|
427
476
|
if (test) renderAs = test;
|
|
428
477
|
|
|
429
|
-
clone.keyPath =
|
|
478
|
+
clone.keyPath = templateData.keyPath || "" + `[${i}]`;
|
|
430
479
|
|
|
431
480
|
let object;
|
|
432
481
|
if (
|
|
@@ -455,6 +504,9 @@ async function renderTemplate(template, data, key, index, keyPath) {
|
|
|
455
504
|
|
|
456
505
|
let index;
|
|
457
506
|
if (key !== "data") index = i;
|
|
507
|
+
|
|
508
|
+
clone.renderData = object
|
|
509
|
+
clone.index = index
|
|
458
510
|
await renderValues(
|
|
459
511
|
clone.element,
|
|
460
512
|
object,
|
|
@@ -465,7 +517,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
|
|
|
465
517
|
index
|
|
466
518
|
);
|
|
467
519
|
insertElement(
|
|
468
|
-
|
|
520
|
+
templateData,
|
|
469
521
|
clone.element,
|
|
470
522
|
index,
|
|
471
523
|
"",
|
|
@@ -713,8 +765,9 @@ async function renderValues(node, data, key, renderAs, keyPath, parent, index) {
|
|
|
713
765
|
return;
|
|
714
766
|
}
|
|
715
767
|
}
|
|
716
|
-
if (node.
|
|
717
|
-
|
|
768
|
+
if (node.hasAttribute("render") && !node.hasAttribute("render-clone")) {
|
|
769
|
+
let renderKey = node.getAttribute("render") || key
|
|
770
|
+
renderTemplate(node, data, renderKey);
|
|
718
771
|
} else if (node.childNodes.length > 0) {
|
|
719
772
|
// Array.from(node.childNodes).forEach(childNode => {
|
|
720
773
|
for (let childNode of node.childNodes) {
|
|
@@ -1157,14 +1210,20 @@ Observer.init({
|
|
|
1157
1210
|
|
|
1158
1211
|
let renderedNode = renderedNodes.get(parentElement);
|
|
1159
1212
|
let data;
|
|
1160
|
-
if (renderedNode
|
|
1161
|
-
|
|
1213
|
+
if (renderedNode) {
|
|
1214
|
+
if (renderedNode.renderData) {
|
|
1215
|
+
data = renderedNode.renderData;
|
|
1216
|
+
}
|
|
1217
|
+
} else {
|
|
1218
|
+
let sourceElement = mutation.target.parentElement.closest("[render-query]")
|
|
1219
|
+
let sourceData = sources.get(sourceElement);
|
|
1220
|
+
if (sourceData) {
|
|
1221
|
+
data = sourceData.data;
|
|
1222
|
+
}
|
|
1162
1223
|
}
|
|
1163
|
-
if (
|
|
1164
|
-
|
|
1224
|
+
if (data) {
|
|
1225
|
+
// render({ element: mutation.target, data });
|
|
1165
1226
|
}
|
|
1166
|
-
|
|
1167
|
-
render({ element: mutation.target, data });
|
|
1168
1227
|
}
|
|
1169
1228
|
});
|
|
1170
1229
|
|