@dooboostore/simple-web-component 1.0.31 → 1.0.33

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 (100) hide show
  1. package/README.md +280 -43
  2. package/dist/cjs/decorators/applyStyle.js +1 -1
  3. package/dist/cjs/decorators/applyStyle.js.map +2 -2
  4. package/dist/cjs/decorators/attribute.js +17 -1
  5. package/dist/cjs/decorators/attribute.js.map +2 -2
  6. package/dist/cjs/decorators/elementDefine.js +27 -10
  7. package/dist/cjs/decorators/elementDefine.js.map +3 -3
  8. package/dist/cjs/decorators/index.js +3 -1
  9. package/dist/cjs/decorators/index.js.map +2 -2
  10. package/dist/cjs/decorators/publishSwcAppMessage.js +86 -0
  11. package/dist/cjs/decorators/publishSwcAppMessage.js.map +7 -0
  12. package/dist/cjs/decorators/subscribeSwcAppMessageWhileConnected.js +62 -0
  13. package/dist/cjs/decorators/subscribeSwcAppMessageWhileConnected.js.map +7 -0
  14. package/dist/cjs/decorators/{subscribeSwcAppRouteChange.js → subscribeSwcAppRouteChangeWhileConnected.js} +16 -16
  15. package/dist/cjs/decorators/subscribeSwcAppRouteChangeWhileConnected.js.map +7 -0
  16. package/dist/cjs/elements/SwcAppMixin.js +32 -3
  17. package/dist/cjs/elements/SwcAppMixin.js.map +2 -2
  18. package/dist/cjs/elements/SwcAsync.js +69 -57
  19. package/dist/cjs/elements/SwcAsync.js.map +2 -2
  20. package/dist/cjs/elements/SwcChoose.js +66 -60
  21. package/dist/cjs/elements/SwcChoose.js.map +2 -2
  22. package/dist/cjs/elements/SwcIf.js +51 -66
  23. package/dist/cjs/elements/SwcIf.js.map +2 -2
  24. package/dist/cjs/elements/SwcLoop.js +58 -78
  25. package/dist/cjs/elements/SwcLoop.js.map +2 -2
  26. package/dist/cjs/elements/register.js +310 -335
  27. package/dist/cjs/elements/register.js.map +2 -2
  28. package/dist/cjs/types.js.map +1 -1
  29. package/dist/cjs/utils/Utils.js +7 -13
  30. package/dist/cjs/utils/Utils.js.map +2 -2
  31. package/dist/esm/decorators/applyStyle.js +1 -1
  32. package/dist/esm/decorators/applyStyle.js.map +2 -2
  33. package/dist/esm/decorators/attribute.js +18 -2
  34. package/dist/esm/decorators/attribute.js.map +2 -2
  35. package/dist/esm/decorators/elementDefine.js +25 -8
  36. package/dist/esm/decorators/elementDefine.js.map +3 -3
  37. package/dist/esm/decorators/index.js +3 -1
  38. package/dist/esm/decorators/index.js.map +2 -2
  39. package/dist/esm/decorators/publishSwcAppMessage.js +67 -0
  40. package/dist/esm/decorators/publishSwcAppMessage.js.map +7 -0
  41. package/dist/esm/decorators/subscribeSwcAppMessageWhileConnected.js +43 -0
  42. package/dist/esm/decorators/subscribeSwcAppMessageWhileConnected.js.map +7 -0
  43. package/dist/esm/decorators/{subscribeSwcAppRouteChange.js → subscribeSwcAppRouteChangeWhileConnected.js} +13 -13
  44. package/dist/esm/decorators/subscribeSwcAppRouteChangeWhileConnected.js.map +7 -0
  45. package/dist/esm/elements/SwcAppMixin.js +32 -3
  46. package/dist/esm/elements/SwcAppMixin.js.map +2 -2
  47. package/dist/esm/elements/SwcAsync.js +70 -58
  48. package/dist/esm/elements/SwcAsync.js.map +2 -2
  49. package/dist/esm/elements/SwcChoose.js +67 -61
  50. package/dist/esm/elements/SwcChoose.js.map +2 -2
  51. package/dist/esm/elements/SwcIf.js +52 -67
  52. package/dist/esm/elements/SwcIf.js.map +2 -2
  53. package/dist/esm/elements/SwcLoop.js +59 -79
  54. package/dist/esm/elements/SwcLoop.js.map +2 -2
  55. package/dist/esm/elements/register.js +239 -264
  56. package/dist/esm/elements/register.js.map +2 -2
  57. package/dist/esm/types.js.map +1 -1
  58. package/dist/esm/utils/Utils.js +7 -13
  59. package/dist/esm/utils/Utils.js.map +2 -2
  60. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +2804 -2498
  61. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  62. package/dist/types/decorators/attribute.d.ts.map +1 -1
  63. package/dist/types/decorators/elementDefine.d.ts +1 -0
  64. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  65. package/dist/types/decorators/index.d.ts +3 -1
  66. package/dist/types/decorators/index.d.ts.map +1 -1
  67. package/dist/types/decorators/publishSwcAppMessage.d.ts +13 -0
  68. package/dist/types/decorators/publishSwcAppMessage.d.ts.map +1 -0
  69. package/dist/types/decorators/subscribeSwcAppMessageWhileConnected.d.ts +16 -0
  70. package/dist/types/decorators/subscribeSwcAppMessageWhileConnected.d.ts.map +1 -0
  71. package/dist/types/decorators/subscribeSwcAppRouteChangeWhileConnected.d.ts +18 -0
  72. package/dist/types/decorators/subscribeSwcAppRouteChangeWhileConnected.d.ts.map +1 -0
  73. package/dist/types/elements/SwcAppMixin.d.ts +3 -0
  74. package/dist/types/elements/SwcAppMixin.d.ts.map +1 -1
  75. package/dist/types/elements/register.d.ts.map +1 -1
  76. package/dist/types/types.d.ts +14 -1
  77. package/dist/types/types.d.ts.map +1 -1
  78. package/dist/types/utils/Utils.d.ts.map +1 -1
  79. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +2804 -2498
  80. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  81. package/package.json +4 -4
  82. package/src/decorators/applyStyle.ts +1 -1
  83. package/src/decorators/attribute.ts +35 -30
  84. package/src/decorators/elementDefine.ts +28 -8
  85. package/src/decorators/index.ts +3 -1
  86. package/src/decorators/publishSwcAppMessage.ts +100 -0
  87. package/src/decorators/subscribeSwcAppMessageWhileConnected.ts +73 -0
  88. package/src/decorators/{subscribeSwcAppRouteChange.ts → subscribeSwcAppRouteChangeWhileConnected.ts} +19 -19
  89. package/src/elements/SwcAppMixin.ts +43 -4
  90. package/src/elements/SwcAsync.ts +75 -69
  91. package/src/elements/SwcChoose.ts +67 -80
  92. package/src/elements/SwcIf.ts +51 -76
  93. package/src/elements/SwcLoop.ts +56 -87
  94. package/src/elements/register.ts +235 -307
  95. package/src/types.ts +14 -1
  96. package/src/utils/Utils.ts +11 -17
  97. package/dist/cjs/decorators/subscribeSwcAppRouteChange.js.map +0 -7
  98. package/dist/esm/decorators/subscribeSwcAppRouteChange.js.map +0 -7
  99. package/dist/types/decorators/subscribeSwcAppRouteChange.d.ts +0 -18
  100. package/dist/types/decorators/subscribeSwcAppRouteChange.d.ts.map +0 -1
