@dooboostore/simple-web-component 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +70 -78
  2. package/dist/cjs/decorators/addEventListener.js +42 -0
  3. package/dist/cjs/decorators/addEventListener.js.map +7 -0
  4. package/dist/cjs/decorators/attributeChanged.js +24 -4
  5. package/dist/cjs/decorators/attributeChanged.js.map +2 -2
  6. package/dist/cjs/decorators/{element.js → elementDefind.js} +91 -13
  7. package/dist/cjs/decorators/elementDefind.js.map +7 -0
  8. package/dist/cjs/decorators/query.js +53 -0
  9. package/dist/cjs/decorators/query.js.map +7 -0
  10. package/dist/cjs/decorators/queryAll.js +53 -0
  11. package/dist/cjs/decorators/queryAll.js.map +7 -0
  12. package/dist/cjs/elements/SwcChoose.js +117 -0
  13. package/dist/cjs/elements/SwcChoose.js.map +7 -0
  14. package/dist/cjs/elements/SwcForOf.js +126 -0
  15. package/dist/cjs/elements/SwcForOf.js.map +7 -0
  16. package/dist/cjs/elements/SwcHTMLElementBase.js +102 -0
  17. package/dist/cjs/elements/SwcHTMLElementBase.js.map +7 -0
  18. package/dist/cjs/elements/SwcIf.js +127 -0
  19. package/dist/cjs/elements/SwcIf.js.map +7 -0
  20. package/dist/cjs/elements/SwcObject.js +115 -0
  21. package/dist/cjs/elements/SwcObject.js.map +7 -0
  22. package/dist/cjs/elements/SwcOther.js +56 -0
  23. package/dist/cjs/elements/SwcOther.js.map +7 -0
  24. package/dist/cjs/elements/SwcWhen.js +56 -0
  25. package/dist/cjs/elements/SwcWhen.js.map +7 -0
  26. package/dist/cjs/index.js +11 -1
  27. package/dist/cjs/index.js.map +2 -2
  28. package/dist/esm/decorators/addEventListener.js +23 -0
  29. package/dist/esm/decorators/addEventListener.js.map +7 -0
  30. package/dist/esm/decorators/attributeChanged.js +24 -4
  31. package/dist/esm/decorators/attributeChanged.js.map +2 -2
  32. package/dist/esm/decorators/{element.js → elementDefind.js} +89 -11
  33. package/dist/esm/decorators/elementDefind.js.map +7 -0
  34. package/dist/esm/decorators/query.js +34 -0
  35. package/dist/esm/decorators/query.js.map +7 -0
  36. package/dist/esm/decorators/queryAll.js +34 -0
  37. package/dist/esm/decorators/queryAll.js.map +7 -0
  38. package/dist/esm/elements/SwcChoose.js +98 -0
  39. package/dist/esm/elements/SwcChoose.js.map +7 -0
  40. package/dist/esm/elements/SwcForOf.js +107 -0
  41. package/dist/esm/elements/SwcForOf.js.map +7 -0
  42. package/dist/esm/elements/SwcHTMLElementBase.js +83 -0
  43. package/dist/esm/elements/SwcHTMLElementBase.js.map +7 -0
  44. package/dist/esm/elements/SwcIf.js +108 -0
  45. package/dist/esm/elements/SwcIf.js.map +7 -0
  46. package/dist/esm/elements/SwcObject.js +96 -0
  47. package/dist/esm/elements/SwcObject.js.map +7 -0
  48. package/dist/esm/elements/SwcOther.js +37 -0
  49. package/dist/esm/elements/SwcOther.js.map +7 -0
  50. package/dist/esm/elements/SwcWhen.js +37 -0
  51. package/dist/esm/elements/SwcWhen.js.map +7 -0
  52. package/dist/esm/index.js +11 -1
  53. package/dist/esm/index.js.map +2 -2
  54. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +744 -14
  55. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  56. package/dist/types/decorators/addEventListener.d.ts +16 -0
  57. package/dist/types/decorators/addEventListener.d.ts.map +1 -0
  58. package/dist/types/decorators/attributeChanged.d.ts +3 -1
  59. package/dist/types/decorators/attributeChanged.d.ts.map +1 -1
  60. package/dist/types/decorators/{element.d.ts → elementDefind.d.ts} +2 -2
  61. package/dist/types/decorators/elementDefind.d.ts.map +1 -0
  62. package/dist/types/decorators/query.d.ts +13 -0
  63. package/dist/types/decorators/query.d.ts.map +1 -0
  64. package/dist/types/decorators/queryAll.d.ts +13 -0
  65. package/dist/types/decorators/queryAll.d.ts.map +1 -0
  66. package/dist/types/elements/SwcChoose.d.ts +12 -0
  67. package/dist/types/elements/SwcChoose.d.ts.map +1 -0
  68. package/dist/types/elements/SwcForOf.d.ts +14 -0
  69. package/dist/types/elements/SwcForOf.d.ts.map +1 -0
  70. package/dist/types/elements/SwcHTMLElementBase.d.ts +14 -0
  71. package/dist/types/elements/SwcHTMLElementBase.d.ts.map +1 -0
  72. package/dist/types/elements/SwcIf.d.ts +14 -0
  73. package/dist/types/elements/SwcIf.d.ts.map +1 -0
  74. package/dist/types/elements/SwcObject.d.ts +14 -0
  75. package/dist/types/elements/SwcObject.d.ts.map +1 -0
  76. package/dist/types/elements/SwcOther.d.ts +5 -0
  77. package/dist/types/elements/SwcOther.d.ts.map +1 -0
  78. package/dist/types/elements/SwcWhen.d.ts +5 -0
  79. package/dist/types/elements/SwcWhen.d.ts.map +1 -0
  80. package/dist/types/index.d.ts +11 -1
  81. package/dist/types/index.d.ts.map +1 -1
  82. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +744 -14
  83. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  84. package/package.json +1 -1
  85. package/src/decorators/addEventListener.ts +35 -0
  86. package/src/decorators/attributeChanged.ts +29 -6
  87. package/src/decorators/{element.ts → elementDefind.ts} +121 -11
  88. package/src/decorators/query.ts +46 -0
  89. package/src/decorators/queryAll.ts +46 -0
  90. package/src/elements/SwcChoose.ts +83 -0
  91. package/src/elements/SwcForOf.ts +95 -0
  92. package/src/elements/SwcHTMLElementBase.ts +93 -0
  93. package/src/elements/SwcIf.ts +92 -0
  94. package/src/elements/SwcObject.ts +78 -0
  95. package/src/elements/SwcOther.ts +14 -0
  96. package/src/elements/SwcWhen.ts +14 -0
  97. package/src/index.ts +12 -2
  98. package/dist/cjs/decorators/element.js.map +0 -7
  99. package/dist/esm/decorators/element.js.map +0 -7
  100. package/dist/types/decorators/element.d.ts.map +0 -1
