@dooboostore/simple-web-component 1.0.33 → 1.0.35

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 (150) hide show
  1. package/README.md +23 -30
  2. package/dist/cjs/decorators/addEventListener.js.map +1 -1
  3. package/dist/cjs/decorators/applyAttribute.js +67 -57
  4. package/dist/cjs/decorators/applyAttribute.js.map +2 -2
  5. package/dist/cjs/decorators/applyClass.js +80 -70
  6. package/dist/cjs/decorators/applyClass.js.map +2 -2
  7. package/dist/cjs/decorators/applyNode.js +5 -8
  8. package/dist/cjs/decorators/applyNode.js.map +2 -2
  9. package/dist/cjs/decorators/applyStyle.js +66 -56
  10. package/dist/cjs/decorators/applyStyle.js.map +2 -2
  11. package/dist/cjs/decorators/attribute.js +35 -29
  12. package/dist/cjs/decorators/attribute.js.map +2 -2
  13. package/dist/cjs/decorators/changedAttributeHost.js +32 -12
  14. package/dist/cjs/decorators/changedAttributeHost.js.map +2 -2
  15. package/dist/cjs/decorators/elementDefine.js +238 -180
  16. package/dist/cjs/decorators/elementDefine.js.map +2 -2
  17. package/dist/cjs/decorators/emitCustomEvent.js +67 -48
  18. package/dist/cjs/decorators/emitCustomEvent.js.map +2 -2
  19. package/dist/cjs/decorators/lifecycles.js +15 -17
  20. package/dist/cjs/decorators/lifecycles.js.map +2 -2
  21. package/dist/cjs/decorators/setProperty.js +50 -39
  22. package/dist/cjs/decorators/setProperty.js.map +2 -2
  23. package/dist/cjs/decorators/subscribeSwcAppMessageWhileConnected.js.map +1 -1
  24. package/dist/cjs/decorators/subscribeSwcAppRouteChangeWhileConnected.js +2 -2
  25. package/dist/cjs/decorators/subscribeSwcAppRouteChangeWhileConnected.js.map +2 -2
  26. package/dist/cjs/elements/SwcAppEngine.js +14 -8
  27. package/dist/cjs/elements/SwcAppEngine.js.map +3 -3
  28. package/dist/cjs/elements/SwcAppMixin.js +154 -81
  29. package/dist/cjs/elements/SwcAppMixin.js.map +2 -2
  30. package/dist/cjs/elements/SwcAsync.js +28 -18
  31. package/dist/cjs/elements/SwcAsync.js.map +2 -2
  32. package/dist/cjs/elements/SwcChoose.js +68 -45
  33. package/dist/cjs/elements/SwcChoose.js.map +2 -2
  34. package/dist/cjs/elements/SwcIf.js +52 -30
  35. package/dist/cjs/elements/SwcIf.js.map +2 -2
  36. package/dist/cjs/elements/SwcLoop.js +109 -35
  37. package/dist/cjs/elements/SwcLoop.js.map +2 -2
  38. package/dist/cjs/elements/register.js +263 -131
  39. package/dist/cjs/elements/register.js.map +2 -2
  40. package/dist/cjs/router/ElementRouter.js +4 -2
  41. package/dist/cjs/router/ElementRouter.js.map +1 -1
  42. package/dist/cjs/types.js.map +1 -1
  43. package/dist/cjs/utils/Utils.js +25 -7
  44. package/dist/cjs/utils/Utils.js.map +2 -2
  45. package/dist/esm/decorators/addEventListener.js.map +1 -1
  46. package/dist/esm/decorators/applyAttribute.js +67 -57
  47. package/dist/esm/decorators/applyAttribute.js.map +2 -2
  48. package/dist/esm/decorators/applyClass.js +80 -70
  49. package/dist/esm/decorators/applyClass.js.map +2 -2
  50. package/dist/esm/decorators/applyNode.js +5 -8
  51. package/dist/esm/decorators/applyNode.js.map +2 -2
  52. package/dist/esm/decorators/applyStyle.js +66 -56
  53. package/dist/esm/decorators/applyStyle.js.map +2 -2
  54. package/dist/esm/decorators/attribute.js +35 -29
  55. package/dist/esm/decorators/attribute.js.map +2 -2
  56. package/dist/esm/decorators/changedAttributeHost.js +32 -12
  57. package/dist/esm/decorators/changedAttributeHost.js.map +2 -2
  58. package/dist/esm/decorators/elementDefine.js +240 -182
  59. package/dist/esm/decorators/elementDefine.js.map +2 -2
  60. package/dist/esm/decorators/emitCustomEvent.js +67 -48
  61. package/dist/esm/decorators/emitCustomEvent.js.map +2 -2
  62. package/dist/esm/decorators/lifecycles.js +15 -17
  63. package/dist/esm/decorators/lifecycles.js.map +2 -2
  64. package/dist/esm/decorators/setProperty.js +50 -39
  65. package/dist/esm/decorators/setProperty.js.map +2 -2
  66. package/dist/esm/decorators/subscribeSwcAppMessageWhileConnected.js.map +1 -1
  67. package/dist/esm/decorators/subscribeSwcAppRouteChangeWhileConnected.js +2 -2
  68. package/dist/esm/decorators/subscribeSwcAppRouteChangeWhileConnected.js.map +2 -2
  69. package/dist/esm/elements/SwcAppEngine.js +14 -7
  70. package/dist/esm/elements/SwcAppEngine.js.map +2 -2
  71. package/dist/esm/elements/SwcAppMixin.js +156 -82
  72. package/dist/esm/elements/SwcAppMixin.js.map +2 -2
  73. package/dist/esm/elements/SwcAsync.js +28 -18
  74. package/dist/esm/elements/SwcAsync.js.map +2 -2
  75. package/dist/esm/elements/SwcChoose.js +69 -46
  76. package/dist/esm/elements/SwcChoose.js.map +2 -2
  77. package/dist/esm/elements/SwcIf.js +53 -31
  78. package/dist/esm/elements/SwcIf.js.map +2 -2
  79. package/dist/esm/elements/SwcLoop.js +110 -36
  80. package/dist/esm/elements/SwcLoop.js.map +2 -2
  81. package/dist/esm/elements/register.js +264 -132
  82. package/dist/esm/elements/register.js.map +2 -2
  83. package/dist/esm/router/ElementRouter.js +5 -2
  84. package/dist/esm/router/ElementRouter.js.map +1 -1
  85. package/dist/esm/types.js.map +1 -1
  86. package/dist/esm/utils/Utils.js +25 -7
  87. package/dist/esm/utils/Utils.js.map +2 -2
  88. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +728 -595
  89. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  90. package/dist/types/decorators/addEventListener.d.ts +4 -1
  91. package/dist/types/decorators/addEventListener.d.ts.map +1 -1
  92. package/dist/types/decorators/applyAttribute.d.ts +5 -1
  93. package/dist/types/decorators/applyAttribute.d.ts.map +1 -1
  94. package/dist/types/decorators/applyClass.d.ts +4 -0
  95. package/dist/types/decorators/applyClass.d.ts.map +1 -1
  96. package/dist/types/decorators/applyNode.d.ts +5 -1
  97. package/dist/types/decorators/applyNode.d.ts.map +1 -1
  98. package/dist/types/decorators/applyStyle.d.ts +5 -1
  99. package/dist/types/decorators/applyStyle.d.ts.map +1 -1
  100. package/dist/types/decorators/attribute.d.ts +5 -0
  101. package/dist/types/decorators/attribute.d.ts.map +1 -1
  102. package/dist/types/decorators/changedAttributeHost.d.ts +14 -3
  103. package/dist/types/decorators/changedAttributeHost.d.ts.map +1 -1
  104. package/dist/types/decorators/elementDefine.d.ts +1 -1
  105. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  106. package/dist/types/decorators/emitCustomEvent.d.ts +15 -7
  107. package/dist/types/decorators/emitCustomEvent.d.ts.map +1 -1
  108. package/dist/types/decorators/lifecycles.d.ts +10 -7
  109. package/dist/types/decorators/lifecycles.d.ts.map +1 -1
  110. package/dist/types/decorators/setProperty.d.ts +5 -1
  111. package/dist/types/decorators/setProperty.d.ts.map +1 -1
  112. package/dist/types/decorators/subscribeSwcAppMessageWhileConnected.d.ts +2 -2
  113. package/dist/types/decorators/subscribeSwcAppMessageWhileConnected.d.ts.map +1 -1
  114. package/dist/types/decorators/subscribeSwcAppRouteChangeWhileConnected.d.ts +5 -6
  115. package/dist/types/decorators/subscribeSwcAppRouteChangeWhileConnected.d.ts.map +1 -1
  116. package/dist/types/elements/SwcAppEngine.d.ts +9 -3
  117. package/dist/types/elements/SwcAppEngine.d.ts.map +1 -1
  118. package/dist/types/elements/SwcAppMixin.d.ts +12 -7
  119. package/dist/types/elements/SwcAppMixin.d.ts.map +1 -1
  120. package/dist/types/elements/register.d.ts.map +1 -1
  121. package/dist/types/types.d.ts +1 -0
  122. package/dist/types/types.d.ts.map +1 -1
  123. package/dist/types/utils/Utils.d.ts +4 -1
  124. package/dist/types/utils/Utils.d.ts.map +1 -1
  125. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +728 -595
  126. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  127. package/package.json +5 -5
  128. package/src/decorators/addEventListener.ts +1 -1
  129. package/src/decorators/applyAttribute.ts +74 -61
  130. package/src/decorators/applyClass.ts +91 -77
  131. package/src/decorators/applyNode.ts +16 -13
  132. package/src/decorators/applyStyle.ts +75 -61
  133. package/src/decorators/attribute.ts +55 -43
  134. package/src/decorators/changedAttributeHost.ts +49 -15
  135. package/src/decorators/elementDefine.ts +401 -340
  136. package/src/decorators/emitCustomEvent.ts +92 -62
  137. package/src/decorators/lifecycles.ts +11 -10
  138. package/src/decorators/setProperty.ts +58 -44
  139. package/src/decorators/subscribeSwcAppMessageWhileConnected.ts +2 -2
  140. package/src/decorators/subscribeSwcAppRouteChangeWhileConnected.ts +11 -11
  141. package/src/elements/SwcAppEngine.ts +19 -13
  142. package/src/elements/SwcAppMixin.ts +214 -102
  143. package/src/elements/SwcAsync.ts +28 -17
  144. package/src/elements/SwcChoose.ts +94 -36
  145. package/src/elements/SwcIf.ts +59 -22
  146. package/src/elements/SwcLoop.ts +140 -27
  147. package/src/elements/register.ts +319 -100
  148. package/src/types.ts +1 -0
  149. package/src/utils/Utils.ts +38 -10
  150. package/tsconfig.json +2 -2
