@dooboostore/simple-web-component 1.0.36 → 1.0.37

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 (210) hide show
  1. package/README.md +41 -4
  2. package/dist/cjs/{elements/SwcAppEngine.js → SwcAppEngine.js} +6 -6
  3. package/dist/cjs/SwcAppEngine.js.map +7 -0
  4. package/dist/cjs/decorators/applyNode.js +14 -13
  5. package/dist/cjs/decorators/applyNode.js.map +2 -2
  6. package/dist/cjs/decorators/applySlot.js +122 -0
  7. package/dist/cjs/decorators/applySlot.js.map +7 -0
  8. package/dist/cjs/decorators/elementDefine.js +38 -30
  9. package/dist/cjs/decorators/elementDefine.js.map +2 -2
  10. package/dist/cjs/decorators/index.js +1 -0
  11. package/dist/cjs/decorators/index.js.map +2 -2
  12. package/dist/cjs/decorators/lifecycles.js +56 -8
  13. package/dist/cjs/decorators/lifecycles.js.map +2 -2
  14. package/dist/cjs/elements/{SwcAppMixin.js → SwcApp.js} +107 -57
  15. package/dist/cjs/elements/SwcApp.js.map +7 -0
  16. package/dist/cjs/elements/index.js +21 -2
  17. package/dist/cjs/elements/index.js.map +3 -3
  18. package/dist/cjs/elements/tt/SwcAppMixin.js +1 -0
  19. package/dist/cjs/elements/tt/SwcAppMixin.js.map +7 -0
  20. package/dist/cjs/elements/tt/SwcAsync.js +1 -0
  21. package/dist/cjs/elements/tt/SwcAsync.js.map +7 -0
  22. package/dist/cjs/elements/tt/SwcAsyncTemplate.js +1 -0
  23. package/dist/cjs/elements/tt/SwcAsyncTemplate.js.map +7 -0
  24. package/dist/cjs/elements/tt/SwcChoose.js +1 -0
  25. package/dist/cjs/elements/tt/SwcChoose.js.map +7 -0
  26. package/dist/cjs/elements/tt/SwcChooseTemplate.js +1 -0
  27. package/dist/cjs/elements/tt/SwcChooseTemplate.js.map +7 -0
  28. package/dist/cjs/elements/tt/SwcIf.js +1 -0
  29. package/dist/cjs/elements/tt/SwcIf.js.map +7 -0
  30. package/dist/cjs/elements/tt/SwcIfTemplate.js +1 -0
  31. package/dist/cjs/elements/tt/SwcIfTemplate.js.map +7 -0
  32. package/dist/cjs/elements/tt/SwcLoop.js +1 -0
  33. package/dist/cjs/elements/tt/SwcLoop.js.map +7 -0
  34. package/dist/cjs/elements/tt/SwcLoopTemplate.js +1 -0
  35. package/dist/cjs/elements/tt/SwcLoopTemplate.js.map +7 -0
  36. package/dist/cjs/elements/tt/SwcSubTemplates.js +1 -0
  37. package/dist/cjs/elements/tt/SwcSubTemplates.js.map +7 -0
  38. package/dist/cjs/elements/tt/register.js +1 -0
  39. package/dist/cjs/elements/tt/register.js.map +7 -0
  40. package/dist/cjs/index.js +12 -8
  41. package/dist/cjs/index.js.map +2 -2
  42. package/dist/cjs/types/window.d.js +16 -0
  43. package/dist/cjs/types/window.d.js.map +7 -0
  44. package/dist/cjs/types.js.map +1 -1
  45. package/dist/cjs/utils/Utils.js +9 -6
  46. package/dist/cjs/utils/Utils.js.map +2 -2
  47. package/dist/esm/{elements/SwcAppEngine.js → SwcAppEngine.js} +4 -4
  48. package/dist/esm/SwcAppEngine.js.map +7 -0
  49. package/dist/esm/decorators/applyNode.js +14 -13
  50. package/dist/esm/decorators/applyNode.js.map +2 -2
  51. package/dist/esm/decorators/applySlot.js +103 -0
  52. package/dist/esm/decorators/applySlot.js.map +7 -0
  53. package/dist/esm/decorators/elementDefine.js +41 -33
  54. package/dist/esm/decorators/elementDefine.js.map +2 -2
  55. package/dist/esm/decorators/index.js +1 -0
  56. package/dist/esm/decorators/index.js.map +2 -2
  57. package/dist/esm/decorators/lifecycles.js +56 -8
  58. package/dist/esm/decorators/lifecycles.js.map +2 -2
  59. package/dist/esm/elements/{SwcAppMixin.js → SwcApp.js} +102 -53
  60. package/dist/esm/elements/SwcApp.js.map +7 -0
  61. package/dist/esm/elements/index.js +7 -1
  62. package/dist/esm/elements/index.js.map +2 -2
  63. package/dist/esm/elements/tt/SwcAppMixin.js +1 -0
  64. package/dist/esm/elements/tt/SwcAppMixin.js.map +7 -0
  65. package/dist/esm/elements/tt/SwcAsync.js +1 -0
  66. package/dist/esm/elements/tt/SwcAsync.js.map +7 -0
  67. package/dist/esm/elements/tt/SwcAsyncTemplate.js +1 -0
  68. package/dist/esm/elements/tt/SwcAsyncTemplate.js.map +7 -0
  69. package/dist/esm/elements/tt/SwcChoose.js +1 -0
  70. package/dist/esm/elements/tt/SwcChoose.js.map +7 -0
  71. package/dist/esm/elements/tt/SwcChooseTemplate.js +1 -0
  72. package/dist/esm/elements/tt/SwcChooseTemplate.js.map +7 -0
  73. package/dist/esm/elements/tt/SwcIf.js +1 -0
  74. package/dist/esm/elements/tt/SwcIf.js.map +7 -0
  75. package/dist/esm/elements/tt/SwcIfTemplate.js +1 -0
  76. package/dist/esm/elements/tt/SwcIfTemplate.js.map +7 -0
  77. package/dist/esm/elements/tt/SwcLoop.js +1 -0
  78. package/dist/esm/elements/tt/SwcLoop.js.map +7 -0
  79. package/dist/esm/elements/tt/SwcLoopTemplate.js +1 -0
  80. package/dist/esm/elements/tt/SwcLoopTemplate.js.map +7 -0
  81. package/dist/esm/elements/tt/SwcSubTemplates.js +1 -0
  82. package/dist/esm/elements/tt/SwcSubTemplates.js.map +7 -0
  83. package/dist/esm/elements/tt/register.js +1 -0
  84. package/dist/esm/elements/tt/register.js.map +7 -0
  85. package/dist/esm/index.js +13 -9
  86. package/dist/esm/index.js.map +2 -2
  87. package/dist/esm/types/window.d.js +1 -0
  88. package/dist/esm/types/window.d.js.map +7 -0
  89. package/dist/esm/types.js.map +1 -1
  90. package/dist/esm/utils/Utils.js +9 -6
  91. package/dist/esm/utils/Utils.js.map +2 -2
  92. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +3867 -97
  93. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  94. package/dist/types/{elements/SwcAppEngine.d.ts → SwcAppEngine.d.ts} +9 -4
  95. package/dist/types/SwcAppEngine.d.ts.map +1 -0
  96. package/dist/types/decorators/applyNode.d.ts +7 -7
  97. package/dist/types/decorators/applyNode.d.ts.map +1 -1
  98. package/dist/types/decorators/applySlot.d.ts +27 -0
  99. package/dist/types/decorators/applySlot.d.ts.map +1 -0
  100. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  101. package/dist/types/decorators/index.d.ts +1 -0
  102. package/dist/types/decorators/index.d.ts.map +1 -1
  103. package/dist/types/decorators/lifecycles.d.ts +21 -6
  104. package/dist/types/decorators/lifecycles.d.ts.map +1 -1
  105. package/dist/types/elements/SwcApp.d.ts +7 -0
  106. package/dist/types/elements/SwcApp.d.ts.map +1 -0
  107. package/dist/types/elements/index.d.ts +2 -1
  108. package/dist/types/elements/index.d.ts.map +1 -1
  109. package/dist/types/elements/tt/SwcAppMixin.d.ts +1 -0
  110. package/dist/types/elements/tt/SwcAppMixin.d.ts.map +1 -0
  111. package/dist/types/elements/tt/SwcAsync.d.ts +1 -0
  112. package/dist/types/elements/tt/SwcAsync.d.ts.map +1 -0
  113. package/dist/types/elements/tt/SwcAsyncTemplate.d.ts +1 -0
  114. package/dist/types/elements/tt/SwcAsyncTemplate.d.ts.map +1 -0
  115. package/dist/types/elements/tt/SwcChoose.d.ts +1 -0
  116. package/dist/types/elements/tt/SwcChoose.d.ts.map +1 -0
  117. package/dist/types/elements/tt/SwcChooseTemplate.d.ts +1 -0
  118. package/dist/types/elements/tt/SwcChooseTemplate.d.ts.map +1 -0
  119. package/dist/types/elements/tt/SwcIf.d.ts +1 -0
  120. package/dist/types/elements/{SwcIf.d.ts.map → tt/SwcIf.d.ts.map} +1 -1
  121. package/dist/types/elements/tt/SwcIfTemplate.d.ts +1 -0
  122. package/dist/types/elements/tt/SwcIfTemplate.d.ts.map +1 -0
  123. package/dist/types/elements/tt/SwcLoop.d.ts +1 -0
  124. package/dist/types/elements/tt/SwcLoop.d.ts.map +1 -0
  125. package/dist/types/elements/tt/SwcLoopTemplate.d.ts +1 -0
  126. package/dist/types/elements/tt/SwcLoopTemplate.d.ts.map +1 -0
  127. package/dist/types/elements/tt/SwcSubTemplates.d.ts +1 -0
  128. package/dist/types/elements/tt/SwcSubTemplates.d.ts.map +1 -0
  129. package/dist/types/elements/tt/register.d.ts +1 -0
  130. package/dist/types/elements/tt/register.d.ts.map +1 -0
  131. package/dist/types/index.d.ts +2 -2
  132. package/dist/types/index.d.ts.map +1 -1
  133. package/dist/types/types.d.ts +3 -3
  134. package/dist/types/types.d.ts.map +1 -1
  135. package/dist/types/utils/Utils.d.ts +6 -5
  136. package/dist/types/utils/Utils.d.ts.map +1 -1
  137. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +3867 -97
  138. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  139. package/package.json +2 -2
  140. package/src/{elements/SwcAppEngine.ts → SwcAppEngine.ts} +12 -7
  141. package/src/decorators/applyNode.ts +15 -13
  142. package/src/decorators/applySlot.ts +228 -0
  143. package/src/decorators/elementDefine.ts +59 -37
  144. package/src/decorators/index.ts +1 -0
  145. package/src/decorators/lifecycles.ts +76 -11
  146. package/src/elements/{SwcAppMixin.ts → SwcApp.ts} +98 -31
  147. package/src/elements/index.ts +11 -1
  148. package/src/elements/tt/SwcAppMixin.ts +13 -0
  149. package/src/elements/tt/SwcAsync.ts +139 -0
  150. package/src/elements/tt/SwcAsyncTemplate.ts +126 -0
  151. package/src/elements/tt/SwcChoose.ts +182 -0
  152. package/src/elements/tt/SwcChooseTemplate.ts +229 -0
  153. package/src/elements/tt/SwcIf.ts +145 -0
  154. package/src/elements/tt/SwcIfTemplate.ts +158 -0
  155. package/src/elements/tt/SwcLoop.ts +222 -0
  156. package/src/elements/tt/SwcLoopTemplate.ts +255 -0
  157. package/src/elements/tt/SwcSubTemplates.ts +6 -0
  158. package/src/elements/tt/register.ts +720 -0
  159. package/src/index.ts +13 -9
  160. package/src/types/window.d.ts +43 -0
  161. package/src/types.ts +4 -3
  162. package/src/utils/Utils.ts +11 -6
  163. package/dist/cjs/elements/SwcAppEngine.js.map +0 -7
  164. package/dist/cjs/elements/SwcAppMixin.js.map +0 -7
  165. package/dist/cjs/elements/SwcAsync.js +0 -129
  166. package/dist/cjs/elements/SwcAsync.js.map +0 -7
  167. package/dist/cjs/elements/SwcChoose.js +0 -155
  168. package/dist/cjs/elements/SwcChoose.js.map +0 -7
  169. package/dist/cjs/elements/SwcIf.js +0 -117
  170. package/dist/cjs/elements/SwcIf.js.map +0 -7
  171. package/dist/cjs/elements/SwcLoop.js +0 -176
  172. package/dist/cjs/elements/SwcLoop.js.map +0 -7
  173. package/dist/cjs/elements/SwcSubTemplates.js +0 -13
  174. package/dist/cjs/elements/SwcSubTemplates.js.map +0 -7
  175. package/dist/cjs/elements/register.js +0 -1026
  176. package/dist/cjs/elements/register.js.map +0 -7
  177. package/dist/esm/elements/SwcAppEngine.js.map +0 -7
  178. package/dist/esm/elements/SwcAppMixin.js.map +0 -7
  179. package/dist/esm/elements/SwcAsync.js +0 -129
  180. package/dist/esm/elements/SwcAsync.js.map +0 -7
  181. package/dist/esm/elements/SwcChoose.js +0 -155
  182. package/dist/esm/elements/SwcChoose.js.map +0 -7
  183. package/dist/esm/elements/SwcIf.js +0 -117
  184. package/dist/esm/elements/SwcIf.js.map +0 -7
  185. package/dist/esm/elements/SwcLoop.js +0 -176
  186. package/dist/esm/elements/SwcLoop.js.map +0 -7
  187. package/dist/esm/elements/SwcSubTemplates.js +0 -13
  188. package/dist/esm/elements/SwcSubTemplates.js.map +0 -7
  189. package/dist/esm/elements/register.js +0 -1007
  190. package/dist/esm/elements/register.js.map +0 -7
  191. package/dist/types/elements/SwcAppEngine.d.ts.map +0 -1
  192. package/dist/types/elements/SwcAppMixin.d.ts +0 -386
  193. package/dist/types/elements/SwcAppMixin.d.ts.map +0 -1
  194. package/dist/types/elements/SwcAsync.d.ts +0 -2
  195. package/dist/types/elements/SwcAsync.d.ts.map +0 -1
  196. package/dist/types/elements/SwcChoose.d.ts +0 -2
  197. package/dist/types/elements/SwcChoose.d.ts.map +0 -1
  198. package/dist/types/elements/SwcIf.d.ts +0 -2
  199. package/dist/types/elements/SwcLoop.d.ts +0 -2
  200. package/dist/types/elements/SwcLoop.d.ts.map +0 -1
  201. package/dist/types/elements/SwcSubTemplates.d.ts +0 -13
  202. package/dist/types/elements/SwcSubTemplates.d.ts.map +0 -1
  203. package/dist/types/elements/register.d.ts +0 -4
  204. package/dist/types/elements/register.d.ts.map +0 -1
  205. package/src/elements/SwcAsync.ts +0 -126
  206. package/src/elements/SwcChoose.ts +0 -190
  207. package/src/elements/SwcIf.ts +0 -124
  208. package/src/elements/SwcLoop.ts +0 -205
  209. package/src/elements/SwcSubTemplates.ts +0 -6
  210. package/src/elements/register.ts +0 -1022
