taggedjs 2.1.1 → 2.1.2
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/js/Subject.d.ts +12 -0
- package/js/Subject.js +38 -0
- package/js/Subject.js.map +1 -0
- package/js/Tag.class.d.ts +45 -0
- package/js/Tag.class.js +213 -0
- package/js/Tag.class.js.map +1 -0
- package/js/Tag.utils.d.ts +24 -0
- package/js/Tag.utils.js +102 -0
- package/js/Tag.utils.js.map +1 -0
- package/js/ValueSubject.d.ts +6 -0
- package/js/ValueSubject.js +15 -0
- package/js/ValueSubject.js.map +1 -0
- package/js/deepFunctions.d.ts +2 -0
- package/js/deepFunctions.js +76 -0
- package/js/deepFunctions.js.map +1 -0
- package/js/elementInitCheck.d.ts +2 -0
- package/js/elementInitCheck.js +18 -0
- package/js/elementInitCheck.js.map +1 -0
- package/js/getCallback.d.ts +3 -0
- package/js/getCallback.js +53 -0
- package/js/getCallback.js.map +1 -0
- package/js/getTagSupport.d.ts +20 -0
- package/js/getTagSupport.js +20 -0
- package/js/getTagSupport.js.map +1 -0
- package/js/html.d.ts +2 -0
- package/js/html.js +5 -0
- package/js/html.js.map +1 -0
- package/js/index.d.ts +10 -0
- package/js/index.js +12 -0
- package/js/index.js.map +1 -0
- package/js/inputAttribute.d.ts +1 -0
- package/js/inputAttribute.js +19 -0
- package/js/inputAttribute.js.map +1 -0
- package/js/interpolateAttributes.d.ts +3 -0
- package/js/interpolateAttributes.js +69 -0
- package/js/interpolateAttributes.js.map +1 -0
- package/js/interpolateContentTemplates.d.ts +3 -0
- package/js/interpolateContentTemplates.js +47 -0
- package/js/interpolateContentTemplates.js.map +1 -0
- package/js/interpolateElement.d.ts +14 -0
- package/js/interpolateElement.js +35 -0
- package/js/interpolateElement.js.map +1 -0
- package/js/interpolateTemplate.d.ts +21 -0
- package/js/interpolateTemplate.js +262 -0
- package/js/interpolateTemplate.js.map +1 -0
- package/js/interpolations.d.ts +6 -0
- package/js/interpolations.js +17 -0
- package/js/interpolations.js.map +1 -0
- package/js/js/Subject.d.ts +12 -0
- package/js/js/Subject.js +38 -0
- package/js/js/Subject.js.map +1 -0
- package/js/js/Tag.class.d.ts +45 -0
- package/js/js/Tag.class.js +213 -0
- package/js/js/Tag.class.js.map +1 -0
- package/js/js/Tag.utils.d.ts +24 -0
- package/js/js/Tag.utils.js +102 -0
- package/js/js/Tag.utils.js.map +1 -0
- package/js/js/ValueSubject.d.ts +6 -0
- package/js/js/ValueSubject.js +15 -0
- package/js/js/ValueSubject.js.map +1 -0
- package/js/js/deepFunctions.d.ts +2 -0
- package/js/js/deepFunctions.js +76 -0
- package/js/js/deepFunctions.js.map +1 -0
- package/js/js/elementInitCheck.d.ts +2 -0
- package/js/js/elementInitCheck.js +18 -0
- package/js/js/elementInitCheck.js.map +1 -0
- package/js/js/getCallback.d.ts +3 -0
- package/js/js/getCallback.js +53 -0
- package/js/js/getCallback.js.map +1 -0
- package/js/js/getTagSupport.d.ts +20 -0
- package/js/js/getTagSupport.js +20 -0
- package/js/js/getTagSupport.js.map +1 -0
- package/js/js/html.d.ts +2 -0
- package/js/js/html.js +5 -0
- package/js/js/html.js.map +1 -0
- package/js/js/index.d.ts +10 -0
- package/js/js/index.js +12 -0
- package/js/js/index.js.map +1 -0
- package/js/js/inputAttribute.d.ts +1 -0
- package/js/js/inputAttribute.js +19 -0
- package/js/js/inputAttribute.js.map +1 -0
- package/js/js/interpolateAttributes.d.ts +3 -0
- package/js/js/interpolateAttributes.js +69 -0
- package/js/js/interpolateAttributes.js.map +1 -0
- package/js/js/interpolateContentTemplates.d.ts +3 -0
- package/js/js/interpolateContentTemplates.js +47 -0
- package/js/js/interpolateContentTemplates.js.map +1 -0
- package/js/js/interpolateElement.d.ts +14 -0
- package/js/js/interpolateElement.js +35 -0
- package/js/js/interpolateElement.js.map +1 -0
- package/js/js/interpolateTemplate.d.ts +21 -0
- package/js/js/interpolateTemplate.js +262 -0
- package/js/js/interpolateTemplate.js.map +1 -0
- package/js/js/interpolations.d.ts +6 -0
- package/js/js/interpolations.js +17 -0
- package/js/js/interpolations.js.map +1 -0
- package/js/js/onInit.d.ts +6 -0
- package/js/js/onInit.js +17 -0
- package/js/js/onInit.js.map +1 -0
- package/js/js/processTagArray.d.ts +5 -0
- package/js/js/processTagArray.js +49 -0
- package/js/js/processTagArray.js.map +1 -0
- package/js/js/providers.d.ts +25 -0
- package/js/js/providers.js +78 -0
- package/js/js/providers.js.map +1 -0
- package/js/js/render.d.ts +6 -0
- package/js/js/render.js +31 -0
- package/js/js/render.js.map +1 -0
- package/js/js/renderAppToElement.d.ts +8 -0
- package/js/js/renderAppToElement.js +38 -0
- package/js/js/renderAppToElement.js.map +1 -0
- package/js/js/state.d.ts +21 -0
- package/js/js/state.js +63 -0
- package/js/js/state.js.map +1 -0
- package/js/js/tag.d.ts +17 -0
- package/js/js/tag.js +57 -0
- package/js/js/tag.js.map +1 -0
- package/js/js/tagRunner.d.ts +17 -0
- package/js/js/tagRunner.js +19 -0
- package/js/js/tagRunner.js.map +1 -0
- package/js/js/wait.d.ts +1 -0
- package/js/js/wait.js +8 -0
- package/js/js/wait.js.map +1 -0
- package/js/onInit.d.ts +6 -0
- package/js/onInit.js +17 -0
- package/js/onInit.js.map +1 -0
- package/js/processTagArray.d.ts +5 -0
- package/js/processTagArray.js +49 -0
- package/js/processTagArray.js.map +1 -0
- package/js/providers.d.ts +25 -0
- package/js/providers.js +78 -0
- package/js/providers.js.map +1 -0
- package/js/render.d.ts +6 -0
- package/js/render.js +31 -0
- package/js/render.js.map +1 -0
- package/js/renderAppToElement.d.ts +8 -0
- package/js/renderAppToElement.js +38 -0
- package/js/renderAppToElement.js.map +1 -0
- package/js/state.d.ts +21 -0
- package/js/state.js +63 -0
- package/js/state.js.map +1 -0
- package/js/tag.d.ts +17 -0
- package/js/tag.js +57 -0
- package/js/tag.js.map +1 -0
- package/js/tagRunner.d.ts +17 -0
- package/js/tagRunner.js +19 -0
- package/js/tagRunner.js.map +1 -0
- package/js/wait.d.ts +1 -0
- package/js/wait.js +8 -0
- package/js/wait.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { getStateValue } from "./state.js";
|
|
2
|
+
import { setUse } from "./tagRunner.js";
|
|
3
|
+
export let getCallback = () => (callback) => () => {
|
|
4
|
+
throw new Error('The real callback function was called and that should never occur');
|
|
5
|
+
};
|
|
6
|
+
setUse({
|
|
7
|
+
beforeRender: (tagSupport) => {
|
|
8
|
+
tagSupport.callbacks = [];
|
|
9
|
+
getCallback = () => {
|
|
10
|
+
const callbackMaker = (callback) => {
|
|
11
|
+
const trigger = () => {
|
|
12
|
+
const state = tagSupport.state;
|
|
13
|
+
const oldest = callbackMaker.state; // state.oldest as StateConfigArray
|
|
14
|
+
const newest = state.newest;
|
|
15
|
+
// ensure that the oldest has the latest values first
|
|
16
|
+
updateState(newest, oldest);
|
|
17
|
+
// run the callback
|
|
18
|
+
const promise = callback();
|
|
19
|
+
// send the oldest state changes into the newest
|
|
20
|
+
updateState(oldest, newest);
|
|
21
|
+
tagSupport.render();
|
|
22
|
+
if (promise instanceof Promise) {
|
|
23
|
+
promise.finally(() => {
|
|
24
|
+
// send the oldest state changes into the newest
|
|
25
|
+
updateState(oldest, newest);
|
|
26
|
+
tagSupport.render();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const state = tagSupport.state;
|
|
31
|
+
trigger.state = state;
|
|
32
|
+
return trigger;
|
|
33
|
+
};
|
|
34
|
+
const callbacks = tagSupport.callbacks;
|
|
35
|
+
callbacks.push(callbackMaker);
|
|
36
|
+
return callbackMaker;
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
afterRender: (tagSupport) => {
|
|
40
|
+
const callbacks = tagSupport.callbacks;
|
|
41
|
+
callbacks.forEach(callback => {
|
|
42
|
+
const state = tagSupport.state;
|
|
43
|
+
callback.state = [...state.newest];
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
function updateState(stateFrom, stateTo) {
|
|
48
|
+
stateFrom.forEach((state, index) => {
|
|
49
|
+
const oldValue = getStateValue(state);
|
|
50
|
+
const [checkValue] = stateTo[index](oldValue);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=getCallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCallback.js","sourceRoot":"","sources":["../ts/getCallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,aAAa,EAAE,MAAM,YAAY,CAAA;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,IAAI,WAAW,GAAG,GAAG,EAAE,CAAC,CAAC,QAAkB,EAAE,EAAE,CAAC,GAAS,EAAE;IAChE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;AACtF,CAAC,CAAA;AAOD,MAAM,CAAC;IACL,YAAY,EAAE,CAAC,UAA8B,EAAE,EAAE;QAC/C,UAAU,CAAC,SAAS,GAAG,EAAE,CAAA;QAEzB,WAAW,GAAG,GAAG,EAAE;YAEjB,MAAM,aAAa,GAAG,CACpB,QAAkB,EAClB,EAAE;gBACF,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAc,CAAA;oBACvC,MAAM,MAAM,GAAI,aAAqB,CAAC,KAAK,CAAA,CAAC,mCAAmC;oBAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;oBAE3B,qDAAqD;oBACrD,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;oBAE3B,mBAAmB;oBACnB,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAA;oBAE1B,gDAAgD;oBAChD,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;oBAE3B,UAAU,CAAC,MAAM,EAAE,CAAA;oBAEnB,IAAG,OAAO,YAAY,OAAO,EAAE,CAAC;wBAC9B,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;4BACnB,gDAAgD;4BAChD,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;4BAE3B,UAAU,CAAC,MAAM,EAAE,CAAA;wBACrB,CAAC,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC,CAAA;gBAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAc,CAAA;gBACvC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;gBAErB,OAAO,OAAO,CAAA;YAChB,CAAC,CAAA;YAED,MAAM,SAAS,GAAG,UAAU,CAAC,SAAkB,CAAA;YAC/C,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YAE7B,OAAO,aAAa,CAAA;QACtB,CAAC,CAAA;IACH,CAAC;IACD,WAAW,EAAE,CAAC,UAA8B,EAAE,EAAE;QAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAkB,CAAA;QAC/C,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAc,CAAA;YACvC,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAa,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA;AAEF,SAAS,WAAW,CAClB,SAA2B,EAC3B,OAAyB;IAEzB,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAE,QAAQ,CAAE,CAAA;IACjD,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Tag } from "./Tag.class.js";
|
|
2
|
+
import { TemplaterResult } from "./tag.js";
|
|
3
|
+
export interface TagSupport {
|
|
4
|
+
templater?: TemplaterResult;
|
|
5
|
+
/** Indicator of re-rending. Saves from double rending something already rendered */
|
|
6
|
+
renderCount: 0;
|
|
7
|
+
mutatingRender: () => any;
|
|
8
|
+
render: () => any;
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
* @param {*} props value.props
|
|
12
|
+
* @param {*} newProps value.newProps
|
|
13
|
+
* @param {*} compareToProps compareSupport.templater.props
|
|
14
|
+
* @returns {boolean}
|
|
15
|
+
*/
|
|
16
|
+
hasPropChanges: (props: any, newProps: any, compareToProps: any) => boolean;
|
|
17
|
+
oldest?: Tag;
|
|
18
|
+
newest?: Tag;
|
|
19
|
+
}
|
|
20
|
+
export declare function getTagSupport(templater?: TemplaterResult): TagSupport;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { deepEqual } from "./deepFunctions.js";
|
|
2
|
+
export function getTagSupport(templater) {
|
|
3
|
+
const tagSupport = {
|
|
4
|
+
templater,
|
|
5
|
+
renderCount: 0,
|
|
6
|
+
mutatingRender: () => { throw new Error('Tag function "render()" was called in sync but can only be called async'); }, // loaded later and only callable async
|
|
7
|
+
render: () => {
|
|
8
|
+
++tagSupport.renderCount;
|
|
9
|
+
return tagSupport.mutatingRender();
|
|
10
|
+
}, // ensure this function still works even during deconstructing
|
|
11
|
+
hasPropChanges: (props, newProps, compareToProps) => {
|
|
12
|
+
const oldProps = tagSupport.templater.cloneProps;
|
|
13
|
+
const isCommonEqual = props === undefined && props === compareToProps;
|
|
14
|
+
const isEqual = isCommonEqual || deepEqual(newProps, oldProps);
|
|
15
|
+
return !isEqual;
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
return tagSupport;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=getTagSupport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTagSupport.js","sourceRoot":"","sources":["../ts/getTagSupport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AA8B9C,MAAM,UAAU,aAAa,CAC3B,SAA2B;IAE3B,MAAM,UAAU,GAAe;QAC7B,SAAS;QACT,WAAW,EAAE,CAAC;QACd,cAAc,EAAE,GAAG,EAAE,GAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA,CAAA,CAAC,EAAE,uCAAuC;QAC3J,MAAM,EAAE,GAAG,EAAE;YACX,EAAE,UAAU,CAAC,WAAW,CAAA;YACxB,OAAO,UAAU,CAAC,cAAc,EAAE,CAAA;QACpC,CAAC,EAAE,8DAA8D;QAEjE,cAAc,EAAE,CACd,KAAU,EACV,QAAa,EACb,cAAmB,EACnB,EAAE;YACF,MAAM,QAAQ,GAAI,UAAU,CAAC,SAAiB,CAAC,UAAU,CAAA;YACzD,MAAM,aAAa,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,cAAc,CAAA;YACrE,MAAM,OAAO,GAAG,aAAa,IAAI,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAC9D,OAAO,CAAC,OAAO,CAAA;QACjB,CAAC;KACF,CAAA;IAED,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
package/js/html.d.ts
ADDED
package/js/html.js
ADDED
package/js/html.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../ts/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEpC,MAAM,UAAU,IAAI,CAClB,OAAiB,EACjB,GAAG,MAAiB;IAEpB,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AACjC,CAAC"}
|
package/js/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { html } from "./html.js";
|
|
2
|
+
export { tag } from "./tag.js";
|
|
3
|
+
export { Subject } from "./Subject.js";
|
|
4
|
+
export { wait } from "./wait.js";
|
|
5
|
+
export { renderAppToElement } from "./renderAppToElement.js";
|
|
6
|
+
export { Tag } from "./Tag.class.js";
|
|
7
|
+
export * from "./onInit.js";
|
|
8
|
+
export { providers } from "./providers.js";
|
|
9
|
+
export { state } from "./state.js";
|
|
10
|
+
export { getCallback } from "./getCallback.js";
|
package/js/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { html } from "./html.js";
|
|
2
|
+
export { tag } from "./tag.js";
|
|
3
|
+
export { Subject } from "./Subject.js";
|
|
4
|
+
export { wait } from "./wait.js";
|
|
5
|
+
export { renderAppToElement } from "./renderAppToElement.js";
|
|
6
|
+
export { Tag } from "./Tag.class.js";
|
|
7
|
+
// hooks
|
|
8
|
+
export * from "./onInit.js";
|
|
9
|
+
export { providers } from "./providers.js";
|
|
10
|
+
export { state } from "./state.js";
|
|
11
|
+
export { getCallback } from "./getCallback.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
package/js/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../ts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAG9B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEpC,QAAQ;AACR,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function inputAttribute(name: string, value: any, element: Element): void;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function inputAttribute(name, value, element) {
|
|
2
|
+
const names = name.split('.');
|
|
3
|
+
// style.position = "absolute"
|
|
4
|
+
if (names[0] === 'style') {
|
|
5
|
+
element.style[names[1]] = value;
|
|
6
|
+
}
|
|
7
|
+
// Example: class.width-full = "true"
|
|
8
|
+
if (names[0] === 'class') {
|
|
9
|
+
names.pop();
|
|
10
|
+
if (value) {
|
|
11
|
+
names.forEach(name => element.classList.remove(name));
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
names.forEach(name => element.classList.add(name));
|
|
15
|
+
}
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=inputAttribute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputAttribute.js","sourceRoot":"","sources":["../ts/inputAttribute.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,KAAU,EACV,OAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE7B,8BAA8B;IAC9B,IAAG,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACvB,OAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;IAC1C,CAAC;IAED,qCAAqC;IACrC,IAAG,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,GAAG,EAAE,CAAA;QACX,IAAG,KAAK,EAAE,CAAC;YACT,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QACvD,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QACpD,CAAC;QACD,OAAM;IACR,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Subject } from "./Subject.js";
|
|
2
|
+
import { inputAttribute } from "./inputAttribute.js";
|
|
3
|
+
const startRegX = /^\s*{/;
|
|
4
|
+
const endRegX = /}\s*$/;
|
|
5
|
+
export function interpolateAttributes(child, scope, ownerTag) {
|
|
6
|
+
child.getAttributeNames().forEach(attrName => {
|
|
7
|
+
const value = child.getAttribute(attrName);
|
|
8
|
+
const isSpecial = isSpecialAttr(attrName);
|
|
9
|
+
// An attempt to replicate React
|
|
10
|
+
if (value && value.search(startRegX) >= 0 && value.search(endRegX) >= 0) {
|
|
11
|
+
// get the code inside the brackets like "variable0" or "{variable0}"
|
|
12
|
+
const code = value.replace('{', '').split('').reverse().join('').replace('}', '').split('').reverse().join('');
|
|
13
|
+
const result = scope[code];
|
|
14
|
+
// attach as callback
|
|
15
|
+
if (result instanceof Function) {
|
|
16
|
+
;
|
|
17
|
+
child[attrName] = function (...args) {
|
|
18
|
+
result(child, args);
|
|
19
|
+
};
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (result instanceof Subject) {
|
|
23
|
+
child.removeAttribute(attrName);
|
|
24
|
+
const callback = (newAttrValue) => {
|
|
25
|
+
if (newAttrValue instanceof Function) {
|
|
26
|
+
;
|
|
27
|
+
child[attrName] = function (...args) {
|
|
28
|
+
newAttrValue(child, args);
|
|
29
|
+
};
|
|
30
|
+
child[attrName].tagFunction = newAttrValue;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (isSpecial) {
|
|
34
|
+
inputAttribute(attrName, newAttrValue, child);
|
|
35
|
+
}
|
|
36
|
+
if (newAttrValue) {
|
|
37
|
+
child.setAttribute(attrName, newAttrValue);
|
|
38
|
+
}
|
|
39
|
+
const isDeadValue = newAttrValue === undefined || newAttrValue === false || newAttrValue === null;
|
|
40
|
+
if (isDeadValue) {
|
|
41
|
+
child.removeAttribute(attrName);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// value is 0
|
|
45
|
+
child.setAttribute(attrName, newAttrValue);
|
|
46
|
+
};
|
|
47
|
+
const sub = result.subscribe(callback);
|
|
48
|
+
ownerTag.cloneSubs.push(sub); // this is where unsubscribe is picked up
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// child.setAttribute(attrName, result)
|
|
52
|
+
/*
|
|
53
|
+
if(attrName === 'style') {
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
*/
|
|
57
|
+
child.setAttribute(attrName, result.value);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Non dynamic
|
|
61
|
+
if (isSpecial) {
|
|
62
|
+
return inputAttribute(attrName, value, child);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
export function isSpecialAttr(attrName) {
|
|
67
|
+
return attrName.search(/^(class|style)(\.)/) >= 0;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=interpolateAttributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolateAttributes.js","sourceRoot":"","sources":["../ts/interpolateAttributes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { interpolateTemplate } from "./interpolateTemplate.js";
|
|
2
|
+
/** Returns subscriptions[] that will need to be unsubscribed from when element is destroyed */
|
|
3
|
+
export function interpolateContentTemplates(element, variable, ownerTag) {
|
|
4
|
+
if (!element.children || element.tagName === 'TEMPLATE') {
|
|
5
|
+
return; // done
|
|
6
|
+
}
|
|
7
|
+
const counts = {
|
|
8
|
+
added: 0,
|
|
9
|
+
removed: 0,
|
|
10
|
+
};
|
|
11
|
+
const children = new Array(...element.children);
|
|
12
|
+
children.forEach((child, index) => {
|
|
13
|
+
interpolateChild(child, index, children);
|
|
14
|
+
if (child.children) {
|
|
15
|
+
const nextKids = new Array(...child.children);
|
|
16
|
+
nextKids.forEach((subChild, index) => {
|
|
17
|
+
if (isRenderEndTemplate(subChild)) {
|
|
18
|
+
interpolateChild(subChild, index, nextKids);
|
|
19
|
+
}
|
|
20
|
+
interpolateContentTemplates(subChild, variable, ownerTag);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
function interpolateChild(child, index, children) {
|
|
25
|
+
children.forEach((child, subIndex) => {
|
|
26
|
+
if (subIndex < index) {
|
|
27
|
+
return; // too low
|
|
28
|
+
}
|
|
29
|
+
if (child.tagName !== 'TEMPLATE') {
|
|
30
|
+
return; // not a template
|
|
31
|
+
}
|
|
32
|
+
if (child.getAttribute('interpolate') === undefined || child.getAttribute('end') === undefined) {
|
|
33
|
+
return; // not a rendering template
|
|
34
|
+
}
|
|
35
|
+
return child;
|
|
36
|
+
});
|
|
37
|
+
interpolateTemplate(child, variable, ownerTag, counts);
|
|
38
|
+
}
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
function isRenderEndTemplate(child) {
|
|
42
|
+
const isTemplate = child.tagName === 'TEMPLATE';
|
|
43
|
+
return isTemplate &&
|
|
44
|
+
child.getAttribute('interpolate') !== undefined &&
|
|
45
|
+
child.getAttribute('end') !== undefined;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=interpolateContentTemplates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolateContentTemplates.js","sourceRoot":"","sources":["../ts/interpolateContentTemplates.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEtE,+FAA+F;AAC/F,MAAM,UAAU,2BAA2B,CACzC,OAAgB,EAChB,QAAa,EACb,QAAa;IAEb,IAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,EAAG,CAAC;QAC1D,OAAM,CAAC,OAAO;IAChB,CAAC;IACD,MAAM,MAAM,GAAW;QACrB,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC;KACX,CAAA;IAED,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,GAAI,OAAO,CAAC,QAAgB,CAAC,CAAA;IAExD,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAChC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;QAExC,IAAK,KAAK,CAAC,QAAQ,EAAG,CAAC;YACrB,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;gBACnC,IAAK,mBAAmB,CAAC,QAAQ,CAAC,EAAG,CAAC;oBACpC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;gBAC7C,CAAC;gBAED,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAC3D,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,SAAS,gBAAgB,CACvB,KAAc,EACd,KAAa,EACb,QAAmB;QAEnB,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACnC,IAAK,QAAQ,GAAG,KAAK,EAAG,CAAC;gBACvB,OAAM,CAAC,UAAU;YACnB,CAAC;YAED,IAAK,KAAK,CAAC,OAAO,KAAG,UAAU,EAAG,CAAC;gBACjC,OAAM,CAAC,iBAAiB;YAC1B,CAAC;YAED,IAAK,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,KAAG,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,SAAS,EAAG,CAAC;gBAC/F,OAAM,CAAC,2BAA2B;YACpC,CAAC;YAED,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;QAEF,mBAAmB,CACjB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,CACP,CAAA;IACH,CAAC;IAED,OAAM;AACR,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,KAAG,UAAU,CAAA;IAC7C,OAAO,UAAU;QACjB,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,SAAS;QAC/C,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,SAAS,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Context, Tag } from "./Tag.class.js";
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param {*} element
|
|
5
|
+
* @param {*} context
|
|
6
|
+
* @param {Tag} ownerTag
|
|
7
|
+
*/
|
|
8
|
+
export declare function interpolateElement(element: Element, context: Context, // variables used to evaluate
|
|
9
|
+
ownerTag: Tag): void;
|
|
10
|
+
/** Convert interpolations into template tags */
|
|
11
|
+
export declare function interpolateElementChild(child: Element): {
|
|
12
|
+
string: string;
|
|
13
|
+
keys: string[];
|
|
14
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { interpolateAttributes } from "./interpolateAttributes.js";
|
|
2
|
+
import { interpolateToTemplates } from "./interpolations.js";
|
|
3
|
+
import { interpolateContentTemplates } from "./interpolateContentTemplates.js";
|
|
4
|
+
import { escapeSearch, variablePrefix } from "./Tag.class.js";
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @param {*} element
|
|
8
|
+
* @param {*} context
|
|
9
|
+
* @param {Tag} ownerTag
|
|
10
|
+
*/
|
|
11
|
+
export function interpolateElement(element, context, // variables used to evaluate
|
|
12
|
+
ownerTag) {
|
|
13
|
+
const result = interpolateElementChild(element);
|
|
14
|
+
if (result.keys.length) {
|
|
15
|
+
interpolateContentTemplates(element, context, ownerTag);
|
|
16
|
+
}
|
|
17
|
+
interpolateAttributes(element, context, ownerTag);
|
|
18
|
+
function processChildren(children) {
|
|
19
|
+
new Array(...children).forEach(child => {
|
|
20
|
+
interpolateAttributes(child, context, ownerTag);
|
|
21
|
+
if (child.children) {
|
|
22
|
+
processChildren(child.children);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
processChildren(element.children);
|
|
27
|
+
}
|
|
28
|
+
/** Convert interpolations into template tags */
|
|
29
|
+
export function interpolateElementChild(child) {
|
|
30
|
+
const result = interpolateToTemplates(child.innerHTML);
|
|
31
|
+
result.string = result.string.replace(escapeSearch, variablePrefix);
|
|
32
|
+
child.innerHTML = result.string;
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=interpolateElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolateElement.js","sourceRoot":"","sources":["../ts/interpolateElement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAC9E,OAAO,EAAgB,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE3E;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAgB,EAChB,OAAgB,EAAE,6BAA6B;AAC/C,QAAa;IAEb,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAA;IAE/C,IAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IACzD,CAAC;IAED,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAEjD,SAAS,eAAe,CAAC,QAAwB;QAC/C,IAAI,KAAK,CAAC,GAAG,QAAe,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC5C,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;YAE/C,IAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAClB,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YACjC,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;AACnC,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,uBAAuB,CACrC,KAAc;IAEd,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACtD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,CAAA;IACnE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAA;IAC/B,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Context, Tag } from "./Tag.class.js";
|
|
2
|
+
import { TemplaterResult } from "./tag.js";
|
|
3
|
+
export declare function interpolateTemplate(template: Element & {
|
|
4
|
+
clone?: any;
|
|
5
|
+
}, // <template end interpolate /> (will be removed)
|
|
6
|
+
context: Context, // variable scope of {`__tagVar${index}`:'x'}
|
|
7
|
+
ownerTag: Tag, // Tag class
|
|
8
|
+
counts: Counts): void;
|
|
9
|
+
export declare function updateBetweenTemplates(value: any, lastFirstChild: Element): Text;
|
|
10
|
+
export type Counts = {
|
|
11
|
+
added: 0;
|
|
12
|
+
removed: 0;
|
|
13
|
+
};
|
|
14
|
+
/** Returns {clones:[], subs:[]} */
|
|
15
|
+
export declare function processTagResult(tag: Tag, result: any, // used for recording past and current value
|
|
16
|
+
insertBefore: Element, // <template end interpolate />
|
|
17
|
+
{ index, counts, }: {
|
|
18
|
+
index?: number;
|
|
19
|
+
counts: Counts;
|
|
20
|
+
}): void;
|
|
21
|
+
export declare function isTagComponent(value: unknown | TemplaterResult): boolean;
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { buildItemTagMap } from "./render.js";
|
|
2
|
+
import { Tag, variablePrefix } from "./Tag.class.js";
|
|
3
|
+
import { Subject } from "./Subject.js";
|
|
4
|
+
import { processTagArray } from "./processTagArray.js";
|
|
5
|
+
import { getTagSupport } from "./getTagSupport.js";
|
|
6
|
+
import { deepClone, deepEqual } from "./deepFunctions.js";
|
|
7
|
+
import { config as providers } from "./providers.js";
|
|
8
|
+
import { elementInitCheck } from "./elementInitCheck.js";
|
|
9
|
+
import { runBeforeRender } from "./tagRunner.js";
|
|
10
|
+
import { TemplaterResult } from "./tag.js";
|
|
11
|
+
export function interpolateTemplate(template, // <template end interpolate /> (will be removed)
|
|
12
|
+
context, // variable scope of {`__tagVar${index}`:'x'}
|
|
13
|
+
ownerTag, // Tag class
|
|
14
|
+
counts) {
|
|
15
|
+
if (!template.hasAttribute('end')) {
|
|
16
|
+
return; // only care about starts
|
|
17
|
+
}
|
|
18
|
+
const variableName = template.getAttribute('id');
|
|
19
|
+
if (variableName?.substring(0, variablePrefix.length) !== variablePrefix) {
|
|
20
|
+
return; // ignore, not a tagVar
|
|
21
|
+
}
|
|
22
|
+
const result = context[variableName];
|
|
23
|
+
if (result instanceof Subject) {
|
|
24
|
+
const callback = (templateNewValue) => {
|
|
25
|
+
processSubjectValue(templateNewValue, result, template, ownerTag, counts);
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
counts.added = 0; // reset
|
|
28
|
+
counts.removed = 0; // reset
|
|
29
|
+
}, 0);
|
|
30
|
+
};
|
|
31
|
+
const sub = result.subscribe(callback);
|
|
32
|
+
ownerTag.cloneSubs.push(sub);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const clone = updateBetweenTemplates(result, template.clone || template);
|
|
36
|
+
ownerTag.clones.push(clone);
|
|
37
|
+
template.clone = clone;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
*
|
|
42
|
+
* @param {*} value
|
|
43
|
+
* @param {*} result
|
|
44
|
+
* @param {*} template
|
|
45
|
+
* @param {Tag} ownerTag
|
|
46
|
+
* @param {{added: number, removed: number}} counts
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
function processSubjectValue(value, result, // could be tag via result.tag
|
|
50
|
+
template, // <template end interpolate /> (will be removed)
|
|
51
|
+
ownerTag, counts) {
|
|
52
|
+
if (value instanceof Tag) {
|
|
53
|
+
// first time seeing this tag?
|
|
54
|
+
if (!value.tagSupport) {
|
|
55
|
+
value.tagSupport = getTagSupport();
|
|
56
|
+
value.tagSupport.mutatingRender = ownerTag.tagSupport.mutatingRender;
|
|
57
|
+
value.tagSupport.oldest = value.tagSupport.oldest || value;
|
|
58
|
+
ownerTag.children.push(value);
|
|
59
|
+
value.ownerTag = ownerTag;
|
|
60
|
+
}
|
|
61
|
+
// value.tagSupport.newest = value
|
|
62
|
+
processTagResult(value, result, // Function will attach result.tag
|
|
63
|
+
template, { counts });
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// *for map
|
|
67
|
+
if (value instanceof Array && value.every(x => x instanceof Tag)) {
|
|
68
|
+
return processTagArray(result, value, template, ownerTag, counts);
|
|
69
|
+
}
|
|
70
|
+
if (isTagComponent(value)) {
|
|
71
|
+
return processSubjectComponent(value, result, template, ownerTag, counts);
|
|
72
|
+
}
|
|
73
|
+
// *if processing WAS a tag BUT NOW its some other non-tag value
|
|
74
|
+
if (result.tag) {
|
|
75
|
+
// put the template back
|
|
76
|
+
const lastFirstChild = template.clone || template; // result.tag.clones[0] // template.lastFirstChild
|
|
77
|
+
lastFirstChild.parentNode.insertBefore(template, lastFirstChild);
|
|
78
|
+
const stagger = counts.removed;
|
|
79
|
+
const animated = result.tag.destroy(stagger);
|
|
80
|
+
counts.removed = stagger + animated;
|
|
81
|
+
delete result.tag;
|
|
82
|
+
const clone = updateBetweenTemplates(value, lastFirstChild // ✅ this will be removed
|
|
83
|
+
); // the template will be remove in here
|
|
84
|
+
template.clone = clone;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const before = template.clone || template; // Either the template is on the doc OR its the first element we last put on doc
|
|
88
|
+
// Processing of regular values
|
|
89
|
+
const clone = updateBetweenTemplates(value, before);
|
|
90
|
+
template.clone = clone;
|
|
91
|
+
const oldPos = ownerTag.clones.indexOf(before);
|
|
92
|
+
if (oldPos >= 0 && !ownerTag.clones.includes(clone) && !before.parentNode) {
|
|
93
|
+
ownerTag.clones.splice(oldPos, 1);
|
|
94
|
+
ownerTag.clones.push(clone);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Function to update the value of x
|
|
98
|
+
export function updateBetweenTemplates(value, lastFirstChild) {
|
|
99
|
+
const parent = lastFirstChild.parentNode;
|
|
100
|
+
// mimic React skipping to display EXCEPT for true does display on page
|
|
101
|
+
if (value === undefined || value === false || value === null) { // || value === true
|
|
102
|
+
value = '';
|
|
103
|
+
}
|
|
104
|
+
// Insert the new value (never use innerHTML here)
|
|
105
|
+
const textNode = document.createTextNode(value); // never innerHTML
|
|
106
|
+
parent.insertBefore(textNode, lastFirstChild);
|
|
107
|
+
/* remove existing nodes */
|
|
108
|
+
parent.removeChild(lastFirstChild);
|
|
109
|
+
return textNode;
|
|
110
|
+
}
|
|
111
|
+
/** Returns {clones:[], subs:[]} */
|
|
112
|
+
export function processTagResult(tag, result, // used for recording past and current value
|
|
113
|
+
insertBefore, // <template end interpolate />
|
|
114
|
+
{ index, counts, }) {
|
|
115
|
+
const template = tag.getTemplate();
|
|
116
|
+
// *for
|
|
117
|
+
if (index !== undefined) {
|
|
118
|
+
const existing = result.lastArray[index];
|
|
119
|
+
if (existing?.tag.isLikeTag(tag)) {
|
|
120
|
+
existing.tag.updateByTag(tag);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const lastFirstChild = insertBefore; // tag.clones[0] // insertBefore.lastFirstChild
|
|
124
|
+
const clones = buildItemTagMap(tag, template, lastFirstChild);
|
|
125
|
+
clones.forEach(clone => afterElmBuild(clone, counts));
|
|
126
|
+
result.lastArray.push({
|
|
127
|
+
tag, index
|
|
128
|
+
});
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// *if appears we already have seen
|
|
132
|
+
if (result.tag) {
|
|
133
|
+
// are we just updating an if we already had?
|
|
134
|
+
if (result.tag.isLikeTag(tag)) {
|
|
135
|
+
// components
|
|
136
|
+
if (result instanceof Function) {
|
|
137
|
+
const newTag = result(result.tag.tagSupport);
|
|
138
|
+
result.tag.updateByTag(newTag);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
result.tag.updateByTag(tag);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// *if just now appearing to be a Tag
|
|
146
|
+
const before = insertBefore.clone || insertBefore;
|
|
147
|
+
const clones = buildItemTagMap(tag, template, before);
|
|
148
|
+
clones.forEach(clone => afterElmBuild(clone, counts));
|
|
149
|
+
result.tag = tag; // let reprocessing know we saw this previously as an if
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
export function isTagComponent(value) {
|
|
153
|
+
return value instanceof TemplaterResult;
|
|
154
|
+
}
|
|
155
|
+
function processSubjectComponent(value, result, template, ownerTag, counts) {
|
|
156
|
+
if (value.tagged !== true) {
|
|
157
|
+
let name = value.name || value.constructor?.name;
|
|
158
|
+
if (name === 'Function') {
|
|
159
|
+
name = undefined;
|
|
160
|
+
}
|
|
161
|
+
const error = new Error(`Not a tag component. Wrap your function with tag(). Example tag(props => html\`\`) on component:\n\n${name || value.toString().substring(0, 120)}\n\n`);
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
/** @type {TagSupport} */
|
|
165
|
+
const tagSupport = result.tagSupport || getTagSupport(value);
|
|
166
|
+
tagSupport.mutatingRender = () => {
|
|
167
|
+
const preRenderCount = tagSupport.renderCount;
|
|
168
|
+
// Is this NOT my first render
|
|
169
|
+
if (result.tag) {
|
|
170
|
+
providersChangeCheck(result.tag);
|
|
171
|
+
// When the providers were checked, a render to myself occurred and I do not need to re-render again
|
|
172
|
+
if (preRenderCount !== tagSupport.renderCount) {
|
|
173
|
+
return tagSupport.newest;
|
|
174
|
+
}
|
|
175
|
+
const hasPropsChanged = tagSupport.hasPropChanges(value.props, value.newProps, result.tag.tagSupport.templater.props);
|
|
176
|
+
if (!hasPropsChanged) {
|
|
177
|
+
tagSupport.newest = value.redraw(value.newProps); // No change detected, just redraw me only
|
|
178
|
+
return tagSupport.newest;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// draw to my parent
|
|
182
|
+
const newest = tagSupport.newest = ownerTag.tagSupport.render();
|
|
183
|
+
return newest;
|
|
184
|
+
};
|
|
185
|
+
const templater = value;
|
|
186
|
+
let tag = templater.newest;
|
|
187
|
+
providers.ownerTag = ownerTag;
|
|
188
|
+
const isFirstTime = !tag;
|
|
189
|
+
runBeforeRender(tagSupport, tag);
|
|
190
|
+
if (isFirstTime) {
|
|
191
|
+
tag = templater.wrapper();
|
|
192
|
+
tag.tagSupport = tagSupport;
|
|
193
|
+
tag.afterRender();
|
|
194
|
+
templater.oldest = tag;
|
|
195
|
+
tagSupport.oldest = tag;
|
|
196
|
+
value.oldest = tag;
|
|
197
|
+
}
|
|
198
|
+
templater.newest = tag;
|
|
199
|
+
tag.ownerTag = ownerTag;
|
|
200
|
+
tag.ownerTag = ownerTag;
|
|
201
|
+
ownerTag.children.push(tag);
|
|
202
|
+
tag.setSupport(tagSupport);
|
|
203
|
+
processTagResult(tag, result, // The element set here will be removed from document
|
|
204
|
+
template, // <template end interpolate /> (will be removed)
|
|
205
|
+
{
|
|
206
|
+
counts,
|
|
207
|
+
});
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
function afterElmBuild(elm, counts) {
|
|
211
|
+
if (!elm.getAttribute) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
elementInitCheck(elm, counts);
|
|
215
|
+
if (elm.children) {
|
|
216
|
+
new Array(...elm.children).forEach(child => afterElmBuild(child, counts));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function providersChangeCheck(tag) {
|
|
220
|
+
const providersWithChanges = tag.providers.filter(provider => {
|
|
221
|
+
return !deepEqual(provider.instance, provider.clone);
|
|
222
|
+
});
|
|
223
|
+
// reset clones
|
|
224
|
+
providersWithChanges.forEach(provider => {
|
|
225
|
+
const appElement = tag.getAppElement();
|
|
226
|
+
handleProviderChanges(appElement, provider);
|
|
227
|
+
provider.clone = deepClone(provider.instance);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
*
|
|
232
|
+
* @param {Tag} appElement
|
|
233
|
+
* @param {Provider} provider
|
|
234
|
+
*/
|
|
235
|
+
function handleProviderChanges(appElement, provider) {
|
|
236
|
+
const tagsWithProvider = getTagsWithProvider(appElement, provider);
|
|
237
|
+
tagsWithProvider.forEach(({ tag, renderCount, provider }) => {
|
|
238
|
+
if (renderCount === tag.tagSupport.renderCount) {
|
|
239
|
+
provider.clone = deepClone(provider.instance);
|
|
240
|
+
tag.tagSupport.render();
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
*
|
|
246
|
+
* @param {Tag} appElement
|
|
247
|
+
* @param {Provider} provider
|
|
248
|
+
* @returns {{tag: Tag, renderCount: numer, provider: Provider}[]}
|
|
249
|
+
*/
|
|
250
|
+
function getTagsWithProvider(tag, provider, memory = []) {
|
|
251
|
+
const hasProvider = tag.providers.find(xProvider => xProvider.constructMethod === provider.constructMethod);
|
|
252
|
+
if (hasProvider) {
|
|
253
|
+
memory.push({
|
|
254
|
+
tag,
|
|
255
|
+
renderCount: tag.tagSupport.renderCount,
|
|
256
|
+
provider: hasProvider
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
tag.children.forEach(child => getTagsWithProvider(child, provider, memory));
|
|
260
|
+
return memory;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=interpolateTemplate.js.map
|