@dooboostore/simple-web-component 1.0.1 → 1.0.3

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 (69) hide show
  1. package/README.md +28 -33
  2. package/dist/cjs/decorators/{elementDefind.js → elementDefine.js} +6 -6
  3. package/dist/cjs/decorators/{elementDefind.js.map → elementDefine.js.map} +2 -2
  4. package/dist/cjs/decorators/query.js.map +1 -1
  5. package/dist/cjs/decorators/queryAll.js.map +1 -1
  6. package/dist/cjs/elements/SwcChoose.js +1 -1
  7. package/dist/cjs/elements/SwcChoose.js.map +1 -1
  8. package/dist/cjs/elements/SwcForOf.js +7 -77
  9. package/dist/cjs/elements/SwcForOf.js.map +2 -2
  10. package/dist/cjs/elements/SwcHTMLElementBase.js +102 -0
  11. package/dist/cjs/elements/SwcHTMLElementBase.js.map +7 -0
  12. package/dist/cjs/elements/SwcIf.js +6 -14
  13. package/dist/cjs/elements/SwcIf.js.map +2 -2
  14. package/dist/cjs/elements/SwcObject.js +115 -0
  15. package/dist/cjs/elements/SwcObject.js.map +7 -0
  16. package/dist/cjs/elements/SwcOther.js +1 -1
  17. package/dist/cjs/elements/SwcOther.js.map +1 -1
  18. package/dist/cjs/elements/SwcWhen.js +1 -1
  19. package/dist/cjs/elements/SwcWhen.js.map +1 -1
  20. package/dist/cjs/index.js +3 -1
  21. package/dist/cjs/index.js.map +2 -2
  22. package/dist/esm/decorators/{elementDefind.js → elementDefine.js} +3 -3
  23. package/dist/esm/decorators/{elementDefind.js.map → elementDefine.js.map} +2 -2
  24. package/dist/esm/decorators/query.js.map +1 -1
  25. package/dist/esm/decorators/queryAll.js.map +1 -1
  26. package/dist/esm/elements/SwcChoose.js +2 -2
  27. package/dist/esm/elements/SwcChoose.js.map +1 -1
  28. package/dist/esm/elements/SwcForOf.js +8 -78
  29. package/dist/esm/elements/SwcForOf.js.map +2 -2
  30. package/dist/esm/elements/SwcHTMLElementBase.js +83 -0
  31. package/dist/esm/elements/SwcHTMLElementBase.js.map +7 -0
  32. package/dist/esm/elements/SwcIf.js +7 -15
  33. package/dist/esm/elements/SwcIf.js.map +2 -2
  34. package/dist/esm/elements/SwcObject.js +96 -0
  35. package/dist/esm/elements/SwcObject.js.map +7 -0
  36. package/dist/esm/elements/SwcOther.js +2 -2
  37. package/dist/esm/elements/SwcOther.js.map +1 -1
  38. package/dist/esm/elements/SwcWhen.js +2 -2
  39. package/dist/esm/elements/SwcWhen.js.map +1 -1
  40. package/dist/esm/index.js +3 -1
  41. package/dist/esm/index.js.map +2 -2
  42. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +192 -97
  43. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  44. package/dist/types/decorators/{elementDefind.d.ts → elementDefine.d.ts} +2 -2
  45. package/dist/types/decorators/{elementDefind.d.ts.map → elementDefine.d.ts.map} +1 -1
  46. package/dist/types/elements/SwcForOf.d.ts +2 -4
  47. package/dist/types/elements/SwcForOf.d.ts.map +1 -1
  48. package/dist/types/elements/SwcHTMLElementBase.d.ts +14 -0
  49. package/dist/types/elements/SwcHTMLElementBase.d.ts.map +1 -0
  50. package/dist/types/elements/SwcIf.d.ts +2 -2
  51. package/dist/types/elements/SwcIf.d.ts.map +1 -1
  52. package/dist/types/elements/SwcObject.d.ts +14 -0
  53. package/dist/types/elements/SwcObject.d.ts.map +1 -0
  54. package/dist/types/index.d.ts +3 -1
  55. package/dist/types/index.d.ts.map +1 -1
  56. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +192 -97
  57. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  58. package/package.json +1 -1
  59. package/src/decorators/{elementDefind.ts → elementDefine.ts} +1 -1
  60. package/src/decorators/query.ts +1 -1
  61. package/src/decorators/queryAll.ts +1 -1
  62. package/src/elements/SwcChoose.ts +2 -2
  63. package/src/elements/SwcForOf.ts +12 -87
  64. package/src/elements/SwcHTMLElementBase.ts +93 -0
  65. package/src/elements/SwcIf.ts +8 -27
  66. package/src/elements/SwcObject.ts +78 -0
  67. package/src/elements/SwcOther.ts +2 -2
  68. package/src/elements/SwcWhen.ts +2 -2
  69. package/src/index.ts +3 -1
