@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
@@ -8,21 +8,76 @@ export const ON_AFTER_DISCONNECTED_METADATA_KEY = Symbol.for('simple-web-compone
8
8
  export const ON_BEFORE_ADOPTED_METADATA_KEY = Symbol.for('simple-web-component:on-before-adopted');
9
9
  export const ON_AFTER_ADOPTED_METADATA_KEY = Symbol.for('simple-web-component:on-after-adopted');
10
10
  export const ON_ADD_EVENT_LISTENER_METADATA_KEY = Symbol.for('simple-web-component:on-add-event-listener');
11
+ export const ON_CONNECTED_INNER_HTML_METADATA_KEY = Symbol.for('simple-web-component:inner-html');
11
12
  export const ON_CONNECTED_SWC_APP_METADATA_KEY = Symbol.for('simple-web-component:on-connected-swc-app');
12
- export const INNER_HTML_METADATA_KEY = Symbol.for('simple-web-component:inner-html');
13
+ export const ON_CONNECTED_COMPLETED_METADATA_KEY = Symbol.for('simple-web-component:on-completed');
13
14
 
14
15
  export const ATTRIBUTE_CHANGED_WILDCARD = '*';
15
16
 
16
17
  export interface InnerHtmlOptions {
18
+ ssrFirst?: boolean;
17
19
  replaceWrap?:{ start: string, end:string},
18
20
  useShadow?: boolean;
19
21
  }
20
-
21
22
  export interface InnerHtmlMetadata {
22
23
  propertyKey: string | symbol;
23
24
  options: InnerHtmlOptions;
24
25
  }
25
26
 
27
+ export interface OnConnectedOptions {
28
+ ssrFirst?: boolean;
29
+ }
30
+ export interface OnConnectedMetadata {
31
+ propertyKey: string | symbol;
32
+ options: OnConnectedOptions;
33
+ }
34
+
35
+
36
+ export function onConnectedBefore(options: OnConnectedOptions): MethodDecorator;
37
+ export function onConnectedBefore(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
38
+ export function onConnectedBefore(arg1?: OnConnectedOptions | Object, arg2?: string | symbol, arg3?: PropertyDescriptor): MethodDecorator | void {
39
+ const decorator = (options: OnConnectedOptions, target: Object, propertyKey: string | symbol) => {
40
+ const constructor = target.constructor;
41
+ let list = ReflectUtils.getMetadata<OnConnectedMetadata[]>(ON_BEFORE_CONNECTED_METADATA_KEY, constructor);
42
+ if (!list) {
43
+ list = [];
44
+ ReflectUtils.defineMetadata(ON_BEFORE_CONNECTED_METADATA_KEY, list, constructor);
45
+ }
46
+ list.push({ propertyKey, options });
47
+ };
48
+
49
+ if (arg2) {
50
+ return decorator({}, arg1!, arg2);
51
+ }
52
+
53
+ return (target: Object, propertyKey: string | symbol) => {
54
+ decorator((arg1 as OnConnectedOptions) || {}, target, propertyKey);
55
+ };
56
+ }
57
+
58
+ export function onConnectedAfter(options: OnConnectedOptions): MethodDecorator;
59
+ export function onConnectedAfter(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
60
+ export function onConnectedAfter(arg1?: OnConnectedOptions | Object, arg2?: string | symbol, arg3?: PropertyDescriptor): MethodDecorator | void {
61
+ const decorator = (options: OnConnectedOptions, target: Object, propertyKey: string | symbol) => {
62
+ const constructor = target.constructor;
63
+ let list = ReflectUtils.getMetadata<OnConnectedMetadata[]>(ON_AFTER_CONNECTED_METADATA_KEY, constructor);
64
+ if (!list) {
65
+ list = [];
66
+ ReflectUtils.defineMetadata(ON_AFTER_CONNECTED_METADATA_KEY, list, constructor);
67
+ }
68
+ list.push({ propertyKey, options });
69
+ };
70
+
71
+ if (arg2) {
72
+ return decorator({}, arg1!, arg2);
73
+ }
74
+
75
+ return (target: Object, propertyKey: string | symbol) => {
76
+ decorator((arg1 as OnConnectedOptions) || {}, target, propertyKey);
77
+ };
78
+ }
79
+
80
+
26
81
  function createLifecycleDecorator(metadataKey: symbol): MethodDecorator {
27
82
  return (target: Object, propertyKey: string | symbol) => {
28
83
  const constructor = target.constructor;
@@ -36,8 +91,8 @@ function createLifecycleDecorator(metadataKey: symbol): MethodDecorator {
36
91
  }
37
92
 
38
93
  export const onInitialize = createLifecycleDecorator(ON_INITIALIZE_METADATA_KEY);
39
- export const onConnectedBefore = createLifecycleDecorator(ON_BEFORE_CONNECTED_METADATA_KEY);
40
- export const onConnectedAfter = createLifecycleDecorator(ON_AFTER_CONNECTED_METADATA_KEY);
94
+ // export const onConnectedBefore = createLifecycleDecorator(ON_BEFORE_CONNECTED_METADATA_KEY);
95
+ // export const onConnectedAfter = createLifecycleDecorator(ON_AFTER_CONNECTED_METADATA_KEY);
41
96
  export const onConnected = onConnectedAfter;
42
97
 
43
98
  export const onDisconnectedBefore = createLifecycleDecorator(ON_BEFORE_DISCONNECTED_METADATA_KEY);
@@ -50,7 +105,8 @@ export const onAdopted = onAdoptedAfter;
50
105
 
51
106
  export const onAddEventListener = createLifecycleDecorator(ON_ADD_EVENT_LISTENER_METADATA_KEY);
52
107
 
53
- // export const onConnectedSwcApp = createLifecycleDecorator(ON_CONNECTED_SWC_APP_METADATA_KEY);
108
+ export const onConnectedSwcApp = createLifecycleDecorator(ON_CONNECTED_SWC_APP_METADATA_KEY);
109
+ export const onConnectedCompleted = createLifecycleDecorator(ON_CONNECTED_COMPLETED_METADATA_KEY);
54
110
 
55
111
  /**
56
112
  * @onConnectedInnerHtml decorator to define the initial HTML content when connected.
@@ -60,10 +116,10 @@ export function onConnectedInnerHtml(target: Object, propertyKey: string | symbo
60
116
  export function onConnectedInnerHtml(arg1?: InnerHtmlOptions | Object, arg2?: string | symbol, arg3?: PropertyDescriptor): MethodDecorator | void {
61
117
  const decorator = (options: InnerHtmlOptions, target: Object, propertyKey: string | symbol) => {
62
118
  const constructor = target.constructor;
63
- let list = ReflectUtils.getMetadata<InnerHtmlMetadata[]>(INNER_HTML_METADATA_KEY, constructor);
119
+ let list = ReflectUtils.getMetadata<InnerHtmlMetadata[]>(ON_CONNECTED_INNER_HTML_METADATA_KEY, constructor);
64
120
  if (!list) {
65
121
  list = [];
66
- ReflectUtils.defineMetadata(INNER_HTML_METADATA_KEY, list, constructor);
122
+ ReflectUtils.defineMetadata(ON_CONNECTED_INNER_HTML_METADATA_KEY, list, constructor);
67
123
  }
68
124
  list.push({ propertyKey, options });
69
125
  };
@@ -80,12 +136,21 @@ export function onConnectedInnerHtml(arg1?: InnerHtmlOptions | Object, arg2?: st
80
136
  /**
81
137
  * 프로토타입 체인을 순회하며 모든 라이프사이클 메서드를 수집합니다.
82
138
  */
83
- export const findAllLifecycleMetadata = <T = (string | symbol)[]>(target: any, metadataKey: symbol): T | undefined => {
139
+ // export const findAllLifecycleMetadata = <T = (string | symbol)[]>(target: any, metadataKey: symbol): T | undefined => {
140
+ export const findAllLifecycleMetadata = (target: any, metadataKey: symbol): (string | symbol)[] => {
84
141
  const results = ReflectUtils.findAllMetadataFlatten(metadataKey, target);
85
- return results.length > 0 ? (results as unknown as T) : undefined;
142
+ return results;
86
143
  };
87
144
 
88
- export const getOnConnectedInnerHtmlMetadata = (target: any): InnerHtmlMetadata[] | undefined => {
145
+ export const getOnConnectedInnerHtmlMetadata = (target: any): InnerHtmlMetadata[] => {
146
+ const constructor = target instanceof Function ? target : target.constructor;
147
+ return ReflectUtils.getMetadata(ON_CONNECTED_INNER_HTML_METADATA_KEY, constructor) ?? [];
148
+ };
149
+ export const getOnConnectedBeforeMetadata = (target: any): OnConnectedMetadata[] => {
150
+ const constructor = target instanceof Function ? target : target.constructor;
151
+ return ReflectUtils.getMetadata(ON_BEFORE_CONNECTED_METADATA_KEY, constructor) ?? [];
152
+ };
153
+ export const getOnConnectedAfterMetadata = (target: any): OnConnectedMetadata[] => {
89
154
  const constructor = target instanceof Function ? target : target.constructor;
90
- return ReflectUtils.getMetadata(INNER_HTML_METADATA_KEY, constructor);
155
+ return ReflectUtils.getMetadata(ON_AFTER_CONNECTED_METADATA_KEY, constructor) ?? [];
91
156
  };
@@ -1,14 +1,28 @@
1
- import {SwcAppEngine, SwcAttributeConfigType, SwcConfigType} from './SwcAppEngine';
2
- import {SwcAppInterface, SwcAppMessage} from '../types';
3
- import {SwcUtils} from '../utils/Utils';
4
- import {debounceTimeIntervalLock, FunctionUtils, Subscription} from '@dooboostore/core';
5
- import {RouterEventType} from '@dooboostore/core-web';
6
- import {getSubscribeSwcAppRouteChangeWhileConnectedMetadata} from '../decorators/subscribeSwcAppRouteChangeWhileConnected';
7
- import {getSubscribeSwcAppMessageWhileConnectedMetadata} from '../decorators/subscribeSwcAppMessageWhileConnected';
8
-
9
- export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base: T) {
10
- //@ts-ignore
11
- return class extends Base implements SwcAppInterface {
1
+ import {SwcAppInterface, SwcAppMessage} from "../types";
2
+ import {elementDefine, findAllLifecycleMetadata, getSubscribeSwcAppMessageWhileConnectedMetadata, getSubscribeSwcAppRouteChangeWhileConnectedMetadata, ON_CONNECTED_SWC_APP_METADATA_KEY} from "../decorators";
3
+ import {SwcAppEngine, SwcAttributeConfigType, SwcConfigType} from "../SwcAppEngine";
4
+ import {debounceTimeIntervalLock, FunctionUtils, Subscription} from "@dooboostore/core";
5
+ import {RouterEventType} from "@dooboostore/core-web";
6
+ import {SwcUtils} from "../utils/Utils";
7
+
8
+ export const isSSR = (i: HTMLElement) => {
9
+ return i.hasAttribute('swc-use-ssr');
10
+ }
11
+ export const setSSRAttribute = (i: HTMLElement) => {
12
+ i.setAttribute('swc-use-ssr', (i as any)._swcId ?? '');
13
+ }
14
+ export const removeSSRAttribute = (i: HTMLElement) => {
15
+ i.removeAttribute('swc-use-ssr');
16
+ }
17
+
18
+
19
+ export const tagName = 'swc-app';
20
+ export default async (w: Window) => {
21
+ const existing = w.customElements.get(tagName);
22
+ if (existing) return existing;
23
+
24
+ @elementDefine(tagName, {window: w})
25
+ class SwcApp extends w.HTMLElement implements SwcAppInterface {
12
26
  __swc_engine = new SwcAppEngine(this as any);
13
27
  _swc_connected_instance = new Set<any>();
14
28
  // _swc_notified_routes = new WeakMap<any, RouterEventType>();
@@ -26,7 +40,7 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
26
40
  이걸사용하는데 is 대응하는거다 그런데 이때 처리되는 순서가 크롬이나 표준에서는 부모부터 만들어지고 자식들이 만들어지는데
27
41
  저 polyfill에서는 자식부터 만들어지고 부모가 만들어진다 is일때 아 .. 이문제때문에 자식이 _connected_safari 에 강제로 자기자식넣어준다
28
42
  */
29
- _connected_safari = [];
43
+ _connected_safari_and_standby = [];
30
44
 
31
45
  get simpleApplication() {
32
46
  return this.__swc_engine.simpleApplication;
@@ -40,22 +54,23 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
40
54
  return this.__swc_engine?.router;
41
55
  }
42
56
 
43
- async _invokeRouteChangeSubscribers(instance: any, re: RouterEventType) {
57
+ async _invokeRouteChangeSubscribers(instance: HTMLElement, re: RouterEventType) {
44
58
  if (instance.isConnected === false) return;
45
59
 
46
60
  this._routeChangeInvocations++;
47
61
 
48
62
  if (this._childrenRouteChangedInterval) {
49
- clearInterval(this._childrenRouteChangedInterval);
63
+ this.config.window.clearInterval(this._childrenRouteChangedInterval);
50
64
  }
65
+ const intervalConfig = {setInterval: this.config.window.setInterval.bind(this.config.window), clearInterval: this.config.window.clearInterval.bind(this.config.window)};
51
66
  this._childrenRouteChangedInterval = debounceTimeIntervalLock(
52
67
  () => this._routeChangeInvocations === 0,
53
68
  () => {
54
69
  this._childrenRouteChangedInterval = null;
55
- this.config.onChildrenRouteChanged(re, this)
70
+ this.config.onChildrenRouteChanged?.(re, this)
56
71
  },
57
72
  this.config?.childrenConnectedDoneCheckIntervalTime ?? 30,
58
- {setInterval: window.setInterval, clearInterval: window.clearInterval}
73
+ intervalConfig
59
74
  // {setInterval: window.setInterval, clearInterval: window.clearInterval}
60
75
  );
61
76
 
@@ -118,28 +133,50 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
118
133
  await Promise.allSettled(ps);
119
134
  }
120
135
  } finally {
121
- this._routeChangeInvocations--;
136
+ if (this.config?.ssr) {
137
+ setSSRAttribute(instance);
138
+ } else {
139
+ removeSSRAttribute(instance);
140
+ }
141
+ this._routeChangeInvocations = Math.max(0, this._routeChangeInvocations - 1);
122
142
  }
123
143
  }
124
144
 
125
- async _connected(instance: any) {
145
+ async _connected(instance: HTMLElement, option?: { noIncrements: boolean }) {
126
146
  if (instance) {
127
- this._connectedInvocations++;
147
+ // console.log('_connected-->', instance.tagName, this._connectedInvocations)
148
+
149
+ if (!this.simpleApplication && !this.config) {
150
+ this._connected_safari_and_standby.push(instance);
151
+ return;
152
+ }
153
+
154
+ this.config.onConnectedChildBefore?.(instance);
155
+ if (!option?.noIncrements) {
156
+ this._connectedInvocations++;
157
+ }
128
158
  this._swc_connected_instance.add(instance);
129
159
 
160
+ const connectedSwcAppCallBacks = findAllLifecycleMetadata(instance, ON_CONNECTED_SWC_APP_METADATA_KEY) ?? [];
161
+ for (let connectedSwcAppCallBack of connectedSwcAppCallBacks) {
162
+ await (instance as any)?._invokeLifecycleMethod?.(connectedSwcAppCallBack);
163
+ }
164
+
130
165
  if (this._childrenConnectedDoneInterval) {
131
- clearInterval(this._childrenConnectedDoneInterval);
166
+ this.config.window.clearInterval(this._childrenConnectedDoneInterval);
132
167
  }
168
+ const intervalConfig = {setInterval: this.config.window.setInterval.bind(this.config.window), clearInterval: this.config.window.clearInterval.bind(this.config.window)};
133
169
  this._childrenConnectedDoneInterval = debounceTimeIntervalLock(
134
170
  () => this._connectedInvocations === 0,
135
171
  () => {
136
172
  this._childrenConnectedDoneInterval = null;
137
- this.config.onChildrenConnectedDone(this)
173
+ this.config.onChildrenConnectedDone?.(this)
138
174
  },
139
175
  this.config?.childrenConnectedDoneCheckIntervalTime ?? 30,
140
- {setInterval: window.setInterval, clearInterval: window.clearInterval}
176
+ intervalConfig
141
177
  );
142
178
 
179
+ // console.log('onChildConnectedDone-->')
143
180
 
144
181
  if (this.simpleApplication) {
145
182
  try {
@@ -152,14 +189,25 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
152
189
  throw e;
153
190
  }
154
191
  }
192
+
193
+ if (this.config?.ssr) {
194
+ setSSRAttribute(instance);
195
+ } else {
196
+ removeSSRAttribute(instance);
197
+ }
155
198
  }
199
+
200
+
201
+ this.config.onConnectedChildAfter?.(instance);
202
+ return this;
156
203
  }
157
204
 
158
205
  async _connectedDone(instance: any) {
159
206
  try {
160
207
  // 내부 연결 처리 로직이 있다면 여기에 추가
208
+ // console.log('_connectedDone-->', instance, this._connectedInvocations)
161
209
  } finally {
162
- this._connectedInvocations--;
210
+ this._connectedInvocations = Math.max(0, this._connectedInvocations - 1);
163
211
  }
164
212
  }
165
213
 
@@ -167,6 +215,7 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
167
215
  // console.log('_disconnected', instance);
168
216
  if (instance) {
169
217
  this._swc_connected_instance.delete(instance);
218
+ this.config?.onDisconnectedChildAfter?.(instance);
170
219
  // this._swc_notified_routes.delete(instance);
171
220
  }
172
221
  }
@@ -184,6 +233,7 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
184
233
  }
185
234
 
186
235
  async connect(config?: SwcAttributeConfigType) {
236
+ console.log('[SWC] connect')
187
237
  const swcConfig = {
188
238
  routeType: 'element',
189
239
  window: config?.window,
@@ -192,9 +242,9 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
192
242
 
193
243
  const mode = config?.connectMode || 'direct';
194
244
 
195
- if (mode === 'direct') {
245
+ if (mode === 'direct' || mode === 'hydrate') {
246
+ this.setAttribute('swc-connect-mode', mode);
196
247
  await this.__swc_engine.connect(swcConfig);
197
- this.setAttribute('swc-connect-mode', 'direct');
198
248
  } else if (mode === 'swap' || mode === 'clear-swap') {
199
249
  if (!this.parentNode) {
200
250
  // 부모가 없으면 swap을 할 수 없으므로 direct로 폴백합니다.
@@ -233,9 +283,9 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
233
283
  }
234
284
 
235
285
  // 사파리일떄 예외이다 is 일때 polyfill되는데 이떄 부모부터 만들어지는게 아니라 자식부터 만들어진다 그래서 부모가 만들어질때 자식들이 이미 만들어져있어서 부모가 자식들을 등록해주는 형태로 강제로 등록해준다
236
- this._connected_safari.forEach((instance: any) => {
286
+ this._connected_safari_and_standby.forEach((instance: any) => {
237
287
  // console.log('safari!!!!!!!!!!', instance)
238
- this._connected(instance);
288
+ this._connected(instance, {noIncrements: true});
239
289
  // this._swc_connected_instance.add(instance);
240
290
  });
241
291
  // Invoke @onConnectedSwcApp lifecycle methods on all connected component instances
@@ -253,7 +303,7 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
253
303
  const config = this.__swc_engine.config;
254
304
 
255
305
  this._routerSubscription = this.router.observable.subscribe(async (route: RouterEventType) => {
256
- // console.log('[SWC] Router event received:', route.triggerPoint);
306
+ console.log('[SWC] Router event received:', route.triggerPoint);
257
307
  if (route.triggerPoint === 'end') {
258
308
  // 1. 모든 기존 연결된 자식들에게 라우트 이벤트 알림
259
309
  await this._handleRouteChange(route);
@@ -262,8 +312,8 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
262
312
 
263
313
  // Navigate to initial path if specified
264
314
  if (config?.path) {
265
- // console.log('[DEBUG] Navigating to initial path:', config.path);
266
- this.router.go(config.path);
315
+ console.log('[DEBUG] Navigating to initial path:', config.path);
316
+ // this.router.go(config.path);
267
317
  }
268
318
  }
269
319
  }
@@ -306,7 +356,10 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
306
356
  }
307
357
  }
308
358
 
359
+ // 자기자신은 apphost로 포함이 도지않으니(부모) 내자신은 self로 넣는다
360
+ this._connected(this);
309
361
  this.__swc_engine?.config?.onConnected?.(this);
362
+ this._connectedDone(this);
310
363
  }
311
364
 
312
365
  disconnectedCallback() {
@@ -317,6 +370,7 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
317
370
  this._lastRouterEvent = undefined;
318
371
  this.__swc_engine.disconnect();
319
372
  this.__swc_engine?.config?.onDisconnected?.(this);
373
+ this._disconnected(this);
320
374
  }
321
375
 
322
376
  async routing(path: string) {
@@ -335,6 +389,14 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
335
389
  this.router?.reload();
336
390
  }
337
391
 
392
+ // async completedSwcApp() {
393
+ // const ss = Array.from(this._swc_connected_instance).flatMap((it) => {
394
+ // const ms = findAllLifecycleMetadata(it, ON_CONNECTED_COMPLETED_SWC_APP_METADATA_KEY) ?? [];
395
+ // return ms.map((sit) => it[sit](this));
396
+ // });
397
+ // await Promise.allSettled(ss);
398
+ // }
399
+
338
400
  publishMessage(message: SwcAppMessage): void {
339
401
  // 메시지를 모든 connected component instances로 분배
340
402
  this._swc_connected_instance.forEach((instance: any) => {
@@ -373,4 +435,9 @@ export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base
373
435
  }
374
436
  }
375
437
  };
376
- }
438
+
439
+
440
+ return w.customElements.whenDefined(tagName);
441
+
442
+
443
+ }
@@ -1 +1,11 @@
1
- export * from './register';
1
+ // export * from './tt/register';
2
+ import swcAppFactory from './SwcApp'
3
+ // import swcAsyncFactory from './SwcAsync'
4
+ // import swcLoopFactory from './SwcLoop'
5
+ // import swcIfFactory from './SwcIf'
6
+ export const registerSwcApp = swcAppFactory;
7
+ // export const registerSwcAsync = swcAsyncFactory;
8
+ // export const registerSwcLoop = swcLoopFactory;
9
+ // export const registerSwcIf = swcIfFactory;
10
+
11
+ export const register = [swcAppFactory];
@@ -0,0 +1,13 @@
1
+ // import {SwcAppEngine, SwcAttributeConfigType, SwcConfigType} from '../../SwcAppEngine';
2
+ // import {SwcAppInterface, SwcAppMessage} from '../../types';
3
+ // import {SwcUtils} from '../../utils/Utils';
4
+ // import {debounceTimeIntervalLock, FunctionUtils, Subscription} from '@dooboostore/core';
5
+ // import {RouterEventType} from '@dooboostore/core-web';
6
+ // import {getSubscribeSwcAppRouteChangeWhileConnectedMetadata} from '../../decorators/subscribeSwcAppRouteChangeWhileConnected';
7
+ // import {getSubscribeSwcAppMessageWhileConnectedMetadata} from '../../decorators/subscribeSwcAppMessageWhileConnected';
8
+ // import {findAllLifecycleMetadata, ON_CONNECTED_COMPLETED_SWC_APP_METADATA_KEY, ON_CONNECTED_INNER_HTML_METADATA_KEY, ON_CONNECTED_SWC_APP_METADATA_KEY} from "../../decorators";
9
+ //
10
+ // export function SwcAppMixin<T extends { new(...args: any[]): HTMLElement }>(Base: T) {
11
+ // //@ts-ignore
12
+ // return
13
+ // }
@@ -0,0 +1,139 @@
1
+ // import {SwcUtils} from '../../utils/Utils';
2
+ // import {ActionExpression, FunctionUtils} from '@dooboostore/core';
3
+ // import {ConvertUtils} from '@dooboostore/core-web';
4
+ // import {elementDefine} from "../../decorators";
5
+ //
6
+ // export default async (w: Window) => {
7
+ // const tagName = 'swc-async';
8
+ // const existing = w.customElements.get(tagName);
9
+ // if (existing) return existing;
10
+ //
11
+ // @elementDefine(tagName, { window: w })
12
+ // class SwcAsync extends w.HTMLElement {
13
+ // private _value: any;
14
+ // private _replaceWrapStart: string | null = null;
15
+ // private _replaceWrapEnd: string | null = null;
16
+ // private _nodes: Node[] = [];
17
+ // resultValue?: any;
18
+ //
19
+ // static get observedAttributes() {
20
+ // return ['value', 'replace-wrap-start', 'replace-wrap-end'];
21
+ // }
22
+ //
23
+ // get value(): boolean {
24
+ // return this._value;
25
+ // }
26
+ //
27
+ // set value(nv: any) {
28
+ // this.executeAsync(nv);
29
+ // }
30
+ //
31
+ // connectedCallback() {
32
+ // if (this.hasAttribute('value')) {
33
+ // this.executeAsync(this._value);
34
+ // }
35
+ // }
36
+ //
37
+ // attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
38
+ // switch (name) {
39
+ // case 'value':
40
+ // this._value = newValue;
41
+ // this.executeAsync(this._value);
42
+ // break;
43
+ // case 'replace-wrap-start':
44
+ // this._replaceWrapStart = newValue;
45
+ // break;
46
+ // case 'replace-wrap-end':
47
+ // this._replaceWrapEnd = newValue;
48
+ // break;
49
+ // }
50
+ // }
51
+ //
52
+ // private executeAsync(result: any = this._value) {
53
+ // if (result === undefined || result === null) {
54
+ // this.refresh('default');
55
+ // return;
56
+ // }
57
+ // if (result instanceof Promise) {
58
+ // this.refresh('loading');
59
+ // result
60
+ // .then(v => {
61
+ // this.resultValue = v;
62
+ // this.refresh('success');
63
+ // })
64
+ // .catch(e => {
65
+ // console.error('[SWC-ASYNC] Promise rejected:', e);
66
+ // this.resultValue = e;
67
+ // this.refresh('error');
68
+ // });
69
+ // } else {
70
+ // this.resultValue = result;
71
+ // this.refresh('success');
72
+ // }
73
+ // }
74
+ //
75
+ // private replaceExpressions(html: string, groupArgs: any, context: any, wrap: { start: string, end: string }): string {
76
+ // let config: any = undefined;
77
+ // if (wrap) {
78
+ // config = {
79
+ // expression: {
80
+ // replace: {start: `${wrap.start}`, end: `${wrap.end}`},
81
+ // callReturn: {start: `${wrap.start}=`, end: `${wrap.end}`},
82
+ // call: {start: `${wrap.start}@`, end: `${wrap.end}`}
83
+ // }
84
+ // };
85
+ // }
86
+ // const ae = new ActionExpression(html, config);
87
+ // const win = this.ownerDocument?.defaultView || window;
88
+ // for (const expr of ae.getExpressions('replace')) {
89
+ // try {
90
+ // const value = FunctionUtils.executeReturn({
91
+ // script: ConvertUtils.decodeHtmlEntity(expr.script, win.document),
92
+ // context,
93
+ // args: groupArgs
94
+ // });
95
+ // ae.replace(expr, String(value));
96
+ // } catch (e) {
97
+ // console.error(`[SWC] Failed to execute ${expr.original}:`, e);
98
+ // }
99
+ // }
100
+ // return ae.getUnprocessedTemplate();
101
+ // }
102
+ //
103
+ // refresh(state: string = 'default') {
104
+ // this.cleanup();
105
+ // const portal = SwcUtils.getParentContainer(this);
106
+ // if (!portal) return;
107
+ // const win = this.ownerDocument?.defaultView || window;
108
+ // const helperSet = SwcUtils.getHelperAndHostSet(win, this);
109
+ // // HTMLElement에서는 children에서 template[is=swc-...] 찾기
110
+ // const t = Array.from(this.children).find(
111
+ // (el): el is HTMLTemplateElement => el.tagName === 'TEMPLATE' && el.getAttribute('is') === `swc-${state}`
112
+ // );
113
+ // if (t) {
114
+ // let htmlString = t.innerHTML;
115
+ // const groupArgs = {...helperSet, $value: this._value, $state: state, $templateHost: this};
116
+ // htmlString = this.replaceExpressions(htmlString, groupArgs, this, {start: this._replaceWrapStart ?? '{#{', end: this._replaceWrapEnd ?? '}#}'});
117
+ // const temp = this.ownerDocument?.createElement('template') || document.createElement('template');
118
+ // temp.innerHTML = htmlString;
119
+ // const content = temp.content;
120
+ // this._nodes = Array.from(content.childNodes);
121
+ // this._nodes.forEach((node: any) => {
122
+ // if (node instanceof HTMLElement) (node as any).__template_swc_host = this;
123
+ // });
124
+ // portal.insertBefore(content, this.nextSibling);
125
+ // }
126
+ // }
127
+ //
128
+ // private cleanup() {
129
+ // this._nodes.forEach(n => n.parentElement?.removeChild(n));
130
+ // this._nodes = [];
131
+ // }
132
+ //
133
+ // disconnectedCallback() {
134
+ // this.cleanup();
135
+ // }
136
+ // }
137
+ //
138
+ // return w.customElements.whenDefined(tagName);
139
+ // }