@@ -20,16 +20,33 @@ var dooboostoreSimpleWebComponent = (() => {
20
20
  // src/bundle-entry.ts
21
21
  var bundle_entry_exports = {};
22
22
  __export(bundle_entry_exports, {
23
+ ADD_EVENT_LISTENER_METADATA_KEY: () => ADD_EVENT_LISTENER_METADATA_KEY,
23
24
  ATTRIBUTE_CHANGED_METADATA_KEY: () => ATTRIBUTE_CHANGED_METADATA_KEY,
25
+ ATTRIBUTE_CHANGED_WILDCARD: () => ATTRIBUTE_CHANGED_WILDCARD,
24
26
  ELEMENT_CONFIG_KEY: () => ELEMENT_CONFIG_KEY,
27
+ QUERY_ALL_METADATA_KEY: () => QUERY_ALL_METADATA_KEY,
28
+ QUERY_METADATA_KEY: () => QUERY_METADATA_KEY,
25
29
  STYLE_METHOD_KEY: () => STYLE_METHOD_KEY,
30
+ SwcChoose: () => SwcChoose,
31
+ SwcForOf: () => SwcForOf,
32
+ SwcHTMLElementBase: () => SwcHTMLElementBase,
33
+ SwcIf: () => SwcIf,
34
+ SwcObject: () => SwcObject,
35
+ SwcOther: () => SwcOther,
36
+ SwcWhen: () => SwcWhen,
26
37
  TEMPLATE_METHOD_KEY: () => TEMPLATE_METHOD_KEY,
38
+ addEventListener: () => addEventListener,
27
39
  attributeChanged: () => attributeChanged,
28
- element: () => element,
40
+ elementDefind: () => elementDefind,
41
+ getAddEventListenerMetadata: () => getAddEventListenerMetadata,
29
42
  getAttributeChangedMap: () => getAttributeChangedMap,
30
43
  getElementConfig: () => getElementConfig,
44
+ getQueryAllMetadata: () => getQueryAllMetadata,
45
+ getQueryMetadata: () => getQueryMetadata,
31
46
  getStyleMethod: () => getStyleMethod,
32
47
  getTemplateMethod: () => getTemplateMethod,
48
+ query: () => query,
49
+ queryAll: () => queryAll,
33
50
  style: () => style,
34
51
  template: () => template
35
52
  });
@@ -88,17 +105,36 @@ var dooboostoreSimpleWebComponent = (() => {
88
105
 
89
106
  // src/decorators/attributeChanged.ts
90
107
  var ATTRIBUTE_CHANGED_METADATA_KEY = Symbol("simple-web-component:attribute-changed");
91
- var attributeChanged = (attributeName) => {
92
- return (target, propertyKey, descriptor) => {
108
+ var ATTRIBUTE_CHANGED_WILDCARD = "*";
109
+ function attributeChanged(arg1, arg2, arg3) {
110
+ const decorator = (attributeName, target, propertyKey) => {
93
111
  const constructor = target.constructor;
94
112
  let meta = ReflectUtils.getMetadata(ATTRIBUTE_CHANGED_METADATA_KEY, constructor);
95
113
  if (!meta) {
96
114
  meta = /* @__PURE__ */ new Map();
97
115
  ReflectUtils.defineMetadata(ATTRIBUTE_CHANGED_METADATA_KEY, meta, constructor);
98
116
  }
99
- meta.set(attributeName, propertyKey);
117
+ let methods = meta.get(attributeName);
118
+ if (!methods) {
119
+ methods = [];
120
+ meta.set(attributeName, methods);
121
+ }
122
+ if (!methods.includes(propertyKey)) {
123
+ methods.push(propertyKey);
124
+ }
100
125
  };
101
- };
126
+ if (typeof arg1 === "string") {
127
+ return (target, propertyKey) => {
128
+ decorator(arg1, target, propertyKey);
129
+ };
130
+ } else if (Array.isArray(arg1)) {
131
+ return (target, propertyKey) => {
132
+ arg1.forEach((name) => decorator(name, target, propertyKey));
133
+ };
134
+ } else if (arg1 && arg2) {
135
+ decorator(ATTRIBUTE_CHANGED_WILDCARD, arg1, arg2);
136
+ }
137
+ }
102
138
  var getAttributeChangedMap = (target) => {
103
139
  const constructor = target instanceof Function ? target : target.constructor;
104
140
  return ReflectUtils.getMetadata(ATTRIBUTE_CHANGED_METADATA_KEY, constructor);
@@ -124,7 +160,83 @@ var dooboostoreSimpleWebComponent = (() => {
124
160
  return ReflectUtils.getMetadata(STYLE_METHOD_KEY, constructor);
125
161
  };
126
162
 
127
- // src/decorators/element.ts
163
+ // src/decorators/query.ts
164
+ var QUERY_METADATA_KEY = Symbol("simple-web-component:query");
165
+ var query = (selector, options = { useShadow: true }) => {
166
+ return (target, propertyKey, descriptor) => {
167
+ const isMethod = !!descriptor;
168
+ const constructor = target.constructor;
169
+ let queries = ReflectUtils.getMetadata(QUERY_METADATA_KEY, constructor);
170
+ if (!queries) {
171
+ queries = [];
172
+ ReflectUtils.defineMetadata(QUERY_METADATA_KEY, queries, constructor);
173
+ }
174
+ queries.push({ selector, options, propertyKey, isMethod });
175
+ if (!isMethod) {
176
+ Object.defineProperty(target, propertyKey, {
177
+ get() {
178
+ const root = options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;
179
+ return root.querySelector(selector);
180
+ },
181
+ enumerable: true,
182
+ configurable: true
183
+ });
184
+ }
185
+ };
186
+ };
187
+ var getQueryMetadata = (target) => {
188
+ const constructor = target instanceof Function ? target : target.constructor;
189
+ return ReflectUtils.getMetadata(QUERY_METADATA_KEY, constructor);
190
+ };
191
+
192
+ // src/decorators/queryAll.ts
193
+ var QUERY_ALL_METADATA_KEY = Symbol("simple-web-component:query-all");
194
+ var queryAll = (selector, options = { useShadow: true }) => {
195
+ return (target, propertyKey, descriptor) => {
196
+ const isMethod = !!descriptor;
197
+ const constructor = target.constructor;
198
+ let queries = ReflectUtils.getMetadata(QUERY_ALL_METADATA_KEY, constructor);
199
+ if (!queries) {
200
+ queries = [];
201
+ ReflectUtils.defineMetadata(QUERY_ALL_METADATA_KEY, queries, constructor);
202
+ }
203
+ queries.push({ selector, options, propertyKey, isMethod });
204
+ if (!isMethod) {
205
+ Object.defineProperty(target, propertyKey, {
206
+ get() {
207
+ const root = options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;
208
+ return root.querySelectorAll(selector);
209
+ },
210
+ enumerable: true,
211
+ configurable: true
212
+ });
213
+ }
214
+ };
215
+ };
216
+ var getQueryAllMetadata = (target) => {
217
+ const constructor = target instanceof Function ? target : target.constructor;
218
+ return ReflectUtils.getMetadata(QUERY_ALL_METADATA_KEY, constructor);
219
+ };
220
+
221
+ // src/decorators/addEventListener.ts
222
+ var ADD_EVENT_LISTENER_METADATA_KEY = Symbol("simple-web-component:add-event-listener");
223
+ var addEventListener = (options) => {
224
+ return (target, propertyKey, descriptor) => {
225
+ const constructor = target.constructor;
226
+ let listeners = ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);
227
+ if (!listeners) {
228
+ listeners = [];
229
+ ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);
230
+ }
231
+ listeners.push({ options, propertyKey });
232
+ };
233
+ };
234
+ var getAddEventListenerMetadata = (target) => {
235
+ const constructor = target instanceof Function ? target : target.constructor;
236
+ return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);
237
+ };
238
+
239
+ // src/decorators/elementDefind.ts
128
240
  var ELEMENT_CONFIG_KEY = Symbol("simple-web-component:element-config");
129
241
  var BUILT_IN_TAG_MAP = /* @__PURE__ */ new Map();
130
242
  var registerTag = (className, tagName) => {
@@ -190,7 +302,7 @@ var dooboostoreSimpleWebComponent = (() => {
190
302
  ["HTMLVideoElement", "video"],
191
303
  ["HTMLHeadingElement", "h1"]
192
304
  ].forEach(([cls, tag]) => registerTag(cls, tag));
193
- var element = (inConfig) => (constructor) => {
305
+ var elementDefind = (inConfig) => (constructor) => {
194
306
  const config = typeof inConfig === "string" ? { tagName: inConfig } : inConfig;
195
307
  let extendsTagName = config.extends;
196
308
  if (!extendsTagName) {
@@ -203,7 +315,7 @@ var dooboostoreSimpleWebComponent = (() => {
203
315
  }
204
316
  }
205
317
  const attributeChangedMap = getAttributeChangedMap(constructor);
206
- const observedFromDecorators = attributeChangedMap ? Array.from(attributeChangedMap.keys()) : [];
318
+ const observedFromDecorators = attributeChangedMap ? Array.from(attributeChangedMap.keys()).filter((it) => it !== ATTRIBUTE_CHANGED_WILDCARD) : [];
207
319
  const mergedObservedAttributes = [.../* @__PURE__ */ new Set([...config.observedAttributes ?? [], ...observedFromDecorators])];
208
320
  const NewClass = class extends constructor {
209
321
  static get observedAttributes() {
@@ -211,11 +323,68 @@ var dooboostoreSimpleWebComponent = (() => {
211
323
  }
212
324
  constructor(...args) {
213
325
  super(...args);
326
+ this._observer = null;
327
+ this._boundElements = /* @__PURE__ */ new WeakMap();
214
328
  if (config.useShadow === true && !this.shadowRoot) {
215
329
  this.attachShadow({ mode: "open" });
216
330
  }
217
331
  }
332
+ _syncDecorators() {
333
+ const queryMetadata = getQueryMetadata(this);
334
+ if (queryMetadata) {
335
+ queryMetadata.filter((it) => it.isMethod).forEach((it) => {
336
+ const root = it.options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;
337
+ const element = root.querySelector(it.selector);
338
+ if (element) {
339
+ let bound = this._boundElements.get(element);
340
+ if (!bound) {
341
+ bound = /* @__PURE__ */ new Set();
342
+ this._boundElements.set(element, bound);
343
+ }
344
+ if (!bound.has(it.propertyKey)) {
345
+ this[it.propertyKey](element);
346
+ bound.add(it.propertyKey);
347
+ }
348
+ }
349
+ });
350
+ }
351
+ const queryAllMetadata = getQueryAllMetadata(this);
352
+ if (queryAllMetadata) {
353
+ queryAllMetadata.filter((it) => it.isMethod).forEach((it) => {
354
+ const root = it.options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;
355
+ const elements = root.querySelectorAll(it.selector);
356
+ this[it.propertyKey](elements);
357
+ });
358
+ }
359
+ const eventListeners = getAddEventListenerMetadata(this);
360
+ if (eventListeners) {
361
+ eventListeners.forEach((it) => {
362
+ const { selector, eventName, useShadow, ...options } = it.options;
363
+ const root = useShadow !== false && this.shadowRoot ? this.shadowRoot : this;
364
+ const targetElements = selector ? root.querySelectorAll(selector) : [this];
365
+ targetElements.forEach((targetElement) => {
366
+ if (targetElement) {
367
+ let bound = this._boundElements.get(targetElement);
368
+ if (!bound) {
369
+ bound = /* @__PURE__ */ new Set();
370
+ this._boundElements.set(targetElement, bound);
371
+ }
372
+ const eventKey = `event:${String(it.propertyKey)}:${eventName}`;
373
+ if (!bound.has(eventKey)) {
374
+ targetElement.addEventListener(eventName, (event) => {
375
+ this[it.propertyKey](event);
376
+ }, options);
377
+ bound.add(eventKey);
378
+ }
379
+ }
380
+ });
381
+ });
382
+ }
383
+ }
218
384
  disconnectedCallback() {
385
+ if (this._observer) {
386
+ this._observer.disconnect();
387
+ }
219
388
  if (super.disconnectedCallback) {
220
389
  super.disconnectedCallback();
221
390
  }
@@ -231,9 +400,6 @@ var dooboostoreSimpleWebComponent = (() => {
231
400
  }
232
401
  }
233
402
  async connectedCallback() {
234
- if (super.connectedCallback) {
235
- await super.connectedCallback();
236
- }
237
403
  const templateMethod = getTemplateMethod(this);
238
404
  const styleMethod = getStyleMethod(this);
239
405
  const template2 = templateMethod ? await this[templateMethod]() : void 0;
@@ -255,15 +421,36 @@ var dooboostoreSimpleWebComponent = (() => {
255
421
  } else {
256
422
  this.innerHTML = content;
257
423
  }
424
+ this._syncDecorators();
425
+ this._observer = new MutationObserver(() => {
426
+ this._syncDecorators();
427
+ });
428
+ const target = this.shadowRoot || this;
429
+ this._observer.observe(target, { childList: true, subtree: true });
430
+ if (super.connectedCallback) {
431
+ await super.connectedCallback();
432
+ }
258
433
  }
259
434
  // 4. Handle attribute changes and route to decorated methods
260
435
  attributeChangedCallback(name, oldValue, newValue) {
261
436
  if (super.attributeChangedCallback) {
262
437
  super.attributeChangedCallback(name, oldValue, newValue);
263
438
  }
264
- const methodKey = attributeChangedMap?.get(name);
265
- if (methodKey && typeof this[methodKey] === "function") {
266
- this[methodKey](newValue, oldValue);
439
+ const methodKeys = attributeChangedMap?.get(name);
440
+ if (methodKeys && Array.isArray(methodKeys)) {
441
+ methodKeys.forEach((key) => {
442
+ if (typeof this[key] === "function") {
443
+ this[key](newValue, oldValue, name);
444
+ }
445
+ });
446
+ }
447
+ const wildcardMethodKeys = attributeChangedMap?.get(ATTRIBUTE_CHANGED_WILDCARD);
448
+ if (wildcardMethodKeys && Array.isArray(wildcardMethodKeys)) {
449
+ wildcardMethodKeys.forEach((key) => {
450
+ if (typeof this[key] === "function") {
451
+ this[key](newValue, oldValue, name);
452
+ }
453
+ });
267
454
  }
268
455
  }
269
456
  };
@@ -279,6 +466,549 @@ var dooboostoreSimpleWebComponent = (() => {
279
466
  const constructor = target instanceof Function ? target : target.constructor;
280
467
  return ReflectUtils.getMetadata(ELEMENT_CONFIG_KEY, constructor);
281
468
  };
469
+
470
+ // src/elements/SwcHTMLElementBase.ts
471
+ var SwcHTMLElementBase = class extends HTMLElement {
472
+ constructor() {
473
+ super();
474
+ this._masterTplNodes = [];
475
+ this._asKey = "value";
476
+ this._asIndexKey = "index";
477
+ }
478
+ initCore() {
479
+ this._asKey = this.getAttribute("as") || "value";
480
+ this._asIndexKey = this.getAttribute("as-index") || "index";
481
+ const tplSlot = this.shadowRoot?.getElementById("tpl-slot");
482
+ if (tplSlot) {
483
+ this._masterTplNodes = tplSlot.assignedNodes().map((n) => n.cloneNode(true));
484
+ }
485
+ }
486
+ getValueByPath(obj, path) {
487
+ if (path === this._asKey) return obj;
488
+ if (path.startsWith(`${this._asKey}.`)) {
489
+ return path.split(".").slice(1).reduce((acc, part) => acc && acc[part], obj);
490
+ }
491
+ return void 0;
492
+ }
493
+ applyData(node, data, index) {
494
+ const context = {};
495
+ if (index !== void 0) {
496
+ context[this._asIndexKey] = index.toString();
497
+ }
498
+ const walk = (n) => {
499
+ if (n.nodeType === Node.TEXT_NODE) {
500
+ if (!n._original) n._original = n.textContent;
501
+ let text = n._original;
502
+ text = text.replace(/{{(.*?)}}/g, (match, path) => {
503
+ path = path.trim();
504
+ if (context[path] !== void 0) return context[path];
505
+ const val = this.getValueByPath(data, path);
506
+ return val !== void 0 ? val : match;
507
+ });
508
+ if (n.textContent !== text) n.textContent = text;
509
+ } else if (n.nodeType === Node.ELEMENT_NODE) {
510
+ const el = n;
511
+ Array.from(el.attributes).forEach((a) => {
512
+ if (!a._original) a._original = a.value;
513
+ let val = a._original;
514
+ val = val.replace(/{{(.*?)}}/g, (match, path) => {
515
+ path = path.trim();
516
+ if (context[path] !== void 0) return context[path];
517
+ const v = this.getValueByPath(data, path);
518
+ return v !== void 0 ? v : match;
519
+ });
520
+ if (a.value !== val) a.value = val;
521
+ });
522
+ el.childNodes.forEach(walk);
523
+ }
524
+ };
525
+ walk(node);
526
+ }
527
+ /**
528
+ * 객체/배열의 변경을 감지하는 Proxy 생성 유틸리티
529
+ */
530
+ createReactiveProxy(target, onChange, onIndexChange) {
531
+ return new Proxy(target, {
532
+ set: (t, prop, val) => {
533
+ const isIndex = !isNaN(Number(prop));
534
+ t[prop] = val;
535
+ if (isIndex && onIndexChange) {
536
+ onIndexChange(Number(prop), val);
537
+ } else {
538
+ onChange();
539
+ }
540
+ return true;
541
+ },
542
+ deleteProperty: (t, prop) => {
543
+ delete t[prop];
544
+ onChange();
545
+ return true;
546
+ }
547
+ });
548
+ }
549
+ };
550
+
551
+ // src/elements/SwcForOf.ts
552
+ var __decorate = function(decorators, target, key, desc) {
553
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
554
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
555
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
556
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
557
+ };
558
+ var __metadata = function(k, v) {
559
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
560
+ };
561
+ var SwcForOf = class SwcForOf2 extends SwcHTMLElementBase {
562
+ constructor() {
563
+ super();
564
+ this._value = [];
565
+ }
566
+ set value(val) {
567
+ if (!Array.isArray(val))
568
+ val = [];
569
+ this._value = this.createReactiveProxy(val, () => this.renderAll(), (idx, v) => this.updateSingleRow(idx, v));
570
+ this.renderAll();
571
+ }
572
+ get value() {
573
+ return this._value;
574
+ }
575
+ styles() {
576
+ return `:host { display: contents; }`;
577
+ }
578
+ renderTemplate() {
579
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
580
+ }
581
+ connectedCallback() {
582
+ this.initCore();
583
+ this.renderAll();
584
+ }
585
+ updateSingleRow(index, newValue) {
586
+ const targets = this.querySelectorAll(`[slot="row-${index}"]`);
587
+ if (targets.length > 0) {
588
+ targets.forEach((target) => this.applyData(target, newValue, index));
589
+ } else {
590
+ this.renderRow(newValue, index);
591
+ }
592
+ }
593
+ renderRow(item, index) {
594
+ if (!this.shadowRoot || this._masterTplNodes.length === 0)
595
+ return;
596
+ const slotName = `row-${index}`;
597
+ if (!this.shadowRoot.querySelector(`slot[name="${slotName}"]`)) {
598
+ const slot = document.createElement("slot");
599
+ slot.name = slotName;
600
+ this.shadowRoot.appendChild(slot);
601
+ }
602
+ this._masterTplNodes.forEach((tplNode) => {
603
+ const clone = tplNode.cloneNode(true);
604
+ if (clone.nodeType === Node.ELEMENT_NODE) {
605
+ clone.setAttribute("slot", slotName);
606
+ clone.style.display = "";
607
+ } else if (clone.nodeType === Node.TEXT_NODE) {
608
+ if (clone.textContent?.trim().length === 0)
609
+ return;
610
+ const span = document.createElement("span");
611
+ span.setAttribute("slot", slotName);
612
+ span.appendChild(clone);
613
+ this.appendChild(span);
614
+ this.applyData(span, item, index);
615
+ return;
616
+ }
617
+ this.appendChild(clone);
618
+ this.applyData(clone, item, index);
619
+ });
620
+ }
621
+ renderAll() {
622
+ if (this._masterTplNodes.length === 0 || !this.shadowRoot)
623
+ return;
624
+ Array.from(this.children).forEach((c) => {
625
+ const slot = c.getAttribute("slot");
626
+ if (slot && slot.startsWith("row-")) {
627
+ c.remove();
628
+ }
629
+ });
630
+ Array.from(this.shadowRoot.querySelectorAll("slot")).forEach((s) => {
631
+ if (s.id !== "tpl-slot")
632
+ s.remove();
633
+ });
634
+ this._value.forEach((item, index) => this.renderRow(item, index));
635
+ }
636
+ };
637
+ __decorate([
638
+ style,
639
+ __metadata("design:type", Function),
640
+ __metadata("design:paramtypes", []),
641
+ __metadata("design:returntype", void 0)
642
+ ], SwcForOf.prototype, "styles", null);
643
+ __decorate([
644
+ template,
645
+ __metadata("design:type", Function),
646
+ __metadata("design:paramtypes", []),
647
+ __metadata("design:returntype", void 0)
648
+ ], SwcForOf.prototype, "renderTemplate", null);
649
+ SwcForOf = __decorate([
650
+ elementDefind({ tagName: "swc-for-of", useShadow: true }),
651
+ __metadata("design:paramtypes", [])
652
+ ], SwcForOf);
653
+
654
+ // src/elements/SwcIf.ts
655
+ var __decorate2 = function(decorators, target, key, desc) {
656
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
657
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
658
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
659
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
660
+ };
661
+ var __metadata2 = function(k, v) {
662
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
663
+ };
664
+ var SwcIf = class SwcIf2 extends SwcHTMLElementBase {
665
+ constructor() {
666
+ super();
667
+ this._value = false;
668
+ this._observer = null;
669
+ }
670
+ set value(val) {
671
+ this._value = val;
672
+ this.render();
673
+ }
674
+ get value() {
675
+ return this._value;
676
+ }
677
+ styles() {
678
+ return `:host { display: contents; }`;
679
+ }
680
+ renderTemplate() {
681
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
682
+ }
683
+ connectedCallback() {
684
+ this.initCore();
685
+ this._observer = new MutationObserver(() => this.render());
686
+ this._observer.observe(this, { attributes: true });
687
+ this.render();
688
+ }
689
+ disconnectedCallback() {
690
+ this._observer?.disconnect();
691
+ }
692
+ render() {
693
+ if (!this.shadowRoot)
694
+ return;
695
+ const attrValue = this.getAttribute("value");
696
+ if (attrValue !== null && attrValue.includes("{{"))
697
+ return;
698
+ let displayValue = attrValue !== null ? attrValue : this._value;
699
+ let isTruthy = !!displayValue;
700
+ if (typeof displayValue === "string") {
701
+ if (displayValue === "false" || displayValue === "0" || displayValue === "")
702
+ isTruthy = false;
703
+ else {
704
+ try {
705
+ isTruthy = !!new Function(`return ${displayValue}`)();
706
+ } catch (e) {
707
+ isTruthy = true;
708
+ }
709
+ }
710
+ }
711
+ Array.from(this.children).forEach((c) => {
712
+ if (c.getAttribute("slot") === "if-content") {
713
+ c.remove();
714
+ }
715
+ });
716
+ const existingSlot = this.shadowRoot.querySelector('slot[name="if-content"]');
717
+ if (existingSlot)
718
+ existingSlot.remove();
719
+ if (isTruthy && this._masterTplNodes.length > 0) {
720
+ const contentSlot = document.createElement("slot");
721
+ contentSlot.name = "if-content";
722
+ this.shadowRoot.appendChild(contentSlot);
723
+ this._masterTplNodes.forEach((tplNode) => {
724
+ const clone = tplNode.cloneNode(true);
725
+ if (clone.nodeType === Node.ELEMENT_NODE) {
726
+ clone.setAttribute("slot", "if-content");
727
+ } else if (clone.nodeType === Node.TEXT_NODE) {
728
+ if (clone.textContent?.trim().length === 0)
729
+ return;
730
+ const span = document.createElement("span");
731
+ span.setAttribute("slot", "if-content");
732
+ span.appendChild(clone);
733
+ this.appendChild(span);
734
+ return;
735
+ }
736
+ this.appendChild(clone);
737
+ });
738
+ }
739
+ }
740
+ };
741
+ __decorate2([
742
+ style,
743
+ __metadata2("design:type", Function),
744
+ __metadata2("design:paramtypes", []),
745
+ __metadata2("design:returntype", void 0)
746
+ ], SwcIf.prototype, "styles", null);
747
+ __decorate2([
748
+ template,
749
+ __metadata2("design:type", Function),
750
+ __metadata2("design:paramtypes", []),
751
+ __metadata2("design:returntype", void 0)
752
+ ], SwcIf.prototype, "renderTemplate", null);
753
+ SwcIf = __decorate2([
754
+ elementDefind({ tagName: "swc-if", useShadow: true }),
755
+ __metadata2("design:paramtypes", [])
756
+ ], SwcIf);
757
+
758
+ // src/elements/SwcChoose.ts
759
+ var __decorate3 = function(decorators, target, key, desc) {
760
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
761
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
762
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
763
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
764
+ };
765
+ var __metadata3 = function(k, v) {
766
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
767
+ };
768
+ var SwcChoose = class SwcChoose2 extends HTMLElement {
769
+ constructor() {
770
+ super(...arguments);
771
+ this._observer = null;
772
+ this._value = void 0;
773
+ }
774
+ set value(val) {
775
+ this._value = val;
776
+ this.evaluate();
777
+ }
778
+ get value() {
779
+ return this._value;
780
+ }
781
+ styles() {
782
+ return `:host { display: contents; }`;
783
+ }
784
+ render() {
785
+ return `<slot id="choose-slot"></slot>`;
786
+ }
787
+ connectedCallback() {
788
+ this._observer = new MutationObserver(() => this.evaluate());
789
+ this._observer.observe(this, { attributes: true, subtree: true, childList: true });
790
+ this.evaluate();
791
+ }
792
+ disconnectedCallback() {
793
+ this._observer?.disconnect();
794
+ }
795
+ evaluate() {
796
+ const whens = Array.from(this.querySelectorAll("swc-when"));
797
+ const other = this.querySelector("swc-other");
798
+ let matched = false;
799
+ const chooseValue = this.getAttribute("value") ?? this._value;
800
+ whens.forEach((when) => {
801
+ if (matched) {
802
+ when.style.display = "none";
803
+ return;
804
+ }
805
+ const testAttr = when.getAttribute("test");
806
+ if (testAttr === null)
807
+ return;
808
+ if (testAttr.includes("{{"))
809
+ return;
810
+ let isConditionMet = false;
811
+ if (chooseValue !== void 0 && chooseValue !== null) {
812
+ isConditionMet = String(chooseValue) === String(testAttr);
813
+ } else {
814
+ try {
815
+ if (testAttr === "true")
816
+ isConditionMet = true;
817
+ else if (testAttr === "false")
818
+ isConditionMet = false;
819
+ else
820
+ isConditionMet = !!new Function(`return ${testAttr}`)();
821
+ } catch (e) {
822
+ isConditionMet = false;
823
+ }
824
+ }
825
+ if (isConditionMet) {
826
+ when.style.display = "";
827
+ matched = true;
828
+ } else {
829
+ when.style.display = "none";
830
+ }
831
+ });
832
+ if (other) {
833
+ other.style.display = matched ? "none" : "";
834
+ }
835
+ }
836
+ };
837
+ __decorate3([
838
+ style,
839
+ __metadata3("design:type", Function),
840
+ __metadata3("design:paramtypes", []),
841
+ __metadata3("design:returntype", void 0)
842
+ ], SwcChoose.prototype, "styles", null);
843
+ __decorate3([
844
+ template,
845
+ __metadata3("design:type", Function),
846
+ __metadata3("design:paramtypes", []),
847
+ __metadata3("design:returntype", void 0)
848
+ ], SwcChoose.prototype, "render", null);
849
+ SwcChoose = __decorate3([
850
+ elementDefind({ tagName: "swc-choose", useShadow: true })
851
+ ], SwcChoose);
852
+
853
+ // src/elements/SwcWhen.ts
854
+ var __decorate4 = function(decorators, target, key, desc) {
855
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
856
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
857
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
858
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
859
+ };
860
+ var __metadata4 = function(k, v) {
861
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
862
+ };
863
+ var SwcWhen = class SwcWhen2 extends HTMLElement {
864
+ styles() {
865
+ return `:host { display: contents; }`;
866
+ }
867
+ render() {
868
+ return `<slot></slot>`;
869
+ }
870
+ };
871
+ __decorate4([
872
+ style,
873
+ __metadata4("design:type", Function),
874
+ __metadata4("design:paramtypes", []),
875
+ __metadata4("design:returntype", void 0)
876
+ ], SwcWhen.prototype, "styles", null);
877
+ __decorate4([
878
+ template,
879
+ __metadata4("design:type", Function),
880
+ __metadata4("design:paramtypes", []),
881
+ __metadata4("design:returntype", void 0)
882
+ ], SwcWhen.prototype, "render", null);
883
+ SwcWhen = __decorate4([
884
+ elementDefind({ tagName: "swc-when", useShadow: true })
885
+ ], SwcWhen);
886
+
887
+ // src/elements/SwcOther.ts
888
+ var __decorate5 = function(decorators, target, key, desc) {
889
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
890
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
891
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
892
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
893
+ };
894
+ var __metadata5 = function(k, v) {
895
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
896
+ };
897
+ var SwcOther = class SwcOther2 extends HTMLElement {
898
+ styles() {
899
+ return `:host { display: contents; }`;
900
+ }
901
+ render() {
902
+ return `<slot></slot>`;
903
+ }
904
+ };
905
+ __decorate5([
906
+ style,
907
+ __metadata5("design:type", Function),
908
+ __metadata5("design:paramtypes", []),
909
+ __metadata5("design:returntype", void 0)
910
+ ], SwcOther.prototype, "styles", null);
911
+ __decorate5([
912
+ template,
913
+ __metadata5("design:type", Function),
914
+ __metadata5("design:paramtypes", []),
915
+ __metadata5("design:returntype", void 0)
916
+ ], SwcOther.prototype, "render", null);
917
+ SwcOther = __decorate5([
918
+ elementDefind({ tagName: "swc-other", useShadow: true })
919
+ ], SwcOther);
920
+
921
+ // src/elements/SwcObject.ts
922
+ var __decorate6 = function(decorators, target, key, desc) {
923
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
924
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
925
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
926
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
927
+ };
928
+ var __metadata6 = function(k, v) {
929
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
930
+ };
931
+ var SwcObject = class SwcObject2 extends SwcHTMLElementBase {
932
+ constructor() {
933
+ super();
934
+ this._value = {};
935
+ this._renderedNodes = [];
936
+ }
937
+ set value(val) {
938
+ if (typeof val !== "object" || val === null)
939
+ val = {};
940
+ this._value = this.createReactiveProxy(val, () => this.updateUI());
941
+ this.render();
942
+ }
943
+ get value() {
944
+ return this._value;
945
+ }
946
+ styles() {
947
+ return `:host { display: contents; }`;
948
+ }
949
+ renderTemplate() {
950
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
951
+ }
952
+ connectedCallback() {
953
+ this.initCore();
954
+ this.render();
955
+ }
956
+ updateUI() {
957
+ this._renderedNodes.forEach((node) => {
958
+ this.applyData(node, this._value);
959
+ });
960
+ }
961
+ render() {
962
+ if (!this.shadowRoot || this._masterTplNodes.length === 0)
963
+ return;
964
+ this._renderedNodes.forEach((n) => {
965
+ if (n.parentElement === this)
966
+ this.removeChild(n);
967
+ });
968
+ this._renderedNodes = [];
969
+ let slot = this.shadowRoot.querySelector('slot[name="obj-content"]');
970
+ if (!slot) {
971
+ slot = document.createElement("slot");
972
+ slot.name = "obj-content";
973
+ this.shadowRoot.appendChild(slot);
974
+ }
975
+ this._masterTplNodes.forEach((tplNode) => {
976
+ const clone = tplNode.cloneNode(true);
977
+ if (clone.nodeType === Node.ELEMENT_NODE) {
978
+ clone.setAttribute("slot", "obj-content");
979
+ } else if (clone.nodeType === Node.TEXT_NODE) {
980
+ if (clone.textContent?.trim().length === 0)
981
+ return;
982
+ const span = document.createElement("span");
983
+ span.setAttribute("slot", "obj-content");
984
+ span.appendChild(clone);
985
+ this.appendChild(span);
986
+ this._renderedNodes.push(span);
987
+ this.applyData(span, this._value);
988
+ return;
989
+ }
990
+ this.appendChild(clone);
991
+ this._renderedNodes.push(clone);
992
+ this.applyData(clone, this._value);
993
+ });
994
+ }
995
+ };
996
+ __decorate6([
997
+ style,
998
+ __metadata6("design:type", Function),
999
+ __metadata6("design:paramtypes", []),
1000
+ __metadata6("design:returntype", void 0)
1001
+ ], SwcObject.prototype, "styles", null);
1002
+ __decorate6([
1003
+ template,
1004
+ __metadata6("design:type", Function),
1005
+ __metadata6("design:paramtypes", []),
1006
+ __metadata6("design:returntype", void 0)
1007
+ ], SwcObject.prototype, "renderTemplate", null);
1008
+ SwcObject = __decorate6([
1009
+ elementDefind({ tagName: "swc-object", useShadow: true }),
1010
+ __metadata6("design:paramtypes", [])
1011
+ ], SwcObject);
282
1012
  return __toCommonJS(bundle_entry_exports);
283
1013
  })();
284
1014
  //# sourceMappingURL=dooboostore-simple-web-component.umd.js.map