@@ -15,32 +15,32 @@ var __copyProps = (to, from, except, desc) => {
15
15
  return to;
16
16
  };
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
- var subscribeSwcAppRouteChange_exports = {};
19
- __export(subscribeSwcAppRouteChange_exports, {
20
- SUBSCRIBE_SWC_APP_ROUTE_CHANGE_METADATA_KEY: () => SUBSCRIBE_SWC_APP_ROUTE_CHANGE_METADATA_KEY,
21
- getSubscribeSwcAppRouteChangeMetadata: () => getSubscribeSwcAppRouteChangeMetadata,
22
- subscribeSwcAppRouteChange: () => subscribeSwcAppRouteChange
18
+ var subscribeSwcAppRouteChangeWhileConnected_exports = {};
19
+ __export(subscribeSwcAppRouteChangeWhileConnected_exports, {
20
+ SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY: () => SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY,
21
+ getSubscribeSwcAppRouteChangeWhileConnectedMetadata: () => getSubscribeSwcAppRouteChangeWhileConnectedMetadata,
22
+ subscribeSwcAppRouteChangeWhileConnected: () => subscribeSwcAppRouteChangeWhileConnected
23
23
  });
24
- module.exports = __toCommonJS(subscribeSwcAppRouteChange_exports);
24
+ module.exports = __toCommonJS(subscribeSwcAppRouteChangeWhileConnected_exports);
25
25
  var import_core = require("@dooboostore/core");
26
- const SUBSCRIBE_SWC_APP_ROUTE_CHANGE_METADATA_KEY = Symbol.for("simple-web-component:subscribe-swc-app-route-change");
27
- function createSwcAppRouteChangeSubscriber(options) {
26
+ const SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY = Symbol.for("simple-web-component:subscribe-swc-app-route-change-while-connected");
27
+ function createSubscribeSwcAppRouteChangeWhileConnected(options) {
28
28
  return (target, propertyKey, descriptor) => {
29
29
  const pathPattern = options?.path;
30
30
  const filter = options?.filter;
31
31
  const constructor = target.constructor;
32
- let list = import_core.ReflectUtils.getOwnMetadata(SUBSCRIBE_SWC_APP_ROUTE_CHANGE_METADATA_KEY, constructor);
32
+ let list = import_core.ReflectUtils.getOwnMetadata(SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY, constructor);
33
33
  if (!list) {
34
34
  list = [];
35
- import_core.ReflectUtils.defineMetadata(SUBSCRIBE_SWC_APP_ROUTE_CHANGE_METADATA_KEY, list, constructor);
35
+ import_core.ReflectUtils.defineMetadata(SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY, list, constructor);
36
36
  }
37
37
  list.push({ propertyKey, pathPattern, filter });
38
38
  return descriptor;
39
39
  };
40
40
  }
41
- function subscribeSwcAppRouteChange(targetOrOptions, propertyKey, descriptor) {
41
+ function subscribeSwcAppRouteChangeWhileConnected(targetOrOptions, propertyKey, descriptor) {
42
42
  if (propertyKey && (typeof propertyKey === "string" || typeof propertyKey === "symbol")) {
43
- return createSwcAppRouteChangeSubscriber({})(targetOrOptions, propertyKey, descriptor);
43
+ return createSubscribeSwcAppRouteChangeWhileConnected({})(targetOrOptions, propertyKey, descriptor);
44
44
  }
45
45
  let options = {};
46
46
  if (Array.isArray(targetOrOptions)) {
@@ -50,10 +50,10 @@ function subscribeSwcAppRouteChange(targetOrOptions, propertyKey, descriptor) {
50
50
  } else if (targetOrOptions && typeof targetOrOptions === "object") {
51
51
  options = targetOrOptions;
52
52
  }
53
- return createSwcAppRouteChangeSubscriber(options);
53
+ return createSubscribeSwcAppRouteChangeWhileConnected(options);
54
54
  }
55
- const getSubscribeSwcAppRouteChangeMetadata = (target) => {
55
+ const getSubscribeSwcAppRouteChangeWhileConnectedMetadata = (target) => {
56
56
  const constructor = target instanceof Function ? target : target.constructor;
57
- return import_core.ReflectUtils.getOwnMetadata(SUBSCRIBE_SWC_APP_ROUTE_CHANGE_METADATA_KEY, constructor);
57
+ return import_core.ReflectUtils.getOwnMetadata(SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY, constructor);
58
58
  };
59
- //# sourceMappingURL=subscribeSwcAppRouteChange.js.map
59
+ //# sourceMappingURL=subscribeSwcAppRouteChangeWhileConnected.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/decorators/subscribeSwcAppRouteChangeWhileConnected.ts"],
4
+ "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { Router } from '@dooboostore/core-web';\n\nexport const SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY = Symbol.for('simple-web-component:subscribe-swc-app-route-change-while-connected');\n\nexport interface SwcAppRouteChangeSubscriberMetadata {\n propertyKey: string | symbol;\n pathPattern?: string | string[];\n filter?: (router: Router) => boolean;\n}\n\nexport interface SwcAppRouteChangeOptions {\n path?: string | string[];\n filter?: (router: Router) => boolean;\n}\n\nfunction createSubscribeSwcAppRouteChangeWhileConnected(options?: SwcAppRouteChangeOptions): MethodDecorator {\n return (target: Object, propertyKey: string | symbol, descriptor?: PropertyDescriptor) => {\n const pathPattern = options?.path;\n const filter = options?.filter;\n\n const constructor = target.constructor;\n let list = ReflectUtils.getOwnMetadata(SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY, constructor) as SwcAppRouteChangeSubscriberMetadata[];\n if (!list) {\n list = [];\n ReflectUtils.defineMetadata(SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY, list, constructor);\n }\n list.push({ propertyKey, pathPattern, filter });\n \n return descriptor;\n };\n}\n\n// \uC624\uBC84\uB85C\uB4DC \uC2DC\uADF8\uB2C8\uCC98 - \uC9C1\uC811 \uC0AC\uC6A9 (\uAD04\uD638 \uC5C6\uC74C)\nexport function subscribeSwcAppRouteChangeWhileConnected(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\n// \uC624\uBC84\uB85C\uB4DC \uC2DC\uADF8\uB2C8\uCC98 - \uD568\uC218 \uD638\uCD9C (\uAD04\uD638 \uC788\uC74C)\nexport function subscribeSwcAppRouteChangeWhileConnected(): MethodDecorator;\nexport function subscribeSwcAppRouteChangeWhileConnected(pathPattern: string): MethodDecorator;\nexport function subscribeSwcAppRouteChangeWhileConnected(pathPatterns: string[]): MethodDecorator;\nexport function subscribeSwcAppRouteChangeWhileConnected(options: SwcAppRouteChangeOptions): MethodDecorator;\n\n// \uC2E4\uC81C \uAD6C\uD604 (\uC774\uC911 \uBAA8\uB4DC)\nexport function subscribeSwcAppRouteChangeWhileConnected(targetOrOptions?: any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): any {\n // \uC9C1\uC811 \uB370\uCF54\uB808\uC774\uD130\uB85C \uC0AC\uC6A9\uB41C \uACBD\uC6B0 (\uAD04\uD638 \uC5C6\uC74C): @subscribeSwcAppRouteChangeWhileConnected\n // propertyKey\uAC00 string | symbol\uC774\uACE0 descriptor\uAC00 \uC788\uC73C\uBA74 \uC9C1\uC811 \uC0AC\uC6A9\n if (propertyKey && (typeof propertyKey === 'string' || typeof propertyKey === 'symbol')) {\n return createSubscribeSwcAppRouteChangeWhileConnected({})(targetOrOptions, propertyKey, descriptor);\n }\n \n // \uD568\uC218\uB85C \uD638\uCD9C\uB41C \uACBD\uC6B0 (\uAD04\uD638 \uC788\uC74C): @subscribeSwcAppRouteChangeWhileConnected() / @subscribeSwcAppRouteChangeWhileConnected('/path')\n let options: SwcAppRouteChangeOptions = {};\n\n if (Array.isArray(targetOrOptions)) {\n // \uBC30\uC5F4: @subscribeSwcAppRouteChangeWhileConnected(['/path1', '/path2'])\n options.path = targetOrOptions;\n } else if (typeof targetOrOptions === 'string') {\n // \uBB38\uC790\uC5F4: @subscribeSwcAppRouteChangeWhileConnected('/path')\n options.path = targetOrOptions;\n } else if (targetOrOptions && typeof targetOrOptions === 'object') {\n // \uAC1D\uCCB4: @subscribeSwcAppRouteChangeWhileConnected({ path: '/path', filter: ... })\n options = targetOrOptions;\n }\n\n return createSubscribeSwcAppRouteChangeWhileConnected(options);\n}\n\n// Helper function to retrieve route change subscribers metadata\nexport const getSubscribeSwcAppRouteChangeWhileConnectedMetadata = (target: any): SwcAppRouteChangeSubscriberMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getOwnMetadata(SUBSCRIBE_SWC_APP_ROUTE_CHANGE_WHILE_CONNECTED_METADATA_KEY, constructor);\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;AAGtB,MAAM,8DAA8D,OAAO,IAAI,qEAAqE;AAa3J,SAAS,+CAA+C,SAAqD;AAC3G,SAAO,CAAC,QAAgB,aAA8B,eAAoC;AACxF,UAAM,cAAc,SAAS;AAC7B,UAAM,SAAS,SAAS;AAExB,UAAM,cAAc,OAAO;AAC3B,QAAI,OAAO,yBAAa,eAAe,6DAA6D,WAAW;AAC/G,QAAI,CAAC,MAAM;AACT,aAAO,CAAC;AACR,+BAAa,eAAe,6DAA6D,MAAM,WAAW;AAAA,IAC5G;AACA,SAAK,KAAK,EAAE,aAAa,aAAa,OAAO,CAAC;AAE9C,WAAO;AAAA,EACT;AACF;AAWO,SAAS,yCAAyC,iBAAuB,aAA+B,YAAsC;AAGnJ,MAAI,gBAAgB,OAAO,gBAAgB,YAAY,OAAO,gBAAgB,WAAW;AACvF,WAAO,+CAA+C,CAAC,CAAC,EAAE,iBAAiB,aAAa,UAAU;AAAA,EACpG;AAGA,MAAI,UAAoC,CAAC;AAEzC,MAAI,MAAM,QAAQ,eAAe,GAAG;AAElC,YAAQ,OAAO;AAAA,EACjB,WAAW,OAAO,oBAAoB,UAAU;AAE9C,YAAQ,OAAO;AAAA,EACjB,WAAW,mBAAmB,OAAO,oBAAoB,UAAU;AAEjE,cAAU;AAAA,EACZ;AAEA,SAAO,+CAA+C,OAAO;AAC/D;AAGO,MAAM,sDAAsD,CAAC,WAAmE;AACrI,QAAM,cAAc,kBAAkB,WAAW,SAAS,OAAO;AACjE,SAAO,yBAAa,eAAe,6DAA6D,WAAW;AAC7G;",
6
+ "names": []
7
+ }
@@ -24,7 +24,8 @@ var import_SwcAppEngine = require("./SwcAppEngine");
24
24
  var import_Utils = require("../utils/Utils");
25
25
  var import_core = require("@dooboostore/core");
26
26
  var import_lifecycles = require("../decorators/lifecycles");
27
- var import_subscribeSwcAppRouteChange = require("../decorators/subscribeSwcAppRouteChange");
27
+ var import_subscribeSwcAppRouteChangeWhileConnected = require("../decorators/subscribeSwcAppRouteChangeWhileConnected");
28
+ var import_subscribeSwcAppMessageWhileConnected = require("../decorators/subscribeSwcAppMessageWhileConnected");
28
29
  function SwcAppMixin(Base) {
29
30
  return class extends Base {
30
31
  constructor() {
@@ -40,7 +41,7 @@ function SwcAppMixin(Base) {
40
41
  return this.__swc_engine.router;
41
42
  }
42
43
  _invokeRouteChangeSubscribers(instance, re) {
43
- const routeChangeSubscribers = (0, import_subscribeSwcAppRouteChange.getSubscribeSwcAppRouteChangeMetadata)(instance);
44
+ const routeChangeSubscribers = (0, import_subscribeSwcAppRouteChangeWhileConnected.getSubscribeSwcAppRouteChangeWhileConnectedMetadata)(instance);
44
45
  if (routeChangeSubscribers && Array.isArray(routeChangeSubscribers)) {
45
46
  routeChangeSubscribers.forEach((metadata) => {
46
47
  const methodName = metadata.propertyKey || metadata;
@@ -156,7 +157,7 @@ function SwcAppMixin(Base) {
156
157
  const userConfig = import_core.FunctionUtils.executeReturn({
157
158
  script: configStr,
158
159
  context: this,
159
- args: import_Utils.SwcUtils.getHelperAndHostSet(win, import_Utils.SwcUtils.findNearestSwcHost(this))
160
+ args: import_Utils.SwcUtils.getHelperAndHostSet(win, this)
160
161
  });
161
162
  this.connect(userConfig);
162
163
  } catch (e) {
@@ -186,6 +187,34 @@ function SwcAppMixin(Base) {
186
187
  reload() {
187
188
  this.router?.reload();
188
189
  }
190
+ publishMessage(message) {
191
+ this._swc_connected_instance.forEach((instance) => {
192
+ this._invokeMessageSubscribers(instance, message);
193
+ });
194
+ }
195
+ _invokeMessageSubscribers(instance, message) {
196
+ const messageSubscribers = (0, import_subscribeSwcAppMessageWhileConnected.getSubscribeSwcAppMessageWhileConnectedMetadata)(instance);
197
+ if (messageSubscribers && Array.isArray(messageSubscribers)) {
198
+ messageSubscribers.forEach((metadata) => {
199
+ const methodName = metadata.propertyKey;
200
+ const messageType = metadata.messageType;
201
+ const filter = metadata.filter;
202
+ let typeMatched = false;
203
+ if (!messageType) {
204
+ typeMatched = true;
205
+ } else if (message.type === messageType) {
206
+ typeMatched = true;
207
+ }
208
+ let filterMatched = true;
209
+ if (filter && typeMatched) {
210
+ filterMatched = filter(message);
211
+ }
212
+ if (typeMatched && filterMatched && typeof instance[methodName] === "function") {
213
+ instance[methodName](message);
214
+ }
215
+ });
216
+ }
217
+ }
189
218
  };
190
219
  }
191
220
  //# sourceMappingURL=SwcAppMixin.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/elements/SwcAppMixin.ts"],
4
- "sourcesContent": ["import { SwcAppEngine, SwcAttributeConfigType, SwcConfigType } from './SwcAppEngine';\nimport { SwcAppInterface } from '../types';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils, Subscription } from '@dooboostore/core';\nimport { Router, RouterEventType } from '@dooboostore/core-web';\nimport { ON_CONNECTED_SWC_APP_METADATA_KEY, findAllLifecycleMetadata } from '../decorators/lifecycles';\nimport { getSubscribeSwcAppRouteChangeMetadata } from '../decorators/subscribeSwcAppRouteChange';\n\nexport function SwcAppMixin<T extends { new (...args: any[]): HTMLElement }>(Base: T) {\n //@ts-ignore\n return class extends Base implements SwcAppInterface {\n __swc_engine = new SwcAppEngine(this as any);\n _swc_connected_instance = new Set<any>();\n _routerSubscription?: Subscription;\n _lastRouterEvent?: RouterEventType;\n\n /*\n 사파리 is 일경우\n <script src=\"https://unpkg.com/@ungap/custom-elements\"></script>\n 이걸사용하는데 is 대응하는거다 그런데 이때 처리되는 순서가 크롬이나 표준에서는 부모부터 만들어지고 자식들이 만들어지는데\n 저 polyfill에서는 자식부터 만들어지고 부모가 만들어진다 is일때 아 .. 이문제때문에 자식이 _connected_safari 에 강제로 자기자식넣어준다\n */\n _connected_safari = [];\n get simpleApplication() {\n return this.__swc_engine.simpleApplication;\n }\n get router() {\n return this.__swc_engine.router;\n }\n\n _invokeRouteChangeSubscribers(instance: any, re: RouterEventType) {\n const routeChangeSubscribers = getSubscribeSwcAppRouteChangeMetadata(instance);\n if (routeChangeSubscribers && Array.isArray(routeChangeSubscribers)) {\n routeChangeSubscribers.forEach((metadata: any) => {\n const methodName = metadata.propertyKey || metadata;\n const pathPattern = metadata.pathPattern;\n const filter = metadata.filter;\n\n // Path pattern matching (support both string and array)\n let pathMatched = false;\n let pathData: any = null;\n\n if (!pathPattern) {\n // pathPattern이 없으면 모든 경로 매칭 (와일드카드)\n pathMatched = true;\n pathData = {};\n } else if (Array.isArray(pathPattern)) {\n // 배열: 하나라도 매칭되면 OK\n for (const pattern of pathPattern) {\n const data = SwcUtils.parsePathPattern(pattern, re.path || '/');\n if (data !== null) {\n pathMatched = true;\n pathData = data;\n break;\n }\n }\n } else {\n // 문자열\n pathData = SwcUtils.parsePathPattern(pathPattern, re.path || '/');\n pathMatched = pathData !== null;\n }\n\n // Filter validation\n const filterPassed = !filter || filter(this.router!);\n\n // Invoke method if conditions pass\n if (pathMatched && filterPassed) {\n instance[methodName]?.({...re, pathData: pathData});\n }\n });\n }\n }\n\n _connected(instance: any) {\n // console.log('appmixin--> connected', this, instance);\n if (instance) {\n this._swc_connected_instance.add(instance);\n if (this.simpleApplication) {\n this._invokeOnConnectedSwcAppStarted(instance);\n // Notify current route subscribers immediately after connection\n if (this.router && this._lastRouterEvent) {\n this._invokeRouteChangeSubscribers(instance, this._lastRouterEvent);\n }\n }\n }\n }\n\n _disconnected(instance: any) {\n if (instance) {\n this._swc_connected_instance.delete(instance);\n }\n }\n\n _handleRouteChange(route: RouterEventType) {\n if (route.triggerPoint === 'end') {\n // Iterate through all connected component instances\n this._swc_connected_instance.forEach((instance: any) => {\n this._invokeRouteChangeSubscribers(instance, route);\n });\n }\n\n // Save last router event\n this._lastRouterEvent = route;\n }\n\n async connect(config?: SwcAttributeConfigType) {\n const swcConfig = {\n routeType: 'element',\n window: config.window,\n ...config\n } as SwcConfigType;\n\n const mode = config?.connectMode || 'direct';\n\n if (mode === 'direct') {\n await this.__swc_engine.connect(swcConfig);\n this.setAttribute('swc-connect-mode', 'direct');\n } else if (mode === 'swap' && !this.parentNode) {\n await this.__swc_engine.connect(swcConfig);\n this.setAttribute('swc-connect-mode', 'direct');\n\n const clonedApp = this.cloneNode(true) as any;\n clonedApp.style.display = 'none';\n this.parentNode.insertBefore(clonedApp, this.nextSibling);\n\n try {\n await clonedApp.connect({ ...(config || {}), connectMode: 'direct' });\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n clonedApp.setAttribute('swc-connect-mode', 'swap');\n clonedApp.style.display = '';\n } catch (e) {\n if (clonedApp.parentNode) {\n clonedApp.parentNode.removeChild(clonedApp);\n }\n throw e;\n }\n }\n\n // 사파리일떄 예외이다 is 일때 polyfill되는데 이떄 부모부터 만들어지는게 아니라 자식부터 만들어진다 그래서 부모가 만들어질때 자식들이 이미 만들어져있어서 부모가 자식들을 등록해주는 형태로 강제로 등록해준다\n this._connected_safari.forEach((instance: any) => {\n this._swc_connected_instance.add(instance);\n });\n // Invoke @onConnectedSwcApp lifecycle methods on all connected component instances\n // const hostSet = SwcUtils.getHostSet(this as any);\n this._swc_connected_instance.forEach((instance: any) => {\n this._invokeOnConnectedSwcAppStarted(instance);\n });\n\n\n // Subscribe to router changes after connect\n if (!this._routerSubscription && this.router) {\n this._routerSubscription = this.router.observable.subscribe((route: RouterEventType) => {\n //@ts-ignore\n // console.log('Route changed:', route, this._swcId);\n this._handleRouteChange(route);\n });\n // Navigate to initial path if specified\n const config = this.__swc_engine.config;\n // if (config?.path) {\n // this.router.go(config.path);\n // }\n }\n }\n\n _invokeOnConnectedSwcAppStarted(instance: any) {\n const startedMethods = findAllLifecycleMetadata(instance, ON_CONNECTED_SWC_APP_METADATA_KEY);\n if (startedMethods) {\n for (const m of startedMethods) {\n instance._invokeLifecycleMethod(m);\n }\n }\n }\n\n connectedCallback() {\n // @ts-ignore\n if (super.connectedCallback) super.connectedCallback();\n\n const configStr = this.getAttribute('swc-get-application-config');\n const win = this.ownerDocument?.defaultView || window;\n if (configStr && win) {\n try {\n // console.log('vvvvvvvvvvvvvvvv->>>>', SwcUtils.findNearestSwcHost(this.host), SwcUtils.getHostSet(this.host))\n const userConfig = FunctionUtils.executeReturn({\n script: configStr,\n context: this,\n args: SwcUtils.getHelperAndHostSet(win, SwcUtils.findNearestSwcHost(this))\n });\n this.connect(userConfig);\n } catch (e) {\n console.error('[SWC-APP-ENGINE] Script execution failed:', e);\n }\n }\n\n this.__swc_engine?.config?.onConnected?.(this);\n }\n\n disconnectedCallback() {\n // @ts-ignore\n if (super.disconnectedCallback) super.disconnectedCallback();\n this._routerSubscription?.unsubscribe();\n this._routerSubscription = undefined;\n this._lastRouterEvent = undefined;\n this.__swc_engine.disconnect();\n this.__swc_engine?.config?.onDisconnected?.(this);\n }\n\n async routing(path: string) {\n await this.router?.go(path);\n }\n\n back(): void {\n this.router?.back();\n }\n\n forward(): void {\n this.router?.forward();\n }\n\n reload(): void {\n this.router?.reload();\n }\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { SwcAppEngine, SwcAttributeConfigType, SwcConfigType } from './SwcAppEngine';\nimport { SwcAppInterface, SwcAppMessage } from '../types';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils, Subscription } from '@dooboostore/core';\nimport { Router, RouterEventType } from '@dooboostore/core-web';\nimport { ON_CONNECTED_SWC_APP_METADATA_KEY, findAllLifecycleMetadata } from '../decorators/lifecycles';\nimport { getSubscribeSwcAppRouteChangeWhileConnectedMetadata } from '../decorators/subscribeSwcAppRouteChangeWhileConnected';\nimport { getSubscribeSwcAppMessageWhileConnectedMetadata } from '../decorators/subscribeSwcAppMessageWhileConnected';\n\nexport function SwcAppMixin<T extends { new (...args: any[]): HTMLElement }>(Base: T) {\n //@ts-ignore\n return class extends Base implements SwcAppInterface {\n __swc_engine = new SwcAppEngine(this as any);\n _swc_connected_instance = new Set<any>();\n _routerSubscription?: Subscription;\n _lastRouterEvent?: RouterEventType;\n\n /*\n 사파리 is 일경우\n <script src=\"https://unpkg.com/@ungap/custom-elements\"></script>\n 이걸사용하는데 is 대응하는거다 그런데 이때 처리되는 순서가 크롬이나 표준에서는 부모부터 만들어지고 자식들이 만들어지는데\n 저 polyfill에서는 자식부터 만들어지고 부모가 만들어진다 is일때 아 .. 이문제때문에 자식이 _connected_safari 에 강제로 자기자식넣어준다\n */\n _connected_safari = [];\n get simpleApplication() {\n return this.__swc_engine.simpleApplication;\n }\n get router() {\n return this.__swc_engine.router;\n }\n\n _invokeRouteChangeSubscribers(instance: any, re: RouterEventType) {\n const routeChangeSubscribers = getSubscribeSwcAppRouteChangeWhileConnectedMetadata(instance);\n if (routeChangeSubscribers && Array.isArray(routeChangeSubscribers)) {\n routeChangeSubscribers.forEach((metadata: any) => {\n const methodName = metadata.propertyKey || metadata;\n const pathPattern = metadata.pathPattern;\n const filter = metadata.filter;\n\n // Path pattern matching (support both string and array)\n let pathMatched = false;\n let pathData: any = null;\n\n if (!pathPattern) {\n // pathPattern이 없으면 모든 경로 매칭 (와일드카드)\n pathMatched = true;\n pathData = {};\n } else if (Array.isArray(pathPattern)) {\n // 배열: 하나라도 매칭되면 OK\n for (const pattern of pathPattern) {\n const data = SwcUtils.parsePathPattern(pattern, re.path || '/');\n if (data !== null) {\n pathMatched = true;\n pathData = data;\n break;\n }\n }\n } else {\n // 문자열\n pathData = SwcUtils.parsePathPattern(pathPattern, re.path || '/');\n pathMatched = pathData !== null;\n }\n\n // Filter validation\n const filterPassed = !filter || filter(this.router!);\n\n // Invoke method if conditions pass\n if (pathMatched && filterPassed) {\n instance[methodName]?.({...re, pathData: pathData});\n }\n });\n }\n }\n\n _connected(instance: any) {\n // console.log('appmixin--> connected', this, instance);\n if (instance) {\n this._swc_connected_instance.add(instance);\n if (this.simpleApplication) {\n this._invokeOnConnectedSwcAppStarted(instance);\n // Notify current route subscribers immediately after connection\n if (this.router && this._lastRouterEvent) {\n this._invokeRouteChangeSubscribers(instance, this._lastRouterEvent);\n }\n }\n }\n }\n\n _disconnected(instance: any) {\n if (instance) {\n this._swc_connected_instance.delete(instance);\n }\n }\n\n _handleRouteChange(route: RouterEventType) {\n if (route.triggerPoint === 'end') {\n // Iterate through all connected component instances\n this._swc_connected_instance.forEach((instance: any) => {\n this._invokeRouteChangeSubscribers(instance, route);\n });\n }\n\n // Save last router event\n this._lastRouterEvent = route;\n }\n\n async connect(config?: SwcAttributeConfigType) {\n const swcConfig = {\n routeType: 'element',\n window: config.window,\n ...config\n } as SwcConfigType;\n\n const mode = config?.connectMode || 'direct';\n\n if (mode === 'direct') {\n await this.__swc_engine.connect(swcConfig);\n this.setAttribute('swc-connect-mode', 'direct');\n } else if (mode === 'swap' && !this.parentNode) {\n await this.__swc_engine.connect(swcConfig);\n this.setAttribute('swc-connect-mode', 'direct');\n\n const clonedApp = this.cloneNode(true) as any;\n clonedApp.style.display = 'none';\n this.parentNode.insertBefore(clonedApp, this.nextSibling);\n\n try {\n await clonedApp.connect({ ...(config || {}), connectMode: 'direct' });\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n clonedApp.setAttribute('swc-connect-mode', 'swap');\n clonedApp.style.display = '';\n } catch (e) {\n if (clonedApp.parentNode) {\n clonedApp.parentNode.removeChild(clonedApp);\n }\n throw e;\n }\n }\n\n // 사파리일떄 예외이다 is 일때 polyfill되는데 이떄 부모부터 만들어지는게 아니라 자식부터 만들어진다 그래서 부모가 만들어질때 자식들이 이미 만들어져있어서 부모가 자식들을 등록해주는 형태로 강제로 등록해준다\n this._connected_safari.forEach((instance: any) => {\n this._swc_connected_instance.add(instance);\n });\n // Invoke @onConnectedSwcApp lifecycle methods on all connected component instances\n // const hostSet = SwcUtils.getHostSet(this as any);\n this._swc_connected_instance.forEach((instance: any) => {\n this._invokeOnConnectedSwcAppStarted(instance);\n });\n\n\n // Subscribe to router changes after connect\n if (!this._routerSubscription && this.router) {\n this._routerSubscription = this.router.observable.subscribe((route: RouterEventType) => {\n //@ts-ignore\n // console.log('Route changed:', route, this._swcId);\n this._handleRouteChange(route);\n });\n // Navigate to initial path if specified\n const config = this.__swc_engine.config;\n // if (config?.path) {\n // this.router.go(config.path);\n // }\n }\n }\n\n _invokeOnConnectedSwcAppStarted(instance: any) {\n const startedMethods = findAllLifecycleMetadata(instance, ON_CONNECTED_SWC_APP_METADATA_KEY);\n if (startedMethods) {\n for (const m of startedMethods) {\n instance._invokeLifecycleMethod(m);\n }\n }\n }\n\n connectedCallback() {\n // @ts-ignore\n if (super.connectedCallback) super.connectedCallback();\n\n const configStr = this.getAttribute('swc-get-application-config');\n const win = this.ownerDocument?.defaultView || window;\n if (configStr && win) {\n try {\n // console.log('vvvvvvvvvvvvvvvv->>>>', SwcUtils.findNearestSwcHost(this.host), SwcUtils.getHostSet(this.host))\n const userConfig = FunctionUtils.executeReturn({\n script: configStr,\n context: this,\n args: SwcUtils.getHelperAndHostSet(win, this)\n });\n this.connect(userConfig);\n } catch (e) {\n console.error('[SWC-APP-ENGINE] Script execution failed:', e);\n }\n }\n\n this.__swc_engine?.config?.onConnected?.(this);\n }\n\n disconnectedCallback() {\n // @ts-ignore\n if (super.disconnectedCallback) super.disconnectedCallback();\n this._routerSubscription?.unsubscribe();\n this._routerSubscription = undefined;\n this._lastRouterEvent = undefined;\n this.__swc_engine.disconnect();\n this.__swc_engine?.config?.onDisconnected?.(this);\n }\n\n async routing(path: string) {\n await this.router?.go(path);\n }\n\n back(): void {\n this.router?.back();\n }\n\n forward(): void {\n this.router?.forward();\n }\n\n reload(): void {\n this.router?.reload();\n }\n\n publishMessage(message: SwcAppMessage): void {\n // 메시지를 모든 connected component instances로 분배\n this._swc_connected_instance.forEach((instance: any) => {\n this._invokeMessageSubscribers(instance, message);\n });\n }\n\n _invokeMessageSubscribers(instance: any, message: SwcAppMessage) {\n const messageSubscribers = getSubscribeSwcAppMessageWhileConnectedMetadata(instance);\n if (messageSubscribers && Array.isArray(messageSubscribers)) {\n messageSubscribers.forEach((metadata: any) => {\n const methodName = metadata.propertyKey;\n const messageType = metadata.messageType;\n const filter = metadata.filter;\n\n // 메시지 타입 확인\n let typeMatched = false;\n if (!messageType) {\n // messageType이 없으면 모든 메시지 매칭 (와일드카드)\n typeMatched = true;\n } else if (message.type === messageType) {\n typeMatched = true;\n }\n\n // 필터 적용\n let filterMatched = true;\n if (filter && typeMatched) {\n filterMatched = filter(message);\n }\n\n // 조건을 만족하면 메서드 호출\n if (typeMatched && filterMatched && typeof instance[methodName] === 'function') {\n instance[methodName](message);\n }\n });\n }\n }\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["config"]
7
7
  }
@@ -1,6 +1,8 @@
1
1
  var import_changedAttributeHost = require("../decorators/changedAttributeHost");
2
2
  var import_Utils = require("../utils/Utils");
3
3
  var import_core = require("@dooboostore/core");
4
+ var import_core_web = require("@dooboostore/core-web");
5
+ var import_decorators = require("../decorators");
4
6
  var __decorate = function(decorators, target, key, desc) {
5
7
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
6
8
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -14,46 +16,60 @@ class SwcAsync extends HTMLTemplateElement {
14
16
  constructor() {
15
17
  super(...arguments);
16
18
  this._nodes = [];
17
- this._value = null;
18
19
  }
19
- _executeCloneCallback(attr, args) {
20
- const script = this.getAttribute(attr);
21
- if (!script)
22
- return;
23
- import_core.FunctionUtils.execute({ script, context: this, args });
20
+ get value() {
21
+ return this._value;
22
+ }
23
+ set value(nv) {
24
+ this.executeAsync(nv);
25
+ }
26
+ setValue(valueAttr) {
27
+ this.executeAsync(this._value);
24
28
  }
25
- refresh(valueAttr) {
26
- valueAttr ?? (valueAttr = this.getAttribute("value"));
27
- if (!valueAttr) {
28
- this.render("default");
29
+ setReplaceWrap() {
30
+ this.executeAsync(this._value);
31
+ }
32
+ executeAsync(result = this._value) {
33
+ if (result === void 0 || result === null) {
34
+ this.refresh("default");
29
35
  return;
30
36
  }
31
- if (valueAttr.startsWith("{{") && valueAttr.endsWith("}}")) {
32
- const script = valueAttr.slice(2, -2).trim();
33
- const win = this.ownerDocument?.defaultView || window;
34
- const result = import_core.FunctionUtils.executeReturn({
35
- script,
36
- context: this,
37
- args: import_Utils.SwcUtils.getHelperAndHostSet(win, this)
37
+ if (result instanceof Promise) {
38
+ this.refresh("loading");
39
+ result.then((v) => {
40
+ this.resultValue = v;
41
+ this.refresh("success");
42
+ }).catch((e) => {
43
+ console.error("[SWC-ASYNC] Promise rejected:", e);
44
+ this.resultValue = e;
45
+ this.refresh("error");
38
46
  });
39
- this.executeAsync(result);
40
47
  } else {
41
- this.executeAsync(valueAttr);
48
+ this.resultValue = result;
49
+ this.refresh("success");
42
50
  }
43
51
  }
44
- executeAsync(result) {
45
- if (result instanceof Promise) {
46
- this.render("loading");
47
- result.then((v) => {
48
- this._value = v;
49
- this.render("success");
50
- }).catch((e) => this.render("error"));
51
- } else {
52
- this._value = result;
53
- this.render("success");
52
+ replaceExpressions(html, groupArgs, context, wrap) {
53
+ const config = wrap ? { wrapExpression: wrap } : void 0;
54
+ const ae = new import_core.ActionExpression(html, config);
55
+ const filterOptions = wrap ? { type: "replace", wrap } : "replace";
56
+ const win = this.ownerDocument?.defaultView || window;
57
+ for (const expr of ae.getExpressions(filterOptions)) {
58
+ try {
59
+ const value = import_core.FunctionUtils.executeReturn({
60
+ script: import_core_web.ConvertUtils.decodeHtmlEntity(expr.script, win.document),
61
+ context,
62
+ args: groupArgs
63
+ });
64
+ ae.replace(expr, String(value));
65
+ } catch (e) {
66
+ console.error(`[SWC] Failed to execute ${expr.original}:`, e);
67
+ }
54
68
  }
69
+ return ae.getUnprocessedTemplate();
55
70
  }
56
- render(state) {
71
+ refresh(state = "default") {
72
+ console.log("rrrrrrrrrrrrrrrrr", state);
57
73
  this.cleanup();
58
74
  const portal = this.parentElement;
59
75
  if (!portal)
@@ -62,46 +78,42 @@ class SwcAsync extends HTMLTemplateElement {
62
78
  const helperSet = import_Utils.SwcUtils.getHelperAndHostSet(win, this);
63
79
  const t = this.content.querySelector(`template[is="swc-${state}"]`);
64
80
  if (t) {
65
- const clone = t.content.cloneNode(true);
66
- this._nodes = Array.from(clone.childNodes);
67
- const elements = this._nodes.filter((n) => n.nodeType === 1);
68
- const groupArgs = { ...helperSet, $value: this._value, $nodes: this._nodes, $elements: elements, $firstElement: elements[0], $state: state };
69
- this._nodes.forEach((n, nodeIdx) => {
70
- this._executeCloneCallback("on-clone-node", { ...groupArgs, $node: n, $nodeIndex: nodeIdx, $isElement: n.nodeType === 1 });
71
- if (n instanceof HTMLElement) {
72
- Array.from(n.attributes).forEach((attr) => {
73
- const value = attr.value || "";
74
- if (value.startsWith("{{") && value.endsWith("}}")) {
75
- const script = value.slice(2, -2).trim();
76
- const result = import_core.FunctionUtils.executeReturn({
77
- script,
78
- context: n,
79
- args: groupArgs
80
- });
81
- n.setAttribute(attr.name, String(result));
82
- }
83
- });
84
- }
85
- });
86
- this._executeCloneCallback("on-clone-nodes", groupArgs);
87
- portal.insertBefore(clone, this.nextSibling);
81
+ let htmlString = t.innerHTML;
82
+ const groupArgs = { ...helperSet, $value: this._value, $state: state };
83
+ htmlString = this.replaceExpressions(htmlString, groupArgs, this, this._replaceWrap);
84
+ const temp = this.ownerDocument?.createElement("template") || document.createElement("template");
85
+ temp.innerHTML = htmlString;
86
+ const content = temp.content;
87
+ this._nodes = Array.from(content.childNodes);
88
+ portal.insertBefore(content, this.nextSibling);
88
89
  }
89
90
  }
90
91
  cleanup() {
91
92
  this._nodes.forEach((n) => n.parentElement?.removeChild(n));
92
93
  this._nodes = [];
93
94
  }
94
- connectedCallback() {
95
- this.refresh();
96
- }
97
95
  disconnectedCallback() {
98
96
  this.cleanup();
99
97
  }
100
98
  }
99
+ __decorate([
100
+ (0, import_decorators.attributeHost)("value"),
101
+ __metadata("design:type", Object)
102
+ ], SwcAsync.prototype, "_value", void 0);
103
+ __decorate([
104
+ (0, import_decorators.attributeHost)("replace-wrap"),
105
+ __metadata("design:type", String)
106
+ ], SwcAsync.prototype, "_replaceWrap", void 0);
101
107
  __decorate([
102
108
  (0, import_changedAttributeHost.changedAttributeHost)("value"),
103
109
  __metadata("design:type", Function),
104
110
  __metadata("design:paramtypes", [String]),
105
111
  __metadata("design:returntype", void 0)
106
- ], SwcAsync.prototype, "refresh", null);
112
+ ], SwcAsync.prototype, "setValue", null);
113
+ __decorate([
114
+ (0, import_changedAttributeHost.changedAttributeHost)("replace-wrap"),
115
+ __metadata("design:type", Function),
116
+ __metadata("design:paramtypes", []),
117
+ __metadata("design:returntype", void 0)
118
+ ], SwcAsync.prototype, "setReplaceWrap", null);
107
119
  //# sourceMappingURL=SwcAsync.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/elements/SwcAsync.ts"],
4
- "sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils } from '@dooboostore/core';\n\nclass SwcAsync extends HTMLTemplateElement {\n private _nodes: Node[] = [];\n private _value: any = null;\n\n private _executeCloneCallback(attr: string, args: any) {\n const script = this.getAttribute(attr);\n if (!script) return;\n FunctionUtils.execute({ script, context: this, args });\n }\n\n @changedAttributeHost('value')\n private refresh(valueAttr?: string | null) {\n valueAttr ??= this.getAttribute('value');\n if (!valueAttr) {\n this.render('default');\n return;\n }\n\n // {{ }} 브레이스로 감싸진 값은 스크립트 실행\n if (valueAttr.startsWith('{{') && valueAttr.endsWith('}}')) {\n const script = valueAttr.slice(2, -2).trim();\n const win = this.ownerDocument?.defaultView || window;\n const result = FunctionUtils.executeReturn({ \n script, \n context: this, \n args: SwcUtils.getHelperAndHostSet(win, this) \n });\n\n this.executeAsync(result);\n } else {\n // 일반 문자열 값 또는 직접 Promise 속성\n this.executeAsync(valueAttr);\n }\n }\n\n private executeAsync(result: any) {\n if (result instanceof Promise) {\n this.render('loading');\n result\n .then(v => {\n this._value = v;\n this.render('success');\n })\n .catch(e => this.render('error'));\n } else {\n this._value = result;\n this.render('success');\n }\n }\n\n private render(state: string) {\n this.cleanup();\n const portal = this.parentElement;\n if (!portal) return;\n\n const win = this.ownerDocument?.defaultView || window;\n const helperSet = SwcUtils.getHelperAndHostSet(win, this);\n\n const t = this.content.querySelector(`template[is=\"swc-${state}\"]`) as HTMLTemplateElement;\n if (t) {\n const clone = t.content.cloneNode(true) as DocumentFragment;\n this._nodes = Array.from(clone.childNodes);\n const elements = this._nodes.filter(n => n.nodeType === 1) as HTMLElement[];\n const groupArgs = { ...helperSet, $value: this._value, $nodes: this._nodes, $elements: elements, $firstElement: elements[0], $state: state };\n\n // 부모 체인을 정상적으로 유지하기 위해 __swc_host 할당 제거\n this._nodes.forEach((n, nodeIdx) => {\n // if (n instanceof HTMLElement) (n as any).__swc_host = this; // 제거: 부모 체인 유지\n this._executeCloneCallback('on-clone-node', { ...groupArgs, $node: n, $nodeIndex: nodeIdx, $isElement: n.nodeType === 1 });\n\n // Attribute {{ }} 치환 - SwcChoose처럼 동적 치환\n if (n instanceof HTMLElement) {\n Array.from(n.attributes).forEach(attr => {\n const value = attr.value || '';\n if (value.startsWith('{{') && value.endsWith('}}')) {\n const script = value.slice(2, -2).trim();\n const result = FunctionUtils.executeReturn({\n script,\n context: n,\n args: groupArgs\n });\n n.setAttribute(attr.name, String(result));\n }\n });\n }\n });\n\n this._executeCloneCallback('on-clone-nodes', groupArgs);\n\n portal.insertBefore(clone, this.nextSibling);\n }\n }\n\n private cleanup() {\n this._nodes.forEach(n => n.parentElement?.removeChild(n));\n this._nodes = [];\n }\n\n connectedCallback() {\n this.refresh();\n }\n disconnectedCallback() {\n this.cleanup();\n }\n}\n"],
5
- "mappings": "AAAA,kCAAqC;AACrC,mBAAyB;AACzB,kBAA8B;;;;;;;;;;AAE9B,MAAM,iBAAiB,oBAAmB;EAA1C,cAAA;;AACU,SAAA,SAAiB,CAAA;AACjB,SAAA,SAAc;EAsGxB;EApGU,sBAAsB,MAAc,MAAS;AACnD,UAAM,SAAS,KAAK,aAAa,IAAI;AACrC,QAAI,CAAC;AAAQ;AACb,8BAAc,QAAQ,EAAE,QAAQ,SAAS,MAAM,KAAI,CAAE;EACvD;EAGQ,QAAQ,WAAyB;AACvC,kBAAA,YAAc,KAAK,aAAa,OAAO;AACvC,QAAI,CAAC,WAAW;AACd,WAAK,OAAO,SAAS;AACrB;IACF;AAGA,QAAI,UAAU,WAAW,IAAI,KAAK,UAAU,SAAS,IAAI,GAAG;AAC1D,YAAM,SAAS,UAAU,MAAM,GAAG,EAAE,EAAE,KAAI;AAC1C,YAAM,MAAM,KAAK,eAAe,eAAe;AAC/C,YAAM,SAAS,0BAAc,cAAc;QACzC;QACA,SAAS;QACT,MAAM,sBAAS,oBAAoB,KAAK,IAAI;OAC7C;AAED,WAAK,aAAa,MAAM;IAC1B,OAAO;AAEL,WAAK,aAAa,SAAS;IAC7B;EACF;EAEQ,aAAa,QAAW;AAC9B,QAAI,kBAAkB,SAAS;AAC7B,WAAK,OAAO,SAAS;AACrB,aACG,KAAK,OAAI;AACR,aAAK,SAAS;AACd,aAAK,OAAO,SAAS;MACvB,CAAC,EACA,MAAM,OAAK,KAAK,OAAO,OAAO,CAAC;IACpC,OAAO;AACL,WAAK,SAAS;AACd,WAAK,OAAO,SAAS;IACvB;EACF;EAEQ,OAAO,OAAa;AAC1B,SAAK,QAAO;AACZ,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC;AAAQ;AAEb,UAAM,MAAM,KAAK,eAAe,eAAe;AAC/C,UAAM,YAAY,sBAAS,oBAAoB,KAAK,IAAI;AAExD,UAAM,IAAI,KAAK,QAAQ,cAAc,oBAAoB,KAAK,IAAI;AAClE,QAAI,GAAG;AACL,YAAM,QAAQ,EAAE,QAAQ,UAAU,IAAI;AACtC,WAAK,SAAS,MAAM,KAAK,MAAM,UAAU;AACzC,YAAM,WAAW,KAAK,OAAO,OAAO,OAAK,EAAE,aAAa,CAAC;AACzD,YAAM,YAAY,EAAE,GAAG,WAAW,QAAQ,KAAK,QAAQ,QAAQ,KAAK,QAAQ,WAAW,UAAU,eAAe,SAAS,CAAC,GAAG,QAAQ,MAAK;AAG1I,WAAK,OAAO,QAAQ,CAAC,GAAG,YAAW;AAEjC,aAAK,sBAAsB,iBAAiB,EAAE,GAAG,WAAW,OAAO,GAAG,YAAY,SAAS,YAAY,EAAE,aAAa,EAAC,CAAE;AAGzH,YAAI,aAAa,aAAa;AAC5B,gBAAM,KAAK,EAAE,UAAU,EAAE,QAAQ,UAAO;AACtC,kBAAM,QAAQ,KAAK,SAAS;AAC5B,gBAAI,MAAM,WAAW,IAAI,KAAK,MAAM,SAAS,IAAI,GAAG;AAClD,oBAAM,SAAS,MAAM,MAAM,GAAG,EAAE,EAAE,KAAI;AACtC,oBAAM,SAAS,0BAAc,cAAc;gBACzC;gBACA,SAAS;gBACT,MAAM;eACP;AACD,gBAAE,aAAa,KAAK,MAAM,OAAO,MAAM,CAAC;YAC1C;UACF,CAAC;QACH;MACF,CAAC;AAED,WAAK,sBAAsB,kBAAkB,SAAS;AAEtD,aAAO,aAAa,OAAO,KAAK,WAAW;IAC7C;EACF;EAEQ,UAAO;AACb,SAAK,OAAO,QAAQ,OAAK,EAAE,eAAe,YAAY,CAAC,CAAC;AACxD,SAAK,SAAS,CAAA;EAChB;EAEA,oBAAiB;AACf,SAAK,QAAO;EACd;EACA,uBAAoB;AAClB,SAAK,QAAO;EACd;;AA5FQ,WAAA;MADP,kDAAqB,OAAO;;;;;",
4
+ "sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils, ActionExpression } from '@dooboostore/core';\nimport { ConvertUtils } from '@dooboostore/core-web';\nimport { attributeHost } from '../decorators';\n\nclass SwcAsync extends HTMLTemplateElement {\n @attributeHost('value')\n _value: any;\n\n @attributeHost('replace-wrap')\n _replaceWrap: string | null;\n\n resultValue?: any;\n\n get value(): boolean {\n return this._value;\n }\n\n set value(nv: any) {\n this.executeAsync(nv);\n }\n\n private _nodes: Node[] = [];\n\n @changedAttributeHost('value')\n private setValue(valueAttr?: string | null) {\n this.executeAsync(this._value);\n }\n\n @changedAttributeHost('replace-wrap')\n private setReplaceWrap() {\n this.executeAsync(this._value);\n }\n\n private executeAsync(result: any = this._value) {\n if (result === undefined || result === null) {\n this.refresh('default');\n return;\n }\n\n if (result instanceof Promise) {\n this.refresh('loading');\n result\n .then(v => {\n this.resultValue = v;\n this.refresh('success');\n })\n .catch(e => {\n console.error('[SWC-ASYNC] Promise rejected:', e);\n this.resultValue = e;\n this.refresh('error');\n });\n } else {\n this.resultValue = result;\n this.refresh('success');\n }\n }\n\n private replaceExpressions(html: string, groupArgs: any, context: any, wrap?: string | null): string {\n const config = wrap ? { wrapExpression: wrap } : undefined;\n const ae = new ActionExpression(html, config);\n const filterOptions = wrap ? { type: 'replace' as const, wrap } : 'replace';\n const win = this.ownerDocument?.defaultView || window;\n\n // @ts-ignore\n for (const expr of ae.getExpressions(filterOptions)) {\n try {\n const value = FunctionUtils.executeReturn({\n script: ConvertUtils.decodeHtmlEntity(expr.script, win.document),\n context,\n args: groupArgs\n });\n ae.replace(expr, String(value));\n } catch (e) {\n console.error(`[SWC] Failed to execute ${expr.original}:`, e);\n }\n }\n return ae.getUnprocessedTemplate();\n }\n\n refresh(state: string = 'default') {\n console.log('rrrrrrrrrrrrrrrrr', state);\n this.cleanup();\n const portal = this.parentElement;\n if (!portal) return;\n\n const win = this.ownerDocument?.defaultView || window;\n const helperSet = SwcUtils.getHelperAndHostSet(win, this);\n\n const t = this.content.querySelector(`template[is=\"swc-${state}\"]`) as HTMLTemplateElement;\n if (t) {\n let htmlString = t.innerHTML;\n const groupArgs = { ...helperSet, $value: this._value, $state: state };\n\n htmlString = this.replaceExpressions(htmlString, groupArgs, this, this._replaceWrap);\n\n const temp = this.ownerDocument?.createElement('template') || document.createElement('template');\n temp.innerHTML = htmlString;\n const content = temp.content;\n\n this._nodes = Array.from(content.childNodes);\n portal.insertBefore(content, this.nextSibling);\n }\n }\n\n private cleanup() {\n this._nodes.forEach(n => n.parentElement?.removeChild(n));\n this._nodes = [];\n }\n\n disconnectedCallback() {\n this.cleanup();\n }\n}\n"],
5
+ "mappings": "AAAA,kCAAqC;AACrC,mBAAyB;AACzB,kBAAgD;AAChD,sBAA6B;AAC7B,wBAA8B;;;;;;;;;;AAE9B,MAAM,iBAAiB,oBAAmB;EAA1C,cAAA;;AAiBU,SAAA,SAAiB,CAAA;EA2F3B;EAnGE,IAAI,QAAK;AACP,WAAO,KAAK;EACd;EAEA,IAAI,MAAM,IAAO;AACf,SAAK,aAAa,EAAE;EACtB;EAKQ,SAAS,WAAyB;AACxC,SAAK,aAAa,KAAK,MAAM;EAC/B;EAGQ,iBAAc;AACpB,SAAK,aAAa,KAAK,MAAM;EAC/B;EAEQ,aAAa,SAAc,KAAK,QAAM;AAC5C,QAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,WAAK,QAAQ,SAAS;AACtB;IACF;AAEA,QAAI,kBAAkB,SAAS;AAC7B,WAAK,QAAQ,SAAS;AACtB,aACG,KAAK,OAAI;AACR,aAAK,cAAc;AACnB,aAAK,QAAQ,SAAS;MACxB,CAAC,EACA,MAAM,OAAI;AACT,gBAAQ,MAAM,iCAAiC,CAAC;AAChD,aAAK,cAAc;AACnB,aAAK,QAAQ,OAAO;MACtB,CAAC;IACL,OAAO;AACL,WAAK,cAAc;AACnB,WAAK,QAAQ,SAAS;IACxB;EACF;EAEQ,mBAAmB,MAAc,WAAgB,SAAc,MAAoB;AACzF,UAAM,SAAS,OAAO,EAAE,gBAAgB,KAAI,IAAK;AACjD,UAAM,KAAK,IAAI,6BAAiB,MAAM,MAAM;AAC5C,UAAM,gBAAgB,OAAO,EAAE,MAAM,WAAoB,KAAI,IAAK;AAClE,UAAM,MAAM,KAAK,eAAe,eAAe;AAG/C,eAAW,QAAQ,GAAG,eAAe,aAAa,GAAG;AACnD,UAAI;AACF,cAAM,QAAQ,0BAAc,cAAc;UACxC,QAAQ,6BAAa,iBAAiB,KAAK,QAAQ,IAAI,QAAQ;UAC/D;UACA,MAAM;SACP;AACD,WAAG,QAAQ,MAAM,OAAO,KAAK,CAAC;MAChC,SAAS,GAAG;AACV,gBAAQ,MAAM,2BAA2B,KAAK,QAAQ,KAAK,CAAC;MAC9D;IACF;AACA,WAAO,GAAG,uBAAsB;EAClC;EAEA,QAAQ,QAAgB,WAAS;AAC/B,YAAQ,IAAI,qBAAqB,KAAK;AACtC,SAAK,QAAO;AACZ,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC;AAAQ;AAEb,UAAM,MAAM,KAAK,eAAe,eAAe;AAC/C,UAAM,YAAY,sBAAS,oBAAoB,KAAK,IAAI;AAExD,UAAM,IAAI,KAAK,QAAQ,cAAc,oBAAoB,KAAK,IAAI;AAClE,QAAI,GAAG;AACL,UAAI,aAAa,EAAE;AACnB,YAAM,YAAY,EAAE,GAAG,WAAW,QAAQ,KAAK,QAAQ,QAAQ,MAAK;AAEpE,mBAAa,KAAK,mBAAmB,YAAY,WAAW,MAAM,KAAK,YAAY;AAEnF,YAAM,OAAO,KAAK,eAAe,cAAc,UAAU,KAAK,SAAS,cAAc,UAAU;AAC/F,WAAK,YAAY;AACjB,YAAM,UAAU,KAAK;AAErB,WAAK,SAAS,MAAM,KAAK,QAAQ,UAAU;AAC3C,aAAO,aAAa,SAAS,KAAK,WAAW;IAC/C;EACF;EAEQ,UAAO;AACb,SAAK,OAAO,QAAQ,OAAK,EAAE,eAAe,YAAY,CAAC,CAAC;AACxD,SAAK,SAAS,CAAA;EAChB;EAEA,uBAAoB;AAClB,SAAK,QAAO;EACd;;AAzGA,WAAA;MADC,iCAAc,OAAO;;;AAItB,WAAA;MADC,iCAAc,cAAc;;;AAgBrB,WAAA;MADP,kDAAqB,OAAO;;;;;AAMrB,WAAA;MADP,kDAAqB,cAAc;;;;;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,8 @@
1
1
  var import_changedAttributeHost = require("../decorators/changedAttributeHost");
2
2
  var import_Utils = require("../utils/Utils");
3
3
  var import_core = require("@dooboostore/core");
4
+ var import_core_web = require("@dooboostore/core-web");
5
+ var import_decorators = require("../decorators");
4
6
  var __decorate = function(decorators, target, key, desc) {
5
7
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
6
8
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -14,57 +16,64 @@ class SwcChoose extends HTMLTemplateElement {
14
16
  constructor() {
15
17
  super(...arguments);
16
18
  this._nodes = [];
17
- this._value = null;
18
19
  this._previousTemplate = null;
19
20
  }
20
21
  get value() {
21
22
  return this._value;
22
23
  }
23
24
  set value(nv) {
24
- this._value = nv;
25
- this.render();
25
+ this.refresh(nv);
26
26
  }
27
- _executeCloneCallback(attr, args) {
28
- const script = this.getAttribute(attr);
29
- if (!script)
30
- return;
31
- import_core.FunctionUtils.execute({ script, context: this, args });
27
+ setValue() {
28
+ this.refresh();
32
29
  }
33
- refresh(valueAttr) {
34
- valueAttr ?? (valueAttr = this.getAttribute("value"));
35
- if (valueAttr === null) {
36
- this.value = null;
37
- return;
38
- }
39
- if (valueAttr.startsWith("{{") && valueAttr.endsWith("}}")) {
40
- const script = valueAttr.slice(2, -2).trim();
41
- const win = this.ownerDocument?.defaultView || window;
42
- const helperAndHostSet = import_Utils.SwcUtils.getHelperAndHostSet(win, import_Utils.SwcUtils.findNearestSwcHost(this));
43
- const result = import_core.FunctionUtils.executeReturn({ script, context: this, args: helperAndHostSet });
44
- this.value = result;
45
- } else {
46
- this.value = valueAttr;
30
+ setReplaceWrap(replaceWrapAttr) {
31
+ this.refresh();
32
+ }
33
+ replaceExpressions(html, groupArgs, context, wrap) {
34
+ const config = wrap ? { wrapExpression: wrap } : void 0;
35
+ const ae = new import_core.ActionExpression(html, config);
36
+ const filterOptions = wrap ? { type: "replace", wrap } : "replace";
37
+ const win = this.ownerDocument?.defaultView || window;
38
+ for (const expr of ae.getExpressions(filterOptions)) {
39
+ try {
40
+ const value = import_core.FunctionUtils.executeReturn({
41
+ script: import_core_web.ConvertUtils.decodeHtmlEntity(expr.script, win.document),
42
+ context,
43
+ args: groupArgs
44
+ });
45
+ ae.replace(expr, String(value));
46
+ } catch (e) {
47
+ console.error(`[SWC] Failed to execute ${expr.original}:`, e);
48
+ }
47
49
  }
50
+ return ae.getUnprocessedTemplate();
48
51
  }
49
- render() {
52
+ refresh(value = this._value) {
53
+ const portal = this.parentElement;
54
+ if (!portal)
55
+ return;
50
56
  const win = this.ownerDocument?.defaultView || window;
51
57
  const helperSet = import_Utils.SwcUtils.getHelperAndHostSet(win, this);
58
+ const groupArgs = { ...helperSet, $value: value };
52
59
  const templates = Array.from(this.content.querySelectorAll("template"));
53
60
  let selected = null;
54
61
  for (const t of templates) {
55
62
  if (t.getAttribute("is") === "swc-when") {
63
+ const attrVal = t.getAttribute("value") || "";
56
64
  let matches = false;
57
- const value = t.getAttribute("value") || "";
58
- if (value.startsWith("{{") && value.endsWith("}}")) {
59
- const script = value.slice(2, -2).trim();
65
+ const ae = new import_core.ActionExpression(attrVal);
66
+ const expr = ae.getFirstExpression("replace");
67
+ if (expr) {
68
+ const decodedScript = import_core_web.ConvertUtils.decodeHtmlEntity(expr.script, win.document);
60
69
  const result = import_core.FunctionUtils.executeReturn({
61
- script,
70
+ script: decodedScript,
62
71
  context: t,
63
- args: { ...helperSet, $value: this._value }
72
+ args: groupArgs
64
73
  });
65
- matches = result === true;
74
+ matches = !!result;
66
75
  } else {
67
- matches = String(value) === String(this._value);
76
+ matches = String(attrVal) === String(value);
68
77
  }
69
78
  if (matches) {
70
79
  selected = t;
@@ -73,54 +82,51 @@ class SwcChoose extends HTMLTemplateElement {
73
82
  }
74
83
  }
75
84
  const target = selected || this.content.querySelector('template[is="swc-otherwise"]');
76
- const targetHasSkipIfSame = target?.hasAttribute("skip-if-same");
77
- const shouldSkip = (this.hasAttribute("skip-if-same") || targetHasSkipIfSame) && this._previousTemplate === target;
78
- if (shouldSkip) {
85
+ const skipValue = target?.getAttribute?.("skip-if-same");
86
+ const skipValue2 = this._previousTemplate?.getAttribute?.("skip-if-same");
87
+ const hasSkipIfSame = target?.hasAttribute?.("skip-if-same");
88
+ const isSame = this._previousTemplate === target;
89
+ if (hasSkipIfSame && isSame) {
79
90
  return;
80
91
  }
81
92
  this.cleanup();
82
93
  this._previousTemplate = target;
83
94
  if (target) {
84
- const clone = target.content.cloneNode(true);
85
- this._nodes = Array.from(clone.childNodes);
86
- const elements = this._nodes.filter((n) => n.nodeType === 1);
87
- const groupArgs = { ...helperSet, $value: this._value, $nodes: this._nodes, $elements: elements, $firstElement: elements[0] };
88
- this._nodes.forEach((n, nodeIdx) => {
89
- this._executeCloneCallback("on-clone-node", { ...groupArgs, $node: n, $nodeIndex: nodeIdx, $isElement: n.nodeType === 1 });
90
- if (n instanceof HTMLElement) {
91
- Array.from(n.attributes).forEach((attr) => {
92
- const value = attr.value || "";
93
- if (value.startsWith("{{") && value.endsWith("}}")) {
94
- const script = value.slice(2, -2).trim();
95
- const result = import_core.FunctionUtils.executeReturn({
96
- script,
97
- context: n,
98
- args: { ...groupArgs, $value: this._value }
99
- });
100
- n.setAttribute(attr.name, String(result));
101
- }
102
- });
103
- }
104
- });
105
- this._executeCloneCallback("on-clone-nodes", groupArgs);
106
- this.parentElement?.insertBefore(clone, this.nextSibling);
95
+ let htmlString = target.innerHTML;
96
+ htmlString = this.replaceExpressions(htmlString, groupArgs, this, this._replaceWrap);
97
+ const result = this.ownerDocument?.createElement("template") || document.createElement("template");
98
+ result.innerHTML = htmlString;
99
+ const processedFragment = result.content;
100
+ this._nodes = Array.from(processedFragment.childNodes);
101
+ portal.insertBefore(processedFragment, this.nextSibling);
107
102
  }
108
103
  }
109
104
  cleanup() {
110
105
  this._nodes.forEach((n) => n.parentElement?.removeChild(n));
111
106
  this._nodes = [];
112
107
  }
113
- connectedCallback() {
114
- this.refresh();
115
- }
116
108
  disconnectedCallback() {
117
109
  this.cleanup();
118
110
  }
119
111
  }
112
+ __decorate([
113
+ (0, import_decorators.attributeHost)("value"),
114
+ __metadata("design:type", Object)
115
+ ], SwcChoose.prototype, "_value", void 0);
116
+ __decorate([
117
+ (0, import_decorators.attributeHost)("replace-wrap"),
118
+ __metadata("design:type", String)
119
+ ], SwcChoose.prototype, "_replaceWrap", void 0);
120
120
  __decorate([
121
121
  (0, import_changedAttributeHost.changedAttributeHost)("value"),
122
122
  __metadata("design:type", Function),
123
+ __metadata("design:paramtypes", []),
124
+ __metadata("design:returntype", void 0)
125
+ ], SwcChoose.prototype, "setValue", null);
126
+ __decorate([
127
+ (0, import_changedAttributeHost.changedAttributeHost)("replace-wrap"),
128
+ __metadata("design:type", Function),
123
129
  __metadata("design:paramtypes", [String]),
124
130
  __metadata("design:returntype", void 0)
125
- ], SwcChoose.prototype, "refresh", null);
131
+ ], SwcChoose.prototype, "setReplaceWrap", null);
126
132
  //# sourceMappingURL=SwcChoose.js.map