Skip to content

Commit 986359d

Browse files
committed
feat: Add async/await to render function
This commit adds the async/await keywords to the render function in order to make the rendering process asynchronous. This allows for better handling of asynchronous operations within the render function, improving the overall performance and responsiveness of the application.
1 parent a96b9ee commit 986359d

File tree

1 file changed

+42
-27
lines changed

1 file changed

+42
-27
lines changed

src/index.js

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function init(element) {
2626
}
2727
}
2828

29-
function render({ source, element, data, key, index, currentIndex, update, remove }) {
29+
async function render({ source, element, data, key, index, currentIndex, update, remove }) {
3030
if (!element) {
3131
if (source) {
3232
element = queryElements({ element: source, prefix: 'render' })
@@ -110,7 +110,7 @@ function render({ source, element, data, key, index, currentIndex, update, remov
110110

111111
if (!clone) return
112112

113-
renderValues(clone[1], data);
113+
await renderValues(clone[1], data);
114114
if (currentIndex >= 0)
115115
insertElement(renderedNode, clone[1], index, currentIndex)
116116
}
@@ -124,13 +124,13 @@ function render({ source, element, data, key, index, currentIndex, update, remov
124124

125125
renderTemplate(element[i], data, key, index);
126126
} else
127-
renderValues(element[i], data);
127+
await renderValues(element[i], data);
128128

129129
}
130130

131131
}
132132

133-
function renderTemplate(template, data, key, index, keyPath) {
133+
async function renderTemplate(template, data, key, index, keyPath) {
134134
if (!key)
135135
key = template.getAttribute('render')
136136

@@ -212,7 +212,7 @@ function renderTemplate(template, data, key, index, keyPath) {
212212
clone.parentKey = renderedKey
213213
clone.renderKey = key
214214
clone.element.setAttribute('renderedKey', keys[i])
215-
renderValues(clone.element, Data, keys[i], renderAs);
215+
await renderValues(clone.element, Data, keys[i], renderAs);
216216
insertElement(template, clone.element, index);
217217

218218
}
@@ -227,7 +227,7 @@ function renderTemplate(template, data, key, index, keyPath) {
227227
if (!renderData) {
228228
let clone = cloneTemplate(template);
229229
clone.keyPath = template.keyPath
230-
renderValues(clone.element, data, key, renderAs);
230+
await renderValues(clone.element, data, key, renderAs);
231231
insertElement(template, clone.element, index);
232232
} else {
233233
if (!Array.isArray(renderData))
@@ -245,7 +245,7 @@ function renderTemplate(template, data, key, index, keyPath) {
245245
} else
246246
object = renderData[i]
247247

248-
renderValues(clone.element, object, key, renderAs);
248+
await renderValues(clone.element, object, key, renderAs);
249249
insertElement(template, clone.element, index);
250250
}
251251
}
@@ -314,7 +314,7 @@ function insertElement(template, element, index, currentIndex) {
314314
}
315315
}
316316

317-
function renderValues(node, data, key, renderAs, keyPath, parent) {
317+
async function renderValues(node, data, key, renderAs, keyPath, parent) {
318318
if (!data) return;
319319

320320
let renderedNode = renderedNodes.get(node)
@@ -374,7 +374,8 @@ function renderValues(node, data, key, renderAs, keyPath, parent) {
374374
}
375375
}
376376

377-
Array.from(node.attributes).forEach(attr => {
377+
// Array.from(node.attributes).forEach(attr => {
378+
for (let attr of node.attributes) {
378379
let name = attr.name;
379380
let value = attr.value;
380381

@@ -386,16 +387,16 @@ function renderValues(node, data, key, renderAs, keyPath, parent) {
386387
let namePlaceholder = renderedAttribute.placeholder.name || name;
387388
let valuePlaceholder = renderedAttribute.placeholder.value || value;
388389

389-
name = renderValue(attr, data, namePlaceholder, renderAs, renderedAttribute);
390-
value = renderValue(attr, data, valuePlaceholder, renderAs, renderedAttribute);
390+
name = await renderValue(attr, data, namePlaceholder, renderAs, renderedAttribute);
391+
value = await renderValue(attr, data, valuePlaceholder, renderAs, renderedAttribute);
391392

392393
if (name === undefined && name === null) {
393394
renderedNodes.delete(attr)
394395
node.removeAttribute(attr.name);
395396
} else if ((value || value === "") && (name !== attr.name || value !== attr.value))
396397
node.setAttribute(name, value);
397-
398-
});
398+
}
399+
// });
399400

400401
if (CoCreate.pass) {
401402
if (node.hasAttribute('[pass_id]'))
@@ -418,11 +419,14 @@ function renderValues(node, data, key, renderAs, keyPath, parent) {
418419
if (node.getAttribute('render') && !node.hasAttribute('render-clone')) {
419420
renderTemplate(node, data);
420421
} else if (node.childNodes.length > 0) {
421-
Array.from(node.childNodes).forEach(childNode => {
422-
renderValues(childNode, data, key, renderAs, keyPath, parent);
423-
});
422+
// Array.from(node.childNodes).forEach(childNode => {
423+
for (let childNode of node.childNodes) {
424+
await renderValues(childNode, data, key, renderAs, keyPath, parent);
425+
}
426+
// });
424427
}
425428

429+
426430
} else if (node.nodeType == 3) {
427431
let valueType = node.parentElement.getAttribute('value-type')
428432

@@ -435,7 +439,7 @@ function renderValues(node, data, key, renderAs, keyPath, parent) {
435439
return
436440
textContent = renderedNode.placeholder || node.textContent;
437441

438-
text = renderValue(node, data, textContent, renderAs, renderedNode);
442+
text = await renderValue(node, data, textContent, renderAs, renderedNode);
439443

440444
if (text || text == "") {
441445
if (text != renderedNode.text) {
@@ -462,16 +466,18 @@ function renderValues(node, data, key, renderAs, keyPath, parent) {
462466
}
463467

464468
if (node.childNodes.length > 0) {
465-
Array.from(node.childNodes).forEach(childNode => {
466-
renderValues(childNode, data, key, renderAs, keyPath, parent);
467-
});
469+
// Array.from(node.childNodes).forEach(childNode => {
470+
for (let childNode of node.childNodes) {
471+
await renderValues(childNode, data, key, renderAs, keyPath, parent);
472+
}
473+
// });
468474
}
469475
}
470476
}
471477
}
472478
}
473479

474-
function renderValue(node, data, placeholder, renderAs, renderedNode) {
480+
async function renderValue(node, data, placeholder, renderAs, renderedNode) {
475481
let output = placeholder;
476482

477483
if (placeholder.match(/{{(.*?)}}/)) {
@@ -481,13 +487,21 @@ function renderValue(node, data, placeholder, renderAs, renderedNode) {
481487

482488
let match
483489
do {
484-
match = output.match(/{{([A-Za-z0-9_.,\[\]\- ]*)}}/);
485-
490+
// match = output.match(/{{([A-Za-z0-9_.,\[\]\- ]*)}}/); // works by getting inner matches first
491+
// match = output.match(/{{([^}]*)}}/);
492+
match = output.match(/{{(.*?)}}/);
486493
if (match) {
487-
if (match[0] === '{{modified.keyPath}}')
488-
console.log('{{modified.keyPath}}')
489-
490-
let value = getRenderValue(node, data, match[1], renderAs)
494+
let value
495+
try {
496+
let Data = JSON.parse('{' + match[1].replace(/'/g, '"') + '}');
497+
if (Data.storage || Data.database || Data.array || Data.object || Data.index) {
498+
Data.method = 'read.object'
499+
value = await CoCreate.crud.send(Data)
500+
value = value.object[0][Data.key]
501+
}
502+
} catch (error) {
503+
value = getRenderValue(node, data, match[1], renderAs)
504+
}
491505

492506
if (value || value === "") {
493507
if (typeof value === "object")
@@ -503,6 +517,7 @@ function renderValue(node, data, placeholder, renderAs, renderedNode) {
503517
} else {
504518
match = null
505519
}
520+
506521
}
507522

508523
} while (match)

0 commit comments

Comments
 (0)