@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
@@ -183,7 +183,7 @@ var getAddEventListenerMetadata = (target) => {
183
183
  return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);
184
184
  };
185
185
 
186
- // src/decorators/elementDefind.ts
186
+ // src/decorators/elementDefine.ts
187
187
  var ELEMENT_CONFIG_KEY = Symbol("simple-web-component:element-config");
188
188
  var BUILT_IN_TAG_MAP = /* @__PURE__ */ new Map();
189
189
  var registerTag = (className, tagName) => {
@@ -249,7 +249,7 @@ var registerTag = (className, tagName) => {
249
249
  ["HTMLVideoElement", "video"],
250
250
  ["HTMLHeadingElement", "h1"]
251
251
  ].forEach(([cls, tag]) => registerTag(cls, tag));
252
- var elementDefind = (inConfig) => (constructor) => {
252
+ var elementDefine = (inConfig) => (constructor) => {
253
253
  const config = typeof inConfig === "string" ? { tagName: inConfig } : inConfig;
254
254
  let extendsTagName = config.extends;
255
255
  if (!extendsTagName) {
@@ -414,6 +414,87 @@ var getElementConfig = (target) => {
414
414
  return ReflectUtils.getMetadata(ELEMENT_CONFIG_KEY, constructor);
415
415
  };
416
416
 
417
+ // src/elements/SwcHTMLElementBase.ts
418
+ var SwcHTMLElementBase = class extends HTMLElement {
419
+ constructor() {
420
+ super();
421
+ this._masterTplNodes = [];
422
+ this._asKey = "value";
423
+ this._asIndexKey = "index";
424
+ }
425
+ initCore() {
426
+ this._asKey = this.getAttribute("as") || "value";
427
+ this._asIndexKey = this.getAttribute("as-index") || "index";
428
+ const tplSlot = this.shadowRoot?.getElementById("tpl-slot");
429
+ if (tplSlot) {
430
+ this._masterTplNodes = tplSlot.assignedNodes().map((n) => n.cloneNode(true));
431
+ }
432
+ }
433
+ getValueByPath(obj, path) {
434
+ if (path === this._asKey) return obj;
435
+ if (path.startsWith(`${this._asKey}.`)) {
436
+ return path.split(".").slice(1).reduce((acc, part) => acc && acc[part], obj);
437
+ }
438
+ return void 0;
439
+ }
440
+ applyData(node, data, index) {
441
+ const context = {};
442
+ if (index !== void 0) {
443
+ context[this._asIndexKey] = index.toString();
444
+ }
445
+ const walk = (n) => {
446
+ if (n.nodeType === Node.TEXT_NODE) {
447
+ if (!n._original) n._original = n.textContent;
448
+ let text = n._original;
449
+ text = text.replace(/{{(.*?)}}/g, (match, path) => {
450
+ path = path.trim();
451
+ if (context[path] !== void 0) return context[path];
452
+ const val = this.getValueByPath(data, path);
453
+ return val !== void 0 ? val : match;
454
+ });
455
+ if (n.textContent !== text) n.textContent = text;
456
+ } else if (n.nodeType === Node.ELEMENT_NODE) {
457
+ const el = n;
458
+ Array.from(el.attributes).forEach((a) => {
459
+ if (!a._original) a._original = a.value;
460
+ let val = a._original;
461
+ val = val.replace(/{{(.*?)}}/g, (match, path) => {
462
+ path = path.trim();
463
+ if (context[path] !== void 0) return context[path];
464
+ const v = this.getValueByPath(data, path);
465
+ return v !== void 0 ? v : match;
466
+ });
467
+ if (a.value !== val) a.value = val;
468
+ });
469
+ el.childNodes.forEach(walk);
470
+ }
471
+ };
472
+ walk(node);
473
+ }
474
+ /**
475
+ * 객체/배열의 변경을 감지하는 Proxy 생성 유틸리티
476
+ */
477
+ createReactiveProxy(target, onChange, onIndexChange) {
478
+ return new Proxy(target, {
479
+ set: (t, prop, val) => {
480
+ const isIndex = !isNaN(Number(prop));
481
+ t[prop] = val;
482
+ if (isIndex && onIndexChange) {
483
+ onIndexChange(Number(prop), val);
484
+ } else {
485
+ onChange();
486
+ }
487
+ return true;
488
+ },
489
+ deleteProperty: (t, prop) => {
490
+ delete t[prop];
491
+ onChange();
492
+ return true;
493
+ }
494
+ });
495
+ }
496
+ };
497
+
417
498
  // src/elements/SwcForOf.ts
418
499
  var __decorate = function(decorators, target, key, desc) {
419
500
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -424,55 +505,28 @@ var __decorate = function(decorators, target, key, desc) {
424
505
  var __metadata = function(k, v) {
425
506
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
426
507
  };
427
- var SwcForOf = class SwcForOf2 extends HTMLElement {
508
+ var SwcForOf = class SwcForOf2 extends SwcHTMLElementBase {
428
509
  constructor() {
429
510
  super();
430
511
  this._value = [];
431
- this._masterTplNodes = [];
432
512
  }
433
513
  set value(val) {
434
514
  if (!Array.isArray(val))
435
515
  val = [];
436
- this._value = this.createProxy(val);
516
+ this._value = this.createReactiveProxy(val, () => this.renderAll(), (idx, v) => this.updateSingleRow(idx, v));
437
517
  this.renderAll();
438
518
  }
439
519
  get value() {
440
520
  return this._value;
441
521
  }
442
- createProxy(arr) {
443
- return new Proxy(arr, {
444
- set: (target, prop, val) => {
445
- const isIndex = !isNaN(Number(prop));
446
- target[prop] = val;
447
- if (isIndex) {
448
- this.updateSingleRow(Number(prop), val);
449
- } else if (prop === "length" && val < target.length) {
450
- this.renderAll();
451
- }
452
- return true;
453
- },
454
- deleteProperty: (target, prop) => {
455
- const res = delete target[prop];
456
- this.renderAll();
457
- return res;
458
- }
459
- });
460
- }
461
522
  styles() {
462
- return `
463
- :host { display: contents; }
464
- `;
523
+ return `:host { display: contents; }`;
465
524
  }
466
525
  renderTemplate() {
467
- return `
468
- <slot id="tpl-slot" style="display:none;"></slot>
469
- `;
526
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
470
527
  }
471
528
  connectedCallback() {
472
- const tplSlot = this.shadowRoot?.getElementById("tpl-slot");
473
- if (tplSlot) {
474
- this._masterTplNodes = tplSlot.assignedNodes().map((n) => n.cloneNode(true));
475
- }
529
+ this.initCore();
476
530
  this.renderAll();
477
531
  }
478
532
  updateSingleRow(index, newValue) {
@@ -483,50 +537,6 @@ var SwcForOf = class SwcForOf2 extends HTMLElement {
483
537
  this.renderRow(newValue, index);
484
538
  }
485
539
  }
486
- applyData(node, data, index) {
487
- const getValueByPath = (obj, path) => {
488
- if (path === "value")
489
- return obj;
490
- if (path.startsWith("value.")) {
491
- return path.split(".").slice(1).reduce((acc, part) => acc && acc[part], obj);
492
- }
493
- return void 0;
494
- };
495
- const walk = (n) => {
496
- if (n.nodeType === Node.TEXT_NODE) {
497
- if (!n._original)
498
- n._original = n.textContent;
499
- let text = n._original;
500
- text = text.replace(/{{(.*?)}}/g, (match, path) => {
501
- path = path.trim();
502
- if (path === "index")
503
- return index.toString();
504
- const val = getValueByPath(data, path);
505
- return val !== void 0 ? val : match;
506
- });
507
- if (n.textContent !== text)
508
- 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)
513
- a._original = a.value;
514
- let val = a._original;
515
- val = val.replace(/{{(.*?)}}/g, (match, path) => {
516
- path = path.trim();
517
- if (path === "index")
518
- return index.toString();
519
- const v = getValueByPath(data, path);
520
- return v !== void 0 ? v : match;
521
- });
522
- if (a.value !== val)
523
- a.value = val;
524
- });
525
- el.childNodes.forEach(walk);
526
- }
527
- };
528
- walk(node);
529
- }
530
540
  renderRow(item, index) {
531
541
  if (!this.shadowRoot || this._masterTplNodes.length === 0)
532
542
  return;
@@ -584,7 +594,7 @@ __decorate([
584
594
  __metadata("design:returntype", void 0)
585
595
  ], SwcForOf.prototype, "renderTemplate", null);
586
596
  SwcForOf = __decorate([
587
- elementDefind({ tagName: "swc-for-of", useShadow: true }),
597
+ elementDefine({ tagName: "swc-for-of", useShadow: true }),
588
598
  __metadata("design:paramtypes", [])
589
599
  ], SwcForOf);
590
600
 
@@ -598,11 +608,10 @@ var __decorate2 = function(decorators, target, key, desc) {
598
608
  var __metadata2 = function(k, v) {
599
609
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
600
610
  };
601
- var SwcIf = class SwcIf2 extends HTMLElement {
611
+ var SwcIf = class SwcIf2 extends SwcHTMLElementBase {
602
612
  constructor() {
603
613
  super();
604
614
  this._value = false;
605
- this._masterTplNodes = [];
606
615
  this._observer = null;
607
616
  }
608
617
  set value(val) {
@@ -613,20 +622,13 @@ var SwcIf = class SwcIf2 extends HTMLElement {
613
622
  return this._value;
614
623
  }
615
624
  styles() {
616
- return `
617
- :host { display: contents; }
618
- `;
625
+ return `:host { display: contents; }`;
619
626
  }
620
627
  renderTemplate() {
621
- return `
622
- <slot id="tpl-slot" style="display:none;"></slot>
623
- `;
628
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
624
629
  }
625
630
  connectedCallback() {
626
- const tplSlot = this.shadowRoot?.getElementById("tpl-slot");
627
- if (tplSlot) {
628
- this._masterTplNodes = tplSlot.assignedNodes().map((n) => n.cloneNode(true));
629
- }
631
+ this.initCore();
630
632
  this._observer = new MutationObserver(() => this.render());
631
633
  this._observer.observe(this, { attributes: true });
632
634
  this.render();
@@ -669,7 +671,6 @@ var SwcIf = class SwcIf2 extends HTMLElement {
669
671
  const clone = tplNode.cloneNode(true);
670
672
  if (clone.nodeType === Node.ELEMENT_NODE) {
671
673
  clone.setAttribute("slot", "if-content");
672
- clone.style.display = "";
673
674
  } else if (clone.nodeType === Node.TEXT_NODE) {
674
675
  if (clone.textContent?.trim().length === 0)
675
676
  return;
@@ -697,7 +698,7 @@ __decorate2([
697
698
  __metadata2("design:returntype", void 0)
698
699
  ], SwcIf.prototype, "renderTemplate", null);
699
700
  SwcIf = __decorate2([
700
- elementDefind({ tagName: "swc-if", useShadow: true }),
701
+ elementDefine({ tagName: "swc-if", useShadow: true }),
701
702
  __metadata2("design:paramtypes", [])
702
703
  ], SwcIf);
703
704
 
@@ -793,7 +794,7 @@ __decorate3([
793
794
  __metadata3("design:returntype", void 0)
794
795
  ], SwcChoose.prototype, "render", null);
795
796
  SwcChoose = __decorate3([
796
- elementDefind({ tagName: "swc-choose", useShadow: true })
797
+ elementDefine({ tagName: "swc-choose", useShadow: true })
797
798
  ], SwcChoose);
798
799
 
799
800
  // src/elements/SwcWhen.ts
@@ -827,7 +828,7 @@ __decorate4([
827
828
  __metadata4("design:returntype", void 0)
828
829
  ], SwcWhen.prototype, "render", null);
829
830
  SwcWhen = __decorate4([
830
- elementDefind({ tagName: "swc-when", useShadow: true })
831
+ elementDefine({ tagName: "swc-when", useShadow: true })
831
832
  ], SwcWhen);
832
833
 
833
834
  // src/elements/SwcOther.ts
@@ -861,8 +862,100 @@ __decorate5([
861
862
  __metadata5("design:returntype", void 0)
862
863
  ], SwcOther.prototype, "render", null);
863
864
  SwcOther = __decorate5([
864
- elementDefind({ tagName: "swc-other", useShadow: true })
865
+ elementDefine({ tagName: "swc-other", useShadow: true })
865
866
  ], SwcOther);
867
+
868
+ // src/elements/SwcObject.ts
869
+ var __decorate6 = function(decorators, target, key, desc) {
870
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
871
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
872
+ 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;
873
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
874
+ };
875
+ var __metadata6 = function(k, v) {
876
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
877
+ };
878
+ var SwcObject = class SwcObject2 extends SwcHTMLElementBase {
879
+ constructor() {
880
+ super();
881
+ this._value = {};
882
+ this._renderedNodes = [];
883
+ }
884
+ set value(val) {
885
+ if (typeof val !== "object" || val === null)
886
+ val = {};
887
+ this._value = this.createReactiveProxy(val, () => this.updateUI());
888
+ this.render();
889
+ }
890
+ get value() {
891
+ return this._value;
892
+ }
893
+ styles() {
894
+ return `:host { display: contents; }`;
895
+ }
896
+ renderTemplate() {
897
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
898
+ }
899
+ connectedCallback() {
900
+ this.initCore();
901
+ this.render();
902
+ }
903
+ updateUI() {
904
+ this._renderedNodes.forEach((node) => {
905
+ this.applyData(node, this._value);
906
+ });
907
+ }
908
+ render() {
909
+ if (!this.shadowRoot || this._masterTplNodes.length === 0)
910
+ return;
911
+ this._renderedNodes.forEach((n) => {
912
+ if (n.parentElement === this)
913
+ this.removeChild(n);
914
+ });
915
+ this._renderedNodes = [];
916
+ let slot = this.shadowRoot.querySelector('slot[name="obj-content"]');
917
+ if (!slot) {
918
+ slot = document.createElement("slot");
919
+ slot.name = "obj-content";
920
+ this.shadowRoot.appendChild(slot);
921
+ }
922
+ this._masterTplNodes.forEach((tplNode) => {
923
+ const clone = tplNode.cloneNode(true);
924
+ if (clone.nodeType === Node.ELEMENT_NODE) {
925
+ clone.setAttribute("slot", "obj-content");
926
+ } else if (clone.nodeType === Node.TEXT_NODE) {
927
+ if (clone.textContent?.trim().length === 0)
928
+ return;
929
+ const span = document.createElement("span");
930
+ span.setAttribute("slot", "obj-content");
931
+ span.appendChild(clone);
932
+ this.appendChild(span);
933
+ this._renderedNodes.push(span);
934
+ this.applyData(span, this._value);
935
+ return;
936
+ }
937
+ this.appendChild(clone);
938
+ this._renderedNodes.push(clone);
939
+ this.applyData(clone, this._value);
940
+ });
941
+ }
942
+ };
943
+ __decorate6([
944
+ style,
945
+ __metadata6("design:type", Function),
946
+ __metadata6("design:paramtypes", []),
947
+ __metadata6("design:returntype", void 0)
948
+ ], SwcObject.prototype, "styles", null);
949
+ __decorate6([
950
+ template,
951
+ __metadata6("design:type", Function),
952
+ __metadata6("design:paramtypes", []),
953
+ __metadata6("design:returntype", void 0)
954
+ ], SwcObject.prototype, "renderTemplate", null);
955
+ SwcObject = __decorate6([
956
+ elementDefine({ tagName: "swc-object", useShadow: true }),
957
+ __metadata6("design:paramtypes", [])
958
+ ], SwcObject);
866
959
  export {
867
960
  ADD_EVENT_LISTENER_METADATA_KEY,
868
961
  ATTRIBUTE_CHANGED_METADATA_KEY,
@@ -873,13 +966,15 @@ export {
873
966
  STYLE_METHOD_KEY,
874
967
  SwcChoose,
875
968
  SwcForOf,
969
+ SwcHTMLElementBase,
876
970
  SwcIf,
971
+ SwcObject,
877
972
  SwcOther,
878
973
  SwcWhen,
879
974
  TEMPLATE_METHOD_KEY,
880
975
  addEventListener,
881
976
  attributeChanged,
882
- elementDefind,
977
+ elementDefine,
883
978
  getAddEventListenerMetadata,
884
979
  getAttributeChangedMap,
885
980
  getElementConfig,