@@ -1,7 +1,7 @@
1
- import {ReflectUtils, FunctionUtils, ActionExpression} from '@dooboostore/core';
2
- import {ensureInit, getElementConfig} from './elementDefine';
3
- import {SwcUtils} from '../utils/Utils';
4
- import {SpecialSelector, SwcQueryOptions} from '../types';
1
+ import { ReflectUtils, FunctionUtils, ActionExpression } from '@dooboostore/core';
2
+ import { ensureInit, getElementConfig } from './elementDefine';
3
+ import { SwcUtils } from '../utils/Utils';
4
+ import { SpecialSelector, SwcQueryOptions } from '../types';
5
5
  import { ConvertUtils } from '@dooboostore/core-web';
6
6
  export interface AttributeFieldOptions extends SwcQueryOptions {
7
7
  name?: string;
@@ -25,6 +25,44 @@ const convertValue = (val: string | null, type: any): any => {
25
25
  return val;
26
26
  };
27
27
 
28
+ export { convertValue };
29
+
30
+ export const getAttributeValue = (inst: any, attrName: string, options?: AttributeFieldOptions & { selector?: string }): any => {
31
+ const conf = getElementConfig(inst);
32
+ const currentWin = inst._resolveWindow?.(conf) || ((typeof window !== 'undefined' ? window : undefined) as any);
33
+
34
+ // If selector is not provided, use inst itself
35
+ const targets = options?.selector ? resolveTargetEls(inst, options.selector, options, currentWin) : [inst];
36
+
37
+ const primaryTarget = targets[0];
38
+
39
+ if (primaryTarget && typeof (primaryTarget as any).hasAttribute === 'function' && (primaryTarget as any).hasAttribute(attrName)) {
40
+ let domVal = (primaryTarget as any).getAttribute(attrName);
41
+
42
+ // 표현식 체크
43
+ const ae = new ActionExpression(domVal);
44
+ const expr = ae.getFirstExpression('callReturn');
45
+ if (expr) {
46
+ try {
47
+ const result = FunctionUtils.executeReturn({
48
+ script: ConvertUtils.decodeHtmlEntity(expr.script, currentWin.document),
49
+ context: inst,
50
+ args: SwcUtils.getHelperAndHostSet(currentWin, inst)
51
+ });
52
+ return convertValue(result, options?.type);
53
+ } catch (e) {
54
+ console.error(`[SWC] Failed to execute directive {{= ${expr.script} }}:`, e);
55
+ return convertValue(domVal, options?.type);
56
+ }
57
+ }
58
+
59
+ return convertValue(domVal, options?.type);
60
+ }
61
+
62
+ // If no target found, return null
63
+ return null;
64
+ };
65
+
28
66
  export const resolveTargetEls = (inst: any, selector: string, options: AttributeFieldOptions, currentWin: any): HTMLElement[] => {
29
67
  const r = options.root || 'auto';
30
68
  const results: HTMLElement[] = [];
@@ -89,7 +127,7 @@ export function attribute(selector: string, options: AttributeFieldOptions = {})
89
127
  metaList = [];
90
128
  ReflectUtils.defineMetadata(ATTRIBUTE_FIELD_METADATA_KEY, metaList, constructor);
91
129
  }
92
- metaList.push({propertyKey, selector, options, privateKey});
130
+ metaList.push({ propertyKey, selector, options, privateKey });
93
131
 
94
132
  const applySetAttribute = (inst: any, targets: HTMLElement[], attrName: string, nv: any) => {
95
133
  targets.forEach(it => {
@@ -111,45 +149,20 @@ export function attribute(selector: string, options: AttributeFieldOptions = {})
111
149
  // delete target[propertyKey];
112
150
 
113
151
  // const defineTarget = target instanceof Function ? target : (target as any).constructor;
114
-
152
+
115
153
  Object.defineProperty(target, propertyKey, {
116
154
  get(this: any) {
117
155
  const attrName = options.name || String(propertyKey);
118
- const conf = getElementConfig(this);
119
- const currentWin = this._resolveWindow?.(conf) || ((typeof window !== 'undefined' ? window : undefined) as any);
120
- const targetType = options.type || designType;
121
156
 
122
- const targets = resolveTargetEls(this, selector, options, currentWin);
123
- const primaryTarget = targets[0];
124
-
125
- if (primaryTarget && typeof (primaryTarget as any).hasAttribute === 'function') {
126
- if ((primaryTarget as any).hasAttribute(attrName)) {
127
- let domVal = (primaryTarget as any).getAttribute(attrName);
128
-
129
- // 표현식 체크
130
- const ae = new ActionExpression(domVal);
131
- const expr = ae.getFirstExpression('call-return');
132
- if (expr) {
133
- try {
134
- const result = FunctionUtils.executeReturn({
135
- script: ConvertUtils.decodeHtmlEntity(expr.script, currentWin.document),
136
- context: this,
137
- args: SwcUtils.getHelperAndHostSet(currentWin, this)
138
- });
139
- return convertValue(result, targetType);
140
- } catch (e) {
141
- console.error(`[SWC] Failed to execute directive {{= ${expr.script} }}:`, e);
142
- return convertValue(domVal, targetType);
143
- }
144
- }
145
-
146
- return convertValue(domVal, targetType);
147
- }
148
- return null;
149
- }
157
+ // Merge designType fallback into options once
158
+ const mergedOptions = {
159
+ ...options,
160
+ selector,
161
+ type: options.type || designType
162
+ };
150
163
 
151
- const data = convertValue(this[privateKey], targetType);
152
- return data;
164
+ const result = getAttributeValue(this, attrName, mergedOptions);
165
+ return result !== null ? result : this[privateKey];
153
166
  },
154
167
  set(this: any, nv: any) {
155
168
  // this[propertyKey] = nv;
@@ -158,7 +171,6 @@ export function attribute(selector: string, options: AttributeFieldOptions = {})
158
171
  const conf = getElementConfig(this);
159
172
  const currentWin = this._resolveWindow?.(conf) || ((typeof window !== 'undefined' ? window : undefined) as any);
160
173
 
161
-
162
174
  // if (!this.__swc_connected) {
163
175
  // this[privateKey] = nv;
164
176
  // return;
@@ -170,9 +182,9 @@ export function attribute(selector: string, options: AttributeFieldOptions = {})
170
182
  enumerable: true,
171
183
  configurable: true
172
184
  });
173
- } catch (err) {
174
- console.error('[SWC] defineProperty error:', err);
175
- }
185
+ } catch (err) {
186
+ console.error('[SWC] defineProperty error:', err);
187
+ }
176
188
  };
177
189
  }
178
190
 
@@ -1,35 +1,69 @@
1
- import {ReflectUtils} from '@dooboostore/core';
1
+ import { ReflectUtils } from '@dooboostore/core';
2
2
 
3
3
  export const ON_ATTRIBUTE_CHANGED_METADATA_KEY = Symbol.for('simple-web-component:on-attribute-changed');
4
4
 
5
+ export interface ChangedAttributeHostOptions {
6
+ type?: typeof Number | typeof Boolean | typeof String;
7
+ while?: 'connected';
8
+ }
9
+
10
+ export interface ChangedAttributeHostMetadata {
11
+ attributeName: string;
12
+ propertyKey: string | symbol;
13
+ options: ChangedAttributeHostOptions;
14
+ }
15
+
16
+ const convertValue = (val: any, type: any): any => {
17
+ if (val === null || val === undefined) return val;
18
+ if (type === Number) return Number(val);
19
+ if (type === Boolean) return val === 'false' || val === '0' ? false : true;
20
+ return val;
21
+ };
22
+
5
23
  /**
6
24
  * @changedAttributeHost decorator - fires when any attribute on :host changes
7
25
  * Usage: @changedAttributeHost('data-product-id')
26
+ * @changedAttributeHost('count', { type: Number })
8
27
  */
9
- export function changedAttributeHost(attributeName?: string): MethodDecorator {
28
+ export function changedAttributeHost(attributeName?: string, options: ChangedAttributeHostOptions = {}): MethodDecorator {
10
29
  return (target: Object, propertyKey: string | symbol) => {
11
30
  const constructor = target.constructor;
12
- let meta = ReflectUtils.getOwnMetadata(ON_ATTRIBUTE_CHANGED_METADATA_KEY, constructor) as Map<string, (string | symbol)[]>;
13
- if (!meta) {
14
- meta = new Map<string, (string | symbol)[]>();
15
- ReflectUtils.defineMetadata(ON_ATTRIBUTE_CHANGED_METADATA_KEY, meta, constructor);
31
+ let metaList = ReflectUtils.getOwnMetadata(ON_ATTRIBUTE_CHANGED_METADATA_KEY, constructor) as ChangedAttributeHostMetadata[];
32
+ if (!metaList) {
33
+ metaList = [];
34
+ ReflectUtils.defineMetadata(ON_ATTRIBUTE_CHANGED_METADATA_KEY, metaList, constructor);
16
35
  }
17
36
 
18
37
  const name = attributeName || String(propertyKey);
19
- let methods = meta.get(name);
20
- if (!methods) {
21
- methods = [];
22
- meta.set(name, methods);
23
- }
24
- if (!methods.includes(propertyKey)) methods.push(propertyKey);
38
+ metaList.push({
39
+ attributeName: name,
40
+ propertyKey,
41
+ options
42
+ });
25
43
  };
26
44
  }
27
45
 
28
- export const getChangedAttributeMetadata = (target: any): Map<string, (string | symbol)[]> | undefined => {
46
+ export const getChangedAttributeMetadata = (target: any): ChangedAttributeHostMetadata[] | undefined => {
29
47
  const constructor = target instanceof Function ? target : target.constructor;
30
48
  return ReflectUtils.getMetadata(ON_ATTRIBUTE_CHANGED_METADATA_KEY, constructor);
31
49
  };
32
50
 
33
- export const findAllAttributeChangedMetadata = (target: any): Map<string, (string | symbol)[]> => {
34
- return ReflectUtils.findAllMapMetadata<string, string | symbol>(ON_ATTRIBUTE_CHANGED_METADATA_KEY, target);
51
+ export const findAllAttributeChangedMetadata = (target: any): Map<string, ChangedAttributeHostMetadata[]> => {
52
+ const constructor = target instanceof Function ? target : target.constructor;
53
+ const metaList = ReflectUtils.findAllMetadata<ChangedAttributeHostMetadata[]>(ON_ATTRIBUTE_CHANGED_METADATA_KEY, constructor) || [];
54
+
55
+ const result = new Map<string, ChangedAttributeHostMetadata[]>();
56
+ metaList.forEach(meta => {
57
+ meta.forEach(item => {
58
+ if (!result.has(item.attributeName)) {
59
+ result.set(item.attributeName, []);
60
+ }
61
+ result.get(item.attributeName)!.push(item);
62
+ });
63
+ });
64
+ return result;
65
+ };
66
+
67
+ export const convertAttributeValue = (val: any, type?: typeof Number | typeof Boolean | typeof String): any => {
68
+ return convertValue(val, type);
35
69
  };