@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.
@@ -22,13 +22,13 @@ jobs:
22
22
  runs-on: ubuntu-latest
23
23
  steps:
24
24
  - name: Checkout
25
- uses: actions/checkout@v3
25
+ uses: actions/checkout@v4
26
26
  - name: Setup Node.js
27
- uses: actions/setup-node@v3
27
+ uses: actions/setup-node@v4
28
28
  with:
29
- node-version: 14
29
+ node-version: 22 # Required for the latest semantic-release plugins
30
30
  - name: Semantic Release
31
- uses: cycjimmy/semantic-release-action@v3
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.GITHUB }}"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/render",
3
- "version": "1.45.4",
3
+ "version": "1.45.6",
4
4
  "description": "A simple render component in vanilla javascript. Easily configured using HTML5 attributes and/or JavaScript API.",
5
5
  "keywords": [
6
6
  "render",
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 = { element: template, clones: new Map() };
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
- template.parentElement.closest("[render]") || template.source;
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(template.element, data, key);
304
- } else if (Array.isArray(data)) {
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
- if (!renderData && data) {
309
- if (Array.isArray(data)) {
310
- renderData = data;
311
- } else {
312
- renderData = [data];
313
- }
314
- } else if (!renderData) return;
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 = template.element.getAttribute("render-reverse");
368
+ renderReverse = el.getAttribute("render-reverse");
332
369
  }
333
370
 
334
- let exclude = template.element.getAttribute("render-exclude") || "";
371
+ let exclude = el.getAttribute("render-exclude") || "";
335
372
  if (exclude) {
336
373
  exclude = exclude.replace(/ /g, "").split(",");
337
374
  }
338
- let reference = template.element.getAttribute("render-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 (!template.clones) template = template.template;
344
- for (const [key, element] of template.clones) {
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
- template.clones.delete(key);
396
+ templateData.clones.delete(key);
348
397
  }
349
398
  } //
350
399
  // else if (index) {
351
400
  // updates data that has already been rendered
352
- // template.data = dotNotationToObject(renderData, template.data)
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 = template.clones.get(keys[i]);
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
- template.clones.delete(keys[i]);
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(template);
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(template);
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 = template.keyPath + "." + renderedKey;
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(template, clone.element, index);
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(template);
417
- clone.keyPath = template.keyPath;
465
+ let clone = cloneTemplate(templateData);
466
+ clone.keyPath = templateData.keyPath;
418
467
  await renderValues(clone.element, data, key, renderAs);
419
- insertElement(template, clone.element, index);
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(template);
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 = template.keyPath || "" + `[${i}]`;
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
- template,
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.getAttribute("render") && !node.hasAttribute("render-clone")) {
717
- renderTemplate(node, data);
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.source) {
1161
- data = renderedNode.source.data;
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 (renderedNode.template) {
1164
- data = renderedNode.template.source.data;
1224
+ if (data) {
1225
+ // render({ element: mutation.target, data });
1165
1226
  }
1166
-
1167
- render({ element: mutation.target, data });
1168
1227
  }
1169
1228
  });
1170
1229