@@ -29,13 +29,15 @@ var dooboostoreSimpleWebComponent = (() => {
29
29
  STYLE_METHOD_KEY: () => STYLE_METHOD_KEY,
30
30
  SwcChoose: () => SwcChoose,
31
31
  SwcForOf: () => SwcForOf,
32
+ SwcHTMLElementBase: () => SwcHTMLElementBase,
32
33
  SwcIf: () => SwcIf,
34
+ SwcObject: () => SwcObject,
33
35
  SwcOther: () => SwcOther,
34
36
  SwcWhen: () => SwcWhen,
35
37
  TEMPLATE_METHOD_KEY: () => TEMPLATE_METHOD_KEY,
36
38
  addEventListener: () => addEventListener,
37
39
  attributeChanged: () => attributeChanged,
38
- elementDefind: () => elementDefind,
40
+ elementDefine: () => elementDefine,
39
41
  getAddEventListenerMetadata: () => getAddEventListenerMetadata,
40
42
  getAttributeChangedMap: () => getAttributeChangedMap,
41
43
  getElementConfig: () => getElementConfig,
@@ -234,7 +236,7 @@ var dooboostoreSimpleWebComponent = (() => {
234
236
  return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);
235
237
  };
236
238
 
237
- // src/decorators/elementDefind.ts
239
+ // src/decorators/elementDefine.ts
238
240
  var ELEMENT_CONFIG_KEY = Symbol("simple-web-component:element-config");
239
241
  var BUILT_IN_TAG_MAP = /* @__PURE__ */ new Map();
240
242
  var registerTag = (className, tagName) => {
@@ -300,7 +302,7 @@ var dooboostoreSimpleWebComponent = (() => {
300
302
  ["HTMLVideoElement", "video"],
301
303
  ["HTMLHeadingElement", "h1"]
302
304
  ].forEach(([cls, tag]) => registerTag(cls, tag));
303
- var elementDefind = (inConfig) => (constructor) => {
305
+ var elementDefine = (inConfig) => (constructor) => {
304
306
  const config = typeof inConfig === "string" ? { tagName: inConfig } : inConfig;
305
307
  let extendsTagName = config.extends;
306
308
  if (!extendsTagName) {
@@ -465,6 +467,87 @@ var dooboostoreSimpleWebComponent = (() => {
465
467
  return ReflectUtils.getMetadata(ELEMENT_CONFIG_KEY, constructor);
466
468
  };
467
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
+
468
551
  // src/elements/SwcForOf.ts
469
552
  var __decorate = function(decorators, target, key, desc) {
470
553
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -475,55 +558,28 @@ var dooboostoreSimpleWebComponent = (() => {
475
558
  var __metadata = function(k, v) {
476
559
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
477
560
  };
478
- var SwcForOf = class SwcForOf2 extends HTMLElement {
561
+ var SwcForOf = class SwcForOf2 extends SwcHTMLElementBase {
479
562
  constructor() {
480
563
  super();
481
564
  this._value = [];
482
- this._masterTplNodes = [];
483
565
  }
484
566
  set value(val) {
485
567
  if (!Array.isArray(val))
486
568
  val = [];
487
- this._value = this.createProxy(val);
569
+ this._value = this.createReactiveProxy(val, () => this.renderAll(), (idx, v) => this.updateSingleRow(idx, v));
488
570
  this.renderAll();
489
571
  }
490
572
  get value() {
491
573
  return this._value;
492
574
  }
493
- createProxy(arr) {
494
- return new Proxy(arr, {
495
- set: (target, prop, val) => {
496
- const isIndex = !isNaN(Number(prop));
497
- target[prop] = val;
498
- if (isIndex) {
499
- this.updateSingleRow(Number(prop), val);
500
- } else if (prop === "length" && val < target.length) {
501
- this.renderAll();
502
- }
503
- return true;
504
- },
505
- deleteProperty: (target, prop) => {
506
- const res = delete target[prop];
507
- this.renderAll();
508
- return res;
509
- }
510
- });
511
- }
512
575
  styles() {
513
- return `
514
- :host { display: contents; }
515
- `;
576
+ return `:host { display: contents; }`;
516
577
  }
517
578
  renderTemplate() {
518
- return `
519
- <slot id="tpl-slot" style="display:none;"></slot>
520
- `;
579
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
521
580
  }
522
581
  connectedCallback() {
523
- const tplSlot = this.shadowRoot?.getElementById("tpl-slot");
524
- if (tplSlot) {
525
- this._masterTplNodes = tplSlot.assignedNodes().map((n) => n.cloneNode(true));
526
- }
582
+ this.initCore();
527
583
  this.renderAll();
528
584
  }
529
585
  updateSingleRow(index, newValue) {
@@ -534,50 +590,6 @@ var dooboostoreSimpleWebComponent = (() => {
534
590
  this.renderRow(newValue, index);
535
591
  }
536
592
  }
537
- applyData(node, data, index) {
538
- const getValueByPath = (obj, path) => {
539
- if (path === "value")
540
- return obj;
541
- if (path.startsWith("value.")) {
542
- return path.split(".").slice(1).reduce((acc, part) => acc && acc[part], obj);
543
- }
544
- return void 0;
545
- };
546
- const walk = (n) => {
547
- if (n.nodeType === Node.TEXT_NODE) {
548
- if (!n._original)
549
- n._original = n.textContent;
550
- let text = n._original;
551
- text = text.replace(/{{(.*?)}}/g, (match, path) => {
552
- path = path.trim();
553
- if (path === "index")
554
- return index.toString();
555
- const val = getValueByPath(data, path);
556
- return val !== void 0 ? val : match;
557
- });
558
- if (n.textContent !== text)
559
- n.textContent = text;
560
- } else if (n.nodeType === Node.ELEMENT_NODE) {
561
- const el = n;
562
- Array.from(el.attributes).forEach((a) => {
563
- if (!a._original)
564
- a._original = a.value;
565
- let val = a._original;
566
- val = val.replace(/{{(.*?)}}/g, (match, path) => {
567
- path = path.trim();
568
- if (path === "index")
569
- return index.toString();
570
- const v = getValueByPath(data, path);
571
- return v !== void 0 ? v : match;
572
- });
573
- if (a.value !== val)
574
- a.value = val;
575
- });
576
- el.childNodes.forEach(walk);
577
- }
578
- };
579
- walk(node);
580
- }
581
593
  renderRow(item, index) {
582
594
  if (!this.shadowRoot || this._masterTplNodes.length === 0)
583
595
  return;
@@ -635,7 +647,7 @@ var dooboostoreSimpleWebComponent = (() => {
635
647
  __metadata("design:returntype", void 0)
636
648
  ], SwcForOf.prototype, "renderTemplate", null);
637
649
  SwcForOf = __decorate([
638
- elementDefind({ tagName: "swc-for-of", useShadow: true }),
650
+ elementDefine({ tagName: "swc-for-of", useShadow: true }),
639
651
  __metadata("design:paramtypes", [])
640
652
  ], SwcForOf);
641
653
 
@@ -649,11 +661,10 @@ var dooboostoreSimpleWebComponent = (() => {
649
661
  var __metadata2 = function(k, v) {
650
662
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
651
663
  };
652
- var SwcIf = class SwcIf2 extends HTMLElement {
664
+ var SwcIf = class SwcIf2 extends SwcHTMLElementBase {
653
665
  constructor() {
654
666
  super();
655
667
  this._value = false;
656
- this._masterTplNodes = [];
657
668
  this._observer = null;
658
669
  }
659
670
  set value(val) {
@@ -664,20 +675,13 @@ var dooboostoreSimpleWebComponent = (() => {
664
675
  return this._value;
665
676
  }
666
677
  styles() {
667
- return `
668
- :host { display: contents; }
669
- `;
678
+ return `:host { display: contents; }`;
670
679
  }
671
680
  renderTemplate() {
672
- return `
673
- <slot id="tpl-slot" style="display:none;"></slot>
674
- `;
681
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
675
682
  }
676
683
  connectedCallback() {
677
- const tplSlot = this.shadowRoot?.getElementById("tpl-slot");
678
- if (tplSlot) {
679
- this._masterTplNodes = tplSlot.assignedNodes().map((n) => n.cloneNode(true));
680
- }
684
+ this.initCore();
681
685
  this._observer = new MutationObserver(() => this.render());
682
686
  this._observer.observe(this, { attributes: true });
683
687
  this.render();
@@ -720,7 +724,6 @@ var dooboostoreSimpleWebComponent = (() => {
720
724
  const clone = tplNode.cloneNode(true);
721
725
  if (clone.nodeType === Node.ELEMENT_NODE) {
722
726
  clone.setAttribute("slot", "if-content");
723
- clone.style.display = "";
724
727
  } else if (clone.nodeType === Node.TEXT_NODE) {
725
728
  if (clone.textContent?.trim().length === 0)
726
729
  return;
@@ -748,7 +751,7 @@ var dooboostoreSimpleWebComponent = (() => {
748
751
  __metadata2("design:returntype", void 0)
749
752
  ], SwcIf.prototype, "renderTemplate", null);
750
753
  SwcIf = __decorate2([
751
- elementDefind({ tagName: "swc-if", useShadow: true }),
754
+ elementDefine({ tagName: "swc-if", useShadow: true }),
752
755
  __metadata2("design:paramtypes", [])
753
756
  ], SwcIf);
754
757
 
@@ -844,7 +847,7 @@ var dooboostoreSimpleWebComponent = (() => {
844
847
  __metadata3("design:returntype", void 0)
845
848
  ], SwcChoose.prototype, "render", null);
846
849
  SwcChoose = __decorate3([
847
- elementDefind({ tagName: "swc-choose", useShadow: true })
850
+ elementDefine({ tagName: "swc-choose", useShadow: true })
848
851
  ], SwcChoose);
849
852
 
850
853
  // src/elements/SwcWhen.ts
@@ -878,7 +881,7 @@ var dooboostoreSimpleWebComponent = (() => {
878
881
  __metadata4("design:returntype", void 0)
879
882
  ], SwcWhen.prototype, "render", null);
880
883
  SwcWhen = __decorate4([
881
- elementDefind({ tagName: "swc-when", useShadow: true })
884
+ elementDefine({ tagName: "swc-when", useShadow: true })
882
885
  ], SwcWhen);
883
886
 
884
887
  // src/elements/SwcOther.ts
@@ -912,8 +915,100 @@ var dooboostoreSimpleWebComponent = (() => {
912
915
  __metadata5("design:returntype", void 0)
913
916
  ], SwcOther.prototype, "render", null);
914
917
  SwcOther = __decorate5([
915
- elementDefind({ tagName: "swc-other", useShadow: true })
918
+ elementDefine({ tagName: "swc-other", useShadow: true })
916
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
+ elementDefine({ tagName: "swc-object", useShadow: true }),
1010
+ __metadata6("design:paramtypes", [])
1011
+ ], SwcObject);
917
1012
  return __toCommonJS(bundle_entry_exports);
918
1013
  })();
919
1014
  //# sourceMappingURL=dooboostore-simple-web-component.umd.js.map