@@ -0,0 +1,126 @@
1
+ // import { changedAttributeThis } from '../../decorators/changedAttributeThis';
2
+ // import { SwcUtils } from '../../utils/Utils';
3
+ // import { FunctionUtils, ActionExpression } from '@dooboostore/core';
4
+ // import { ConvertUtils } from '@dooboostore/core-web';
5
+ // import { attributeThis } from '../../decorators';
6
+ //
7
+ // export class SwcAsyncTemplate extends HTMLTemplateElement {
8
+ // @attributeThis('value')
9
+ // _value: any;
10
+ // @attributeThis('replace-wrap-start')
11
+ // _replaceWrapStart: string | null;
12
+ // @attributeThis('replace-wrap-end')
13
+ // _replaceWrapEnd: string | null; resultValue?: any;
14
+ //
15
+ // get value(): boolean {
16
+ // return this._value;
17
+ // }
18
+ //
19
+ // set value(nv: any) {
20
+ // this.executeAsync(nv);
21
+ // }
22
+ //
23
+ // private _nodes: Node[] = [];
24
+ //
25
+ // @changedAttributeThis('value')
26
+ // private setValue(valueAttr?: string | null) {
27
+ // this.executeAsync(this._value);
28
+ // }
29
+ //
30
+ // // @changedAttributeThis('replace-wrap')
31
+ // // private setReplaceWrap() {
32
+ // // this.executeAsync(this._value);
33
+ // // }
34
+ //
35
+ // private executeAsync(result: any = this._value) {
36
+ // if (result === undefined || result === null) {
37
+ // this.refresh('default');
38
+ // return;
39
+ // }
40
+ //
41
+ // if (result instanceof Promise) {
42
+ // this.refresh('loading');
43
+ // result
44
+ // .then(v => {
45
+ // this.resultValue = v;
46
+ // this.refresh('success');
47
+ // })
48
+ // .catch(e => {
49
+ // console.error('[SWC-ASYNC] Promise rejected:', e);
50
+ // this.resultValue = e;
51
+ // this.refresh('error');
52
+ // });
53
+ // } else {
54
+ // this.resultValue = result;
55
+ // this.refresh('success');
56
+ // }
57
+ // }
58
+ //
59
+ // private replaceExpressions(html: string, groupArgs: any, context: any, wrap: {start: string, end: string}): string {
60
+ // let config: any = undefined;
61
+ // if (wrap) {
62
+ // config = {
63
+ // expression: {
64
+ // replace: { start: `${wrap.start}`, end: `${wrap.end}` },
65
+ // callReturn: { start: `${wrap.start}=`, end: `${wrap.end}` },
66
+ // call: { start: `${wrap.start}@`, end: `${wrap.end}` }
67
+ // }
68
+ // };
69
+ // }
70
+ // const ae = new ActionExpression(html, config);
71
+ // const win = this.ownerDocument?.defaultView || window;
72
+ //
73
+ // // @ts-ignore
74
+ // for (const expr of ae.getExpressions('replace')) {
75
+ // try {
76
+ // const value = FunctionUtils.executeReturn({
77
+ // script: ConvertUtils.decodeHtmlEntity(expr.script, win.document),
78
+ // context,
79
+ // args: groupArgs
80
+ // });
81
+ // ae.replace(expr, String(value));
82
+ // } catch (e) {
83
+ // console.error(`[SWC] Failed to execute ${expr.original}:`, e);
84
+ // }
85
+ // }
86
+ // return ae.getUnprocessedTemplate();
87
+ // }
88
+ //
89
+ // refresh(state: string = 'default') {
90
+ // // console.log('rrrrrrrrrrrrrrrrr', state);
91
+ // this.cleanup();
92
+ // const portal = SwcUtils.getParentContainer(this);
93
+ // if (!portal) return;
94
+ //
95
+ // const win = this.ownerDocument?.defaultView || window;
96
+ // const helperSet = SwcUtils.getHelperAndHostSet(win, this);
97
+ //
98
+ // const t = this.content.querySelector(`template[is="swc-${state}"]`) as HTMLTemplateElement;
99
+ // if (t) {
100
+ // let htmlString = t.innerHTML;
101
+ // const groupArgs = { ...helperSet, $value: this._value, $state: state, $templateHost: this };
102
+ //
103
+ // htmlString = this.replaceExpressions(htmlString, groupArgs, this, {start:this._replaceWrapStart ?? '{#{', end: this._replaceWrapEnd ?? '}#}'});
104
+ //
105
+ // const temp = this.ownerDocument?.createElement('template') || document.createElement('template');
106
+ // temp.innerHTML = htmlString;
107
+ // const content = temp.content;
108
+ //
109
+ // this._nodes = Array.from(content.childNodes);
110
+ // this._nodes.forEach((node: any) => {
111
+ // if (node instanceof HTMLElement) (node as any).__template_swc_host = this;
112
+ // });
113
+ //
114
+ // portal.insertBefore(content, this.nextSibling);
115
+ // }
116
+ // }
117
+ //
118
+ // private cleanup() {
119
+ // this._nodes.forEach(n => n.parentElement?.removeChild(n));
120
+ // this._nodes = [];
121
+ // }
122
+ //
123
+ // disconnectedCallback() {
124
+ // this.cleanup();
125
+ // }
126
+ // }
@@ -0,0 +1,182 @@
1
+ // import {SwcUtils} from '../../utils/Utils';
2
+ // import {ActionExpression, FunctionUtils} from '@dooboostore/core';
3
+ // import {ConvertUtils} from '@dooboostore/core-web';
4
+ // import {elementDefine, getAttributeValue, getElementConfig} from '../../decorators';
5
+ //
6
+ // export default async (w: Window)=> {
7
+ // const tagName = 'swc-choose';
8
+ // const existing = w.customElements.get(tagName);
9
+ // if (existing) return existing;
10
+ // @elementDefine(tagName, { window: w })
11
+ // class SwcChoose extends w.HTMLElement {
12
+ // private _value: any;
13
+ // private _replaceWrapStart: string | null = null;
14
+ // private _replaceWrapEnd: string | null = null;
15
+ // private _nodes: Node[] = [];
16
+ // private _previousTemplate: HTMLTemplateElement | null = null;
17
+ //
18
+ // static get observedAttributes() {
19
+ // return ['value', 'replace-wrap-start', 'replace-wrap-end'];
20
+ // }
21
+ //
22
+ // get value(): any {
23
+ // return this._value;
24
+ // }
25
+ //
26
+ // set value(nv: any) {
27
+ // this._value = nv;
28
+ // this.refresh(this._value);
29
+ // }
30
+ //
31
+ // connectedCallback() {
32
+ // this.style.display = 'none';
33
+ // if (!this.id) {
34
+ // throw new Error('[SWC] SwcChoose must have an "id" attribute for reliable cleanup.');
35
+ // }
36
+ // if (this.hasAttribute('value')) {
37
+ // this.refresh();
38
+ // }
39
+ // }
40
+ //
41
+ // attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
42
+ // switch (name) {
43
+ // case 'value':
44
+ // this._value = newValue;
45
+ // this.refresh(this._value);
46
+ // break;
47
+ // case 'replace-wrap-start':
48
+ // this._replaceWrapStart = newValue;
49
+ // break;
50
+ // case 'replace-wrap-end':
51
+ // this._replaceWrapEnd = newValue;
52
+ // break;
53
+ // }
54
+ // }
55
+ //
56
+ // private replaceExpressions(html: string, groupArgs: any, context: any, wrap: { start: string, end: string }): string {
57
+ // let config: any = undefined;
58
+ // if (wrap) {
59
+ // config = {
60
+ // expression: {
61
+ // replace: {start: `${wrap.start}`, end: `${wrap.end}`},
62
+ // callReturn: {start: `${wrap.start}=`, end: `${wrap.end}`},
63
+ // call: {start: `${wrap.start}@`, end: `${wrap.end}`}
64
+ // }
65
+ // };
66
+ // }
67
+ // const ae = new ActionExpression(html, config);
68
+ // const win = this.ownerDocument?.defaultView || window;
69
+ // for (const expr of ae.getExpressions('replace')) {
70
+ // try {
71
+ // const value = FunctionUtils.executeReturn({
72
+ // script: ConvertUtils.decodeHtmlEntity(expr.script, win.document),
73
+ // context,
74
+ // args: groupArgs
75
+ // });
76
+ // ae.replace(expr, String(value));
77
+ // } catch (e) {
78
+ // console.error(`[SWC] Failed to execute ${expr.original}:`, e);
79
+ // }
80
+ // }
81
+ // return ae.getUnprocessedTemplate();
82
+ // }
83
+ //
84
+ // refresh(value?: any) {
85
+ // if (!this.id) return;
86
+ // value = value ?? getAttributeValue(this, 'value') ?? this._value;
87
+ // const portal = SwcUtils.getParentContainer(this);
88
+ // if (!portal) return;
89
+ // const win = (getElementConfig(this).window ?? this.ownerDocument?.defaultView) || window;
90
+ // const helperSet = SwcUtils.getHelperAndHostSet(win, this);
91
+ // const groupArgs = {...helperSet, $value: value, $templateHost: this};
92
+ // // HTMLElement에서는 children에서 template 찾기
93
+ // const templates = Array.from(this.children).filter(
94
+ // (el): el is HTMLTemplateElement => el.tagName === 'TEMPLATE'
95
+ // );
96
+ // let selected: HTMLTemplateElement | null = null;
97
+ // for (const t of templates) {
98
+ // if (t.getAttribute('is') === 'swc-when') {
99
+ // const attrVal = t.getAttribute('test') || '';
100
+ // let matches = false;
101
+ // const result = FunctionUtils.executeReturn({
102
+ // script: attrVal,
103
+ // context: t,
104
+ // args: groupArgs
105
+ // });
106
+ // matches = !!result;
107
+ // if (matches) {
108
+ // selected = t;
109
+ // break;
110
+ // }
111
+ // }
112
+ // }
113
+ // const target = selected || (templates.find(t => t.getAttribute('is') === 'swc-otherwise') ?? null);
114
+ // const skipValue = target?.getAttribute?.('skip-if-same');
115
+ // const skipValue2 = this._previousTemplate?.getAttribute?.('skip-if-same');
116
+ // const hasSkipIfSame = target?.hasAttribute?.('skip-if-same');
117
+ // const isSame = this._previousTemplate === target;
118
+ // if (hasSkipIfSame && isSame) {
119
+ // return;
120
+ // }
121
+ // this.cleanup();
122
+ // this._previousTemplate = target;
123
+ // if (target) {
124
+ // let htmlString = target.innerHTML;
125
+ // htmlString = this.replaceExpressions(htmlString, groupArgs, this, {start: this._replaceWrapStart ?? '{#{', end: this._replaceWrapEnd ?? '}#}'});
126
+ // const result = this.ownerDocument?.createElement('template') || document.createElement('template');
127
+ // result.innerHTML = htmlString;
128
+ // const processedFragment = result.content;
129
+ // this._nodes = Array.from(processedFragment.childNodes);
130
+ // const setTemplateHost = (element: HTMLElement) => {
131
+ // (element as any).__swc_template_host = this;
132
+ // Array.from(element.children).forEach((child: any) => {
133
+ // if (child instanceof HTMLElement) {
134
+ // setTemplateHost(child);
135
+ // }
136
+ // });
137
+ // };
138
+ // this._nodes.forEach((node: any) => {
139
+ // if (node instanceof HTMLElement) {
140
+ // setTemplateHost(node as HTMLElement);
141
+ // }
142
+ // });
143
+ // const endpoint = this.ownerDocument?.createComment(`swc-choose endpoint id:${this.id}`) || document.createComment(`swc-choose endpoint id:${this.id}`);
144
+ // processedFragment.appendChild(endpoint);
145
+ // this._nodes.push(endpoint);
146
+ // portal.insertBefore(processedFragment, this.nextSibling);
147
+ // }
148
+ // }
149
+ //
150
+ // private cleanup() {
151
+ // if (this.id) {
152
+ // const portal = SwcUtils.getParentContainer(this);
153
+ // if (portal) {
154
+ // const endpointText = `swc-choose endpoint id:${this.id}`;
155
+ // let current = this.nextSibling;
156
+ // const toRemove: Node[] = [];
157
+ // while (current) {
158
+ // toRemove.push(current);
159
+ // if (current.nodeType === 8 && (current as Comment).data === endpointText) {
160
+ // toRemove.forEach(n => {
161
+ // const realNode = (n as any).__upgraded_instance || n;
162
+ // if (realNode.parentElement) {
163
+ // realNode.parentElement.removeChild(realNode);
164
+ // }
165
+ // });
166
+ // break;
167
+ // }
168
+ // current = current.nextSibling;
169
+ // }
170
+ // }
171
+ // }
172
+ // this._nodes = [];
173
+ // }
174
+ //
175
+ // disconnectedCallback() {
176
+ // this.cleanup();
177
+ // }
178
+ // }
179
+ //
180
+ // return w.customElements.whenDefined(tagName);
181
+ //
182
+ // }
@@ -0,0 +1,229 @@
1
+ // import {changedAttributeThis} from '../../decorators/changedAttributeThis';
2
+ // import {SwcUtils} from '../../utils/Utils';
3
+ // import {FunctionUtils, ActionExpression} from '@dooboostore/core';
4
+ // import {ConvertUtils} from '@dooboostore/core-web';
5
+ // import {SwcChooseInterface} from '../../types';
6
+ // import {attributeThis, getAttributeValue, getElementConfig} from '../../decorators';
7
+ //
8
+ // export class SwcChooseTemplate extends HTMLTemplateElement implements SwcChooseInterface {
9
+ // _value: any;
10
+ //
11
+ // @attributeThis('replace-wrap-start')
12
+ // _replaceWrapStart: string | null;
13
+ // @attributeThis('replace-wrap-end')
14
+ // _replaceWrapEnd: string | null;
15
+ //
16
+ // private _nodes: Node[] = [];
17
+ // private _previousTemplate: HTMLTemplateElement | null = null;
18
+ //
19
+ // get value(): any {
20
+ // return this._value;
21
+ // }
22
+ //
23
+ // set value(nv: any) {
24
+ // this._value = nv;
25
+ // this.refresh(this._value);
26
+ // }
27
+ //
28
+ // constructor() {
29
+ // super();
30
+ // // console.log('swc chooooooooooooooooooooooooose constructor called!');
31
+ // // console.log('swc cccccccss', this.getAttribute('value'));
32
+ // }
33
+ //
34
+ // static get observedAttributes() {
35
+ // return ['value'];
36
+ // }
37
+ //
38
+ // attributeChangedCallback(na, o, n) {
39
+ // // console.log('-----------------choooooooose attr origin', na, o, n);
40
+ // }
41
+ //
42
+ // connectedCallback() {
43
+ // // console.log('------choooooooose connectedCallback called!------');
44
+ // if (!this.id) {
45
+ // throw new Error('[SWC] SwcChoose must have an "id" attribute for reliable cleanup.');
46
+ // }
47
+ // if (this.hasAttribute('value')) {
48
+ // this.refresh();
49
+ // }
50
+ // }
51
+ //
52
+ // @changedAttributeThis('value')
53
+ // private setValue(value: any, o: string, n: string) {
54
+ // if (!this.id) return;
55
+ // // console.log('chooooooose value', value)
56
+ // this._value = value;
57
+ // this.refresh(this._value);
58
+ // }
59
+ //
60
+ // // @changedAttributeThis('replace-wrap')
61
+ // // private setReplaceWrap(replaceWrapAttr?: string | null) {
62
+ // // this.refresh();
63
+ // // }
64
+ //
65
+ // private replaceExpressions(html: string, groupArgs: any, context: any, wrap: { start: string, end: string }): string {
66
+ // let config: any = undefined;
67
+ // if (wrap) {
68
+ // config = {
69
+ // expression: {
70
+ // replace: {start: `${wrap.start}`, end: `${wrap.end}`},
71
+ // callReturn: {start: `${wrap.start}=`, end: `${wrap.end}`},
72
+ // call: {start: `${wrap.start}@`, end: `${wrap.end}`}
73
+ // }
74
+ // };
75
+ // }
76
+ // const ae = new ActionExpression(html, config);
77
+ // const win = this.ownerDocument?.defaultView || window;
78
+ //
79
+ // // @ts-ignore
80
+ // for (const expr of ae.getExpressions('replace')) {
81
+ // try {
82
+ // const value = FunctionUtils.executeReturn({
83
+ // script: ConvertUtils.decodeHtmlEntity(expr.script, win.document),
84
+ // context,
85
+ // args: groupArgs
86
+ // });
87
+ // ae.replace(expr, String(value));
88
+ // } catch (e) {
89
+ // console.error(`[SWC] Failed to execute ${expr.original}:`, e);
90
+ // }
91
+ // }
92
+ // return ae.getUnprocessedTemplate();
93
+ // }
94
+ //
95
+ // refresh(value?: any) {
96
+ // if (!this.id) return;
97
+ // value = value ?? getAttributeValue(this, 'value') ?? this._value;
98
+ // // console.log('[DEBUG] SwcChoose.refresh called, value:', value);
99
+ // const portal = SwcUtils.getParentContainer(this);
100
+ // if (!portal) {
101
+ // // console.log('[DEBUG] SwcChoose portal is null!');
102
+ // return;
103
+ // }
104
+ //
105
+ // const win = (getElementConfig(this).window ?? this.ownerDocument?.defaultView) || window;
106
+ // const helperSet = SwcUtils.getHelperAndHostSet(win, this);
107
+ // const groupArgs = {...helperSet, $value: value, $templateHost: this};
108
+ //
109
+ // const templates = Array.from(this.content.querySelectorAll('template'));
110
+ // let selected: HTMLTemplateElement | null = null;
111
+ //
112
+ // for (const t of templates) {
113
+ // if (t.getAttribute('is') === 'swc-when') {
114
+ // const attrVal = t.getAttribute('test') || '';
115
+ // let matches = false;
116
+ //
117
+ //
118
+ // const result = FunctionUtils.executeReturn({
119
+ // script: attrVal,
120
+ // context: t,
121
+ // args: groupArgs
122
+ // });
123
+ // matches = !!result;
124
+ // // Use ActionExpression to parse and extract script from value attribute
125
+ // // const ae = new ActionExpression(attrVal);
126
+ // // const expr = ae.getFirstExpression('replace');
127
+ //
128
+ // // if (expr) {
129
+ // // const decodedScript = ConvertUtils.decodeHtmlEntity(expr.script, win.document);
130
+ // // const result = FunctionUtils.executeReturn({
131
+ // // script: decodedScript,
132
+ // // context: t,
133
+ // // args: groupArgs
134
+ // // });
135
+ // // matches = !!result;
136
+ // // } else {
137
+ // // matches = String(attrVal) === String(value);
138
+ // // }
139
+ //
140
+ // if (matches) {
141
+ // selected = t;
142
+ // break;
143
+ // }
144
+ // }
145
+ // }
146
+ //
147
+ // const target = selected || (this.content.querySelector('template[is="swc-otherwise"]') as HTMLTemplateElement);
148
+ //
149
+ // const skipValue = target?.getAttribute?.('skip-if-same');
150
+ // const skipValue2 = this._previousTemplate?.getAttribute?.('skip-if-same');
151
+ // const hasSkipIfSame = target?.hasAttribute?.('skip-if-same');
152
+ // const isSame = this._previousTemplate === target;
153
+ // // console.log('---rrrr---', this._previousTemplate, target, hasSkipIfSame, isSame, skipValue, skipValue2);
154
+ // if (hasSkipIfSame && isSame) {
155
+ // return;
156
+ // }
157
+ //
158
+ // this.cleanup();
159
+ // this._previousTemplate = target;
160
+ //
161
+ // if (target) {
162
+ // let htmlString = target.innerHTML;
163
+ // htmlString = this.replaceExpressions(htmlString, groupArgs, this, {start: this._replaceWrapStart ?? '{#{', end: this._replaceWrapEnd ?? '}#}'});
164
+ //
165
+ // const result = this.ownerDocument?.createElement('template') || document.createElement('template');
166
+ // result.innerHTML = htmlString;
167
+ // const processedFragment = result.content;
168
+ //
169
+ // // console.log('[DEBUG] SwcChoose processedFragment children:', processedFragment._childNodesInternal?.length);
170
+ // this._nodes = Array.from(processedFragment.childNodes);
171
+ //
172
+ // const setTemplateHost = (element: HTMLElement) => {
173
+ // (element as any).__swc_template_host = this;
174
+ // Array.from(element.children).forEach((child: any) => {
175
+ // if (child instanceof HTMLElement) {
176
+ // setTemplateHost(child);
177
+ // }
178
+ // });
179
+ // };
180
+ //
181
+ // this._nodes.forEach((node: any) => {
182
+ // if (node instanceof HTMLElement) {
183
+ // setTemplateHost(node as HTMLElement);
184
+ // }
185
+ // });
186
+ //
187
+ // // console.log(`[DEBUG] SwcChoose before insertBefore, portal: ${portal?.tagName}, isConnected: ${(portal as any)?.isConnected}`);
188
+ //
189
+ // // Add endpoint comment node
190
+ // const endpoint = this.ownerDocument?.createComment(`swc-choose endpoint id:${this.id}`) || document.createComment(`swc-choose endpoint id:${this.id}`);
191
+ // processedFragment.appendChild(endpoint);
192
+ // this._nodes.push(endpoint);
193
+ //
194
+ // portal.insertBefore(processedFragment, this.nextSibling);
195
+ // // console.log('[DEBUG] SwcChoose after insertBefore');
196
+ // }
197
+ // }
198
+ //
199
+ // private cleanup() {
200
+ // if (this.id) {
201
+ // const portal = SwcUtils.getParentContainer(this);
202
+ // if (portal) {
203
+ // const endpointText = `swc-choose endpoint id:${this.id}`;
204
+ // let current = this.nextSibling;
205
+ // const toRemove: Node[] = [];
206
+ //
207
+ // while (current) {
208
+ // toRemove.push(current);
209
+ // if (current.nodeType === 8 && (current as Comment).data === endpointText) {
210
+ // // Found the endpoint!
211
+ // toRemove.forEach(n => {
212
+ // const realNode = (n as any).__upgraded_instance || n;
213
+ // if (realNode.parentElement) {
214
+ // realNode.parentElement.removeChild(realNode);
215
+ // }
216
+ // });
217
+ // break;
218
+ // }
219
+ // current = current.nextSibling;
220
+ // }
221
+ // }
222
+ // }
223
+ // this._nodes = [];
224
+ // }
225
+ //
226
+ // disconnectedCallback() {
227
+ // this.cleanup();
228
+ // }
229
+ // }
@@ -0,0 +1,145 @@
1
+ // import {SwcUtils} from '../../utils/Utils';
2
+ // import {ActionExpression, FunctionUtils} from '@dooboostore/core';
3
+ // import {ConvertUtils} from '@dooboostore/core-web';
4
+ // import {elementDefine, getAttributeValue} from '../../decorators';
5
+ //
6
+ // export default async (w: Window) => {
7
+ // const tagName = 'swc-if';
8
+ // const existing = w.customElements.get(tagName);
9
+ // if (existing) return existing;
10
+ // @elementDefine(tagName, { window: w })
11
+ // class SwcIf extends w.HTMLElement {
12
+ //
13
+ // private _value: any;
14
+ // private _replaceWrapStart: string | null = null;
15
+ // private _replaceWrapEnd: string | null = null;
16
+ // private _skipIfSame: string | null = null;
17
+ // private _nodes: Node[] = [];
18
+ //
19
+ // static get observedAttributes() {
20
+ // return ['value', 'replace-wrap-start', 'replace-wrap-end', 'skip-if-same'];
21
+ // }
22
+ //
23
+ // get value(): boolean {
24
+ // return this._value;
25
+ // }
26
+ //
27
+ // set value(nv: any) {
28
+ // this.refresh(nv);
29
+ // }
30
+ //
31
+ // connectedCallback() {
32
+ // if (!this.id) {
33
+ // throw new Error('[SWC] SwcIf must have an "id" attribute for reliable cleanup.');
34
+ // }
35
+ // if (this.hasAttribute('value')) {
36
+ // this.refresh();
37
+ // }
38
+ // }
39
+ //
40
+ // attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
41
+ // switch (name) {
42
+ // case 'value':
43
+ // this._value = newValue;
44
+ // this.refresh(this._value);
45
+ // break;
46
+ // case 'replace-wrap-start':
47
+ // this._replaceWrapStart = newValue;
48
+ // break;
49
+ // case 'replace-wrap-end':
50
+ // this._replaceWrapEnd = newValue;
51
+ // break;
52
+ // case 'skip-if-same':
53
+ // this._skipIfSame = newValue;
54
+ // break;
55
+ // }
56
+ // }
57
+ //
58
+ // private replaceExpressions(html: string, groupArgs: any, context: any, wrap: { start: string, end: string }): string {
59
+ // let config: any = undefined;
60
+ // if (wrap) {
61
+ // config = {
62
+ // expression: {
63
+ // replace: {start: `${wrap.start}`, end: `${wrap.end}`},
64
+ // callReturn: {start: `${wrap.start}=`, end: `${wrap.end}`},
65
+ // call: {start: `${wrap.start}@`, end: `${wrap.end}`}
66
+ // }
67
+ // };
68
+ // }
69
+ // const ae = new ActionExpression(html, config);
70
+ // const win = this.ownerDocument?.defaultView || window;
71
+ // for (const expr of ae.getExpressions('replace')) {
72
+ // try {
73
+ // const value = FunctionUtils.executeReturn({
74
+ // script: ConvertUtils.decodeHtmlEntity(expr.script, win.document),
75
+ // context,
76
+ // args: groupArgs
77
+ // });
78
+ // ae.replace(expr, String(value));
79
+ // } catch (e) {
80
+ // console.error(`[SWC] Failed to execute ${expr.original}:`, e);
81
+ // }
82
+ // }
83
+ // return ae.getUnprocessedTemplate();
84
+ // }
85
+ //
86
+ // refresh(value?: any) {
87
+ // if (!this.id) return;
88
+ // const targetValue = value !== undefined ? value : (getAttributeValue(this, 'value') ?? this._value);
89
+ // if (this.hasAttribute('skip-if-same') && this._value === targetValue && (this._nodes.length > 0 || this.nextSibling)) {
90
+ // if (this._value === targetValue && this._nodes.length > 0) return;
91
+ // }
92
+ // this.cleanup();
93
+ // this._value = targetValue;
94
+ // const portal = this.parentElement;
95
+ // if (!portal || !this._value) return;
96
+ // const win = this.ownerDocument?.defaultView || window;
97
+ // const helperSet = SwcUtils.getHelperAndHostSet(win, this);
98
+ // let htmlString = this.innerHTML;
99
+ // const groupArgs = {...helperSet, $value: this._value, $templateHost: this};
100
+ // htmlString = this.replaceExpressions(htmlString, groupArgs, this, {start: this._replaceWrapStart ?? '{#{', end: this._replaceWrapEnd ?? '}#}'});
101
+ // const result = this.ownerDocument?.createElement('template') || document.createElement('template');
102
+ // result.innerHTML = htmlString;
103
+ // const processedFragment = result.content;
104
+ // this._nodes = Array.from(processedFragment.childNodes);
105
+ // this._nodes.forEach((node: any) => {
106
+ // if (node instanceof HTMLElement) (node as any).__swc_template_host = this;
107
+ // });
108
+ // const endpointText = `swc-if endpoint id:${this.id}`;
109
+ // const endpoint = this.ownerDocument?.createComment(endpointText) || document.createComment(endpointText);
110
+ // processedFragment.appendChild(endpoint);
111
+ // this._nodes.push(endpoint);
112
+ // portal.insertBefore(processedFragment, this.nextSibling);
113
+ // }
114
+ //
115
+ // private cleanup() {
116
+ // if (this.id) {
117
+ // const portal = this.parentElement;
118
+ // if (portal) {
119
+ // const endpointText = `swc-if endpoint id:${this.id}`;
120
+ // let current = this.nextSibling;
121
+ // const toRemove: Node[] = [];
122
+ // while (current) {
123
+ // toRemove.push(current);
124
+ // if (current.nodeType === 8 && (current as Comment).data === endpointText) {
125
+ // toRemove.forEach(n => {
126
+ // const realNode = (n as any).__upgraded_instance || n;
127
+ // if (realNode.parentElement) {
128
+ // realNode.parentElement.removeChild(realNode);
129
+ // }
130
+ // });
131
+ // break;
132
+ // }
133
+ // current = current.nextSibling;
134
+ // }
135
+ // }
136
+ // }
137
+ // this._nodes = [];
138
+ // }
139
+ //
140
+ // disconnectedCallback() {
141
+ // this.cleanup();
142
+ // }
143
+ // }
144
+ //
145
+ // }