@magnit-ce/code-tests 0.0.2 → 0.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.
@@ -24,6 +24,7 @@ __export(code_tests_exports, {
24
24
  AFTEREACH: () => AFTEREACH,
25
25
  BEFOREALL: () => BEFOREALL,
26
26
  BEFOREEACH: () => BEFOREEACH,
27
+ CodeTestEventType: () => CodeTestEventType,
27
28
  CodeTests: () => CodeTests,
28
29
  CodeTestsElement: () => CodeTestsElement,
29
30
  expect: () => expect
@@ -264,9 +265,10 @@ summary::before
264
265
  {
265
266
  border: var(--border-success);
266
267
  background: var(--surface-success)
267
- url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24"><path fill="%232e943a" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>');
268
+ url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="%232e943a" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>');
268
269
  background-repeat: no-repeat;
269
270
  background-position: center;
271
+ background-size: 16px 16px;
270
272
  }
271
273
  .test.fail .result-icon
272
274
  ,.hook.fail .result-icon
@@ -483,6 +485,13 @@ function assignClassAndIdToPart(shadowRoot) {
483
485
  }
484
486
 
485
487
  // src/code-tests.ts
488
+ var CodeTestEventType = /* @__PURE__ */ ((CodeTestEventType2) => {
489
+ CodeTestEventType2["BeforeAll"] = "beforeall";
490
+ CodeTestEventType2["AfterAll"] = "afterall";
491
+ CodeTestEventType2["BeforeTest"] = "beforetest";
492
+ CodeTestEventType2["AfterTest"] = "aftertest";
493
+ return CodeTestEventType2;
494
+ })(CodeTestEventType || {});
486
495
  var NOTESTDEFINED = Symbol("No Test Defined");
487
496
  var COMPONENT_STYLESHEET = new CSSStyleSheet();
488
497
  COMPONENT_STYLESHEET.replaceSync(code_tests_default);
@@ -553,9 +562,11 @@ var CodeTestsElement = class extends HTMLElement {
553
562
  this.#runTest(testId, test);
554
563
  }
555
564
  async loadTests(path) {
556
- this.classList.remove("has-before-hook");
557
- this.classList.remove("has-after-hook");
558
565
  try {
566
+ this.getElement("tests").innerHTML = "";
567
+ this.#tests.clear();
568
+ this.classList.remove("has-before-hook");
569
+ this.classList.remove("has-after-hook");
559
570
  const lastSlashIndexInCurrentPath = window.location.href.lastIndexOf("/");
560
571
  const currentPathHasExtension = window.location.href.substring(lastSlashIndexInCurrentPath).indexOf(".") != -1;
561
572
  const currentPath = currentPathHasExtension == true ? window.location.href.substring(0, lastSlashIndexInCurrentPath + 1) : window.location.href;
@@ -652,6 +663,7 @@ var CodeTestsElement = class extends HTMLElement {
652
663
  }
653
664
  }
654
665
  async runTests() {
666
+ this.dispatchEvent(new CustomEvent("beforeall" /* BeforeAll */, { bubbles: true, composed: true }));
655
667
  this.#continueRunningTests = true;
656
668
  this.classList.add("running");
657
669
  this.toggleAttribute("success", false);
@@ -718,6 +730,7 @@ var CodeTestsElement = class extends HTMLElement {
718
730
  this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
719
731
  this.classList.remove("running");
720
732
  this.part.remove("running");
733
+ this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
721
734
  }
722
735
  #clearTestStatuses() {
723
736
  for (const [testId, test] of this.#tests) {
@@ -750,6 +763,11 @@ var CodeTestsElement = class extends HTMLElement {
750
763
  testElement.part.add("running");
751
764
  testElement.classList.remove("success", "fail");
752
765
  testElement.part.remove("success", "fail");
766
+ const iconElement = testElement.querySelector(".result-icon");
767
+ iconElement?.classList.remove("success", "fail");
768
+ iconElement?.part.remove("success", "fail");
769
+ iconElement?.classList.add("running");
770
+ iconElement?.part.add("running");
753
771
  const errorMessageElement = testElement.querySelector(".error-message");
754
772
  if (errorMessageElement != null) {
755
773
  errorMessageElement.textContent = "";
@@ -763,34 +781,37 @@ var CodeTestsElement = class extends HTMLElement {
763
781
  let afterResult = NOTESTDEFINED;
764
782
  let testType;
765
783
  try {
766
- const beforeHooks = this.#hooks.get(BEFOREEACH);
767
- if (beforeHooks != null) {
768
- for (const [hook, ids] of beforeHooks) {
769
- if (ids.has(testId)) {
770
- beforeResult = await hook();
771
- break;
784
+ const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
785
+ if (allowTest == true) {
786
+ const beforeHooks = this.#hooks.get(BEFOREEACH);
787
+ if (beforeHooks != null) {
788
+ for (const [hook, ids] of beforeHooks) {
789
+ if (ids.has(testId)) {
790
+ beforeResult = await hook();
791
+ break;
792
+ }
772
793
  }
773
794
  }
774
- }
775
- testResult = await test();
776
- const afterHooks = this.#hooks.get(AFTEREACH);
777
- if (afterHooks != null) {
778
- for (const [hook, ids] of afterHooks) {
779
- if (ids.has(testId)) {
780
- afterResult = await hook();
781
- break;
795
+ testResult = await test();
796
+ const afterHooks = this.#hooks.get(AFTEREACH);
797
+ if (afterHooks != null) {
798
+ for (const [hook, ids] of afterHooks) {
799
+ if (ids.has(testId)) {
800
+ afterResult = await hook();
801
+ break;
802
+ }
782
803
  }
783
804
  }
784
- }
785
- testType = "before";
786
- if (beforeResult != NOTESTDEFINED) {
787
- this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
788
- }
789
- testType = void 0;
790
- this.#handleTestResult(testElement, testResult, true, void 0, testType);
791
- testType = "after";
792
- if (afterResult != NOTESTDEFINED) {
793
- this.#handleTestResult(testElement, afterResult, true, void 0, testType);
805
+ testType = "before";
806
+ if (beforeResult != NOTESTDEFINED) {
807
+ this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
808
+ }
809
+ testType = void 0;
810
+ this.#handleTestResult(testElement, testResult, true, void 0, testType);
811
+ testType = "after";
812
+ if (afterResult != NOTESTDEFINED) {
813
+ this.#handleTestResult(testElement, afterResult, true, void 0, testType);
814
+ }
794
815
  }
795
816
  } catch (error) {
796
817
  this.#handleTestResult(testElement, testResult, false, error, testType);
@@ -799,6 +820,9 @@ var CodeTestsElement = class extends HTMLElement {
799
820
  } finally {
800
821
  testElement?.classList.remove("running");
801
822
  testElement?.part.remove("running");
823
+ iconElement?.classList.remove("running");
824
+ iconElement?.part.remove("running");
825
+ this.dispatchEvent(new CustomEvent("aftertest" /* AfterTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
802
826
  }
803
827
  }
804
828
  #handleTestResult(testElement, result, finishedTest, error, beforeOrAfter) {
@@ -924,6 +948,11 @@ Result:${objectResult.value}`,
924
948
  testElement.part.toggle("success", success);
925
949
  testElement.classList.toggle("fail", !success);
926
950
  testElement.part.toggle("fail", !success);
951
+ const iconElement = testElement.querySelector(".result-icon");
952
+ iconElement?.classList.toggle("success", success);
953
+ iconElement?.part.toggle("success", success);
954
+ iconElement?.classList.toggle("fail", !success);
955
+ iconElement?.part.toggle("fail", !success);
927
956
  const resultElement = testElement.querySelector(`.${beforeOrAfter == void 0 ? "result" : beforeOrAfter == "before" ? "before-result" : "after-result"}`);
928
957
  if (resultElement == null) {
929
958
  this.#addProcessError(`Unable to find result element`);
@@ -1031,6 +1060,7 @@ if (customElements.get(COMPONENT_TAG_NAME) == null) {
1031
1060
  AFTEREACH,
1032
1061
  BEFOREALL,
1033
1062
  BEFOREEACH,
1063
+ CodeTestEventType,
1034
1064
  CodeTests,
1035
1065
  CodeTestsElement,
1036
1066
  expect
@@ -18,6 +18,12 @@ declare class CodeTests {
18
18
  declare function expect(value: any): TestPromise<any>;
19
19
 
20
20
  type CodeTestsProperties = {};
21
+ declare enum CodeTestEventType {
22
+ BeforeAll = "beforeall",
23
+ AfterAll = "afterall",
24
+ BeforeTest = "beforetest",
25
+ AfterTest = "aftertest"
26
+ }
21
27
  declare class CodeTestsElement extends HTMLElement {
22
28
  #private;
23
29
  componentParts: Map<string, HTMLElement>;
@@ -33,4 +39,4 @@ declare class CodeTestsElement extends HTMLElement {
33
39
  attributeChangedCallback(attributeName: string, oldValue: string, newValue: string): void;
34
40
  }
35
41
 
36
- export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTests, CodeTestsElement, type CodeTestsProperties, expect };
42
+ export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, expect };
@@ -18,6 +18,12 @@ declare class CodeTests {
18
18
  declare function expect(value: any): TestPromise<any>;
19
19
 
20
20
  type CodeTestsProperties = {};
21
+ declare enum CodeTestEventType {
22
+ BeforeAll = "beforeall",
23
+ AfterAll = "afterall",
24
+ BeforeTest = "beforetest",
25
+ AfterTest = "aftertest"
26
+ }
21
27
  declare class CodeTestsElement extends HTMLElement {
22
28
  #private;
23
29
  componentParts: Map<string, HTMLElement>;
@@ -33,4 +39,4 @@ declare class CodeTestsElement extends HTMLElement {
33
39
  attributeChangedCallback(attributeName: string, oldValue: string, newValue: string): void;
34
40
  }
35
41
 
36
- export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTests, CodeTestsElement, type CodeTestsProperties, expect };
42
+ export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, expect };
@@ -232,9 +232,10 @@ summary::before
232
232
  {
233
233
  border: var(--border-success);
234
234
  background: var(--surface-success)
235
- url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24"><path fill="%232e943a" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>');
235
+ url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="%232e943a" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>');
236
236
  background-repeat: no-repeat;
237
237
  background-position: center;
238
+ background-size: 16px 16px;
238
239
  }
239
240
  .test.fail .result-icon
240
241
  ,.hook.fail .result-icon
@@ -451,6 +452,13 @@ function assignClassAndIdToPart(shadowRoot) {
451
452
  }
452
453
 
453
454
  // src/code-tests.ts
455
+ var CodeTestEventType = /* @__PURE__ */ ((CodeTestEventType2) => {
456
+ CodeTestEventType2["BeforeAll"] = "beforeall";
457
+ CodeTestEventType2["AfterAll"] = "afterall";
458
+ CodeTestEventType2["BeforeTest"] = "beforetest";
459
+ CodeTestEventType2["AfterTest"] = "aftertest";
460
+ return CodeTestEventType2;
461
+ })(CodeTestEventType || {});
454
462
  var NOTESTDEFINED = Symbol("No Test Defined");
455
463
  var COMPONENT_STYLESHEET = new CSSStyleSheet();
456
464
  COMPONENT_STYLESHEET.replaceSync(code_tests_default);
@@ -521,9 +529,11 @@ var CodeTestsElement = class extends HTMLElement {
521
529
  this.#runTest(testId, test);
522
530
  }
523
531
  async loadTests(path) {
524
- this.classList.remove("has-before-hook");
525
- this.classList.remove("has-after-hook");
526
532
  try {
533
+ this.getElement("tests").innerHTML = "";
534
+ this.#tests.clear();
535
+ this.classList.remove("has-before-hook");
536
+ this.classList.remove("has-after-hook");
527
537
  const lastSlashIndexInCurrentPath = window.location.href.lastIndexOf("/");
528
538
  const currentPathHasExtension = window.location.href.substring(lastSlashIndexInCurrentPath).indexOf(".") != -1;
529
539
  const currentPath = currentPathHasExtension == true ? window.location.href.substring(0, lastSlashIndexInCurrentPath + 1) : window.location.href;
@@ -620,6 +630,7 @@ var CodeTestsElement = class extends HTMLElement {
620
630
  }
621
631
  }
622
632
  async runTests() {
633
+ this.dispatchEvent(new CustomEvent("beforeall" /* BeforeAll */, { bubbles: true, composed: true }));
623
634
  this.#continueRunningTests = true;
624
635
  this.classList.add("running");
625
636
  this.toggleAttribute("success", false);
@@ -686,6 +697,7 @@ var CodeTestsElement = class extends HTMLElement {
686
697
  this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
687
698
  this.classList.remove("running");
688
699
  this.part.remove("running");
700
+ this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
689
701
  }
690
702
  #clearTestStatuses() {
691
703
  for (const [testId, test] of this.#tests) {
@@ -718,6 +730,11 @@ var CodeTestsElement = class extends HTMLElement {
718
730
  testElement.part.add("running");
719
731
  testElement.classList.remove("success", "fail");
720
732
  testElement.part.remove("success", "fail");
733
+ const iconElement = testElement.querySelector(".result-icon");
734
+ iconElement?.classList.remove("success", "fail");
735
+ iconElement?.part.remove("success", "fail");
736
+ iconElement?.classList.add("running");
737
+ iconElement?.part.add("running");
721
738
  const errorMessageElement = testElement.querySelector(".error-message");
722
739
  if (errorMessageElement != null) {
723
740
  errorMessageElement.textContent = "";
@@ -731,34 +748,37 @@ var CodeTestsElement = class extends HTMLElement {
731
748
  let afterResult = NOTESTDEFINED;
732
749
  let testType;
733
750
  try {
734
- const beforeHooks = this.#hooks.get(BEFOREEACH);
735
- if (beforeHooks != null) {
736
- for (const [hook, ids] of beforeHooks) {
737
- if (ids.has(testId)) {
738
- beforeResult = await hook();
739
- break;
751
+ const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
752
+ if (allowTest == true) {
753
+ const beforeHooks = this.#hooks.get(BEFOREEACH);
754
+ if (beforeHooks != null) {
755
+ for (const [hook, ids] of beforeHooks) {
756
+ if (ids.has(testId)) {
757
+ beforeResult = await hook();
758
+ break;
759
+ }
740
760
  }
741
761
  }
742
- }
743
- testResult = await test();
744
- const afterHooks = this.#hooks.get(AFTEREACH);
745
- if (afterHooks != null) {
746
- for (const [hook, ids] of afterHooks) {
747
- if (ids.has(testId)) {
748
- afterResult = await hook();
749
- break;
762
+ testResult = await test();
763
+ const afterHooks = this.#hooks.get(AFTEREACH);
764
+ if (afterHooks != null) {
765
+ for (const [hook, ids] of afterHooks) {
766
+ if (ids.has(testId)) {
767
+ afterResult = await hook();
768
+ break;
769
+ }
750
770
  }
751
771
  }
752
- }
753
- testType = "before";
754
- if (beforeResult != NOTESTDEFINED) {
755
- this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
756
- }
757
- testType = void 0;
758
- this.#handleTestResult(testElement, testResult, true, void 0, testType);
759
- testType = "after";
760
- if (afterResult != NOTESTDEFINED) {
761
- this.#handleTestResult(testElement, afterResult, true, void 0, testType);
772
+ testType = "before";
773
+ if (beforeResult != NOTESTDEFINED) {
774
+ this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
775
+ }
776
+ testType = void 0;
777
+ this.#handleTestResult(testElement, testResult, true, void 0, testType);
778
+ testType = "after";
779
+ if (afterResult != NOTESTDEFINED) {
780
+ this.#handleTestResult(testElement, afterResult, true, void 0, testType);
781
+ }
762
782
  }
763
783
  } catch (error) {
764
784
  this.#handleTestResult(testElement, testResult, false, error, testType);
@@ -767,6 +787,9 @@ var CodeTestsElement = class extends HTMLElement {
767
787
  } finally {
768
788
  testElement?.classList.remove("running");
769
789
  testElement?.part.remove("running");
790
+ iconElement?.classList.remove("running");
791
+ iconElement?.part.remove("running");
792
+ this.dispatchEvent(new CustomEvent("aftertest" /* AfterTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
770
793
  }
771
794
  }
772
795
  #handleTestResult(testElement, result, finishedTest, error, beforeOrAfter) {
@@ -892,6 +915,11 @@ Result:${objectResult.value}`,
892
915
  testElement.part.toggle("success", success);
893
916
  testElement.classList.toggle("fail", !success);
894
917
  testElement.part.toggle("fail", !success);
918
+ const iconElement = testElement.querySelector(".result-icon");
919
+ iconElement?.classList.toggle("success", success);
920
+ iconElement?.part.toggle("success", success);
921
+ iconElement?.classList.toggle("fail", !success);
922
+ iconElement?.part.toggle("fail", !success);
895
923
  const resultElement = testElement.querySelector(`.${beforeOrAfter == void 0 ? "result" : beforeOrAfter == "before" ? "before-result" : "after-result"}`);
896
924
  if (resultElement == null) {
897
925
  this.#addProcessError(`Unable to find result element`);
@@ -998,6 +1026,7 @@ export {
998
1026
  AFTEREACH,
999
1027
  BEFOREALL,
1000
1028
  BEFOREEACH,
1029
+ CodeTestEventType,
1001
1030
  CodeTests,
1002
1031
  CodeTestsElement,
1003
1032
  expect
@@ -231,9 +231,10 @@ summary::before
231
231
  {
232
232
  border: var(--border-success);
233
233
  background: var(--surface-success)
234
- url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24"><path fill="%232e943a" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>');
234
+ url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="%232e943a" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>');
235
235
  background-repeat: no-repeat;
236
236
  background-position: center;
237
+ background-size: 16px 16px;
237
238
  }
238
239
  .test.fail .result-icon
239
240
  ,.hook.fail .result-icon
@@ -355,7 +356,7 @@ pre
355
356
  {
356
357
  from { transform: rotate(0deg); }
357
358
  to { transform: rotate(360deg); }
358
- }`;var F=`<slot name="header">
359
+ }`;var H=`<slot name="header">
359
360
  <header id="header">
360
361
  <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>
361
362
  <slot name="play-button">
@@ -382,15 +383,15 @@ pre
382
383
  <span id="after-all-description" class="description">Results from After All Hook</span>
383
384
  </summary>
384
385
  <div id="after-all-results" class="results"></div>
385
- </details>`;var x=class extends Promise{async toBeDefined(t){if(await this==null)throw new Error(`${t??"Value"} is undefined`)}async toBe(t,s=!1){let e=await this;if((s==!0?e===t:e==t)==!1)throw new Error(` Value is not equal.
386
+ </details>`;var T=class extends Promise{async toBeDefined(t){if(await this==null)throw new Error(`${t??"Value"} is undefined`)}async toBe(t,s=!1){let e=await this;if((s==!0?e===t:e==t)==!1)throw new Error(` Value is not equal.
386
387
  Expected: ${t}
387
- Result: ${e}`)}async toContainText(t){let s=await this}async toHaveAttribute(t){let s=await this;if(!(s instanceof HTMLElement))throw new Error("Unable to check for attribute on non-HTMLElement target");if(s.getAttribute(t))throw new Error("Taret does not have attribute")}},b=Symbol("beforeAll"),y=Symbol("beforeEach"),E=Symbol("afterAll"),k=Symbol("afterEach"),A=class{static timeoutMS=500;static#e;static#p;static expect(t){return new x(async(e,a)=>{if(t instanceof Promise){let r=await t;e(r);return}e(t)})}static expectSync(t){return new x(async(e,a)=>{if(t instanceof Promise){let r=await t;e(r);return}e(t)})}static expectBefore(t){return new x(async(e,a)=>{if(t instanceof Promise){let r=await t;e(r);return}e(t)})}};function q(f){return A.expect(f)}var H=":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";function $(f){let t=[...f.querySelectorAll(`${H}[id]`)];for(let e=0;e<t.length;e++)t[e].part.add(t[e].id);let s=[...f.querySelectorAll(`${H}[class]`)];for(let e=0;e<s.length;e++)s[e].part.add(...s[e].classList)}var M=Symbol("No Test Defined"),P=new CSSStyleSheet;P.replaceSync(S);var D="code-tests",R=class extends HTMLElement{componentParts=new Map;getElement(t){if(this.componentParts.get(t)==null){let s=this.findElement(t);s!=null&&this.componentParts.set(t,s)}return this.componentParts.get(t)}findElement(t){return this.shadowRoot.getElementById(t)}#e=new Map;#p={[b]:w(),[y]:w(),[k]:w(),[E]:w()};#t=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=F,this.shadowRoot.adoptedStyleSheets.push(P),this.#c=this.#h.bind(this)}connectedCallback(){this.addEventListener("click",this.#c);let t=this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path");t!=null&&(this.loadTests(t),$(this.shadowRoot))}disconnectedCallback(){this.removeEventListener("click",this.#c)}#c;#h(t){let s=t.composedPath().find(n=>n instanceof HTMLButtonElement&&n.classList.contains("run"));if(s==null)return;let e=s.closest("li");if(e==null){s.hasAttribute("data-all")==!0&&this.runTests();return}let a=e.dataset.testId;if(a==null)return;let r=this.#r.get(a);r!=null&&this.#u(a,r)}async loadTests(t){this.classList.remove("has-before-hook"),this.classList.remove("has-after-hook");try{let s=window.location.href.lastIndexOf("/"),a=window.location.href.substring(s).indexOf(".")!=-1==!0?window.location.href.substring(0,s+1):window.location.href,r=a+t.substring(0,t.lastIndexOf("/")+1),n=a+t,o=await(await fetch(n)).text();o=o.replaceAll(/['"`](((\.\/)|(\.\.\/))+(.*))['"`]/g,`'${r}$1'`);let l=new File([o],t.substring(t.lastIndexOf("/")),{type:"text/javascript"}),c=await import(URL.createObjectURL(l)),u=c.tests??c.default;if(u==null)throw new Error(`Unable to find tests definition in file at path: ${t}`);let g=u[b];if(g!=null){if(this.#e.get(b)==null){let d=new Map;d.set(g,new Set),this.#e.set(b,d)}this.classList.add("has-before-hook")}let m=u[y];if(m!=null&&this.#e.get(y)==null){let d=new Map;d.set(m,new Set),this.#e.set(y,d)}let T=u[E];if(T!=null){if(this.#e.get(E)==null){let d=new Map;d.set(T,new Set),this.#e.set(E,d)}this.classList.add("has-after-hook")}let L=u[k];if(L!=null&&this.#e.get(k)==null){let d=new Map;d.set(L,new Set),this.#e.set(k,d)}for(let[v,d]of Object.entries(u)){let C=this.#g(v,d);if(g!=null){let p=this.#e.get(b);if(p!=null){let h=p.get(g);h?.add(C)}}if(m!=null){let p=this.#e.get(y);if(p!=null){let h=p.get(m);h?.add(C)}}if(T!=null){let p=this.#e.get(E);if(p!=null){let h=p.get(T);h?.add(C)}}if(L!=null){let p=this.#e.get(k);if(p!=null){let h=p.get(L);h?.add(C)}}}}catch(s){this.#i("An error occurred while loading the tasks:",s)}}async runTests(){this.#t=!0,this.classList.add("running"),this.toggleAttribute("success",!1),this.#f();let t=this.hasAttribute("in-order"),s=this.#e.get(b);if(s!=null){let r;try{let n=this.getElement("before-all-details");n.classList.add("running"),n.part.add("running");for(let[o,l]of s)r=await o(),this.#n(r,!0,"before");n.part.remove("running"),n.classList.remove("running")}catch(n){this.#n(r,!1,"before",n),console.error(n),this.#t=!1;return}}if(t==!1){let r=[];for(let[n,o]of this.#r)r.push(this.#u(n,o));await Promise.all(r)}else for(let[r,n]of this.#r){if(this.#t==!1)break;await this.#u(r,n)}if(this.#t==!1)return;let e=this.#e.get(E);if(e!=null){let r;try{let n=this.getElement("after-all-details");n.classList.add("running"),n.part.add("running");for(let[o,l]of e)r=await o(),this.#n(r,!0,"after");n.part.remove("running"),n.classList.remove("running")}catch(n){this.#n(r,!1,"after",n),console.error(n),this.#t=!1;return}}let a=this.shadowRoot.querySelectorAll('[success="false"]');this.setAttribute("success",a.length==0?"true":"false"),this.classList.remove("running"),this.part.remove("running")}#f(){for(let[e,a]of this.#r){let r=this.getElement("tests").querySelector(`[data-test-id="${e}"]`);if(r==null){this.#i(`Unable to find test element for test: ${e}`);return}r.toggleAttribute("success",!1),r.classList.remove("success","fail"),r.part.remove("success","fail")}let t=this.getElement("before-all-details");t.toggleAttribute("success",!1),t.classList.remove("success","fail"),t.part.remove("success","fail");let s=this.getElement("after-all-details");s.toggleAttribute("success",!1),s.classList.remove("success","fail"),s.part.remove("success","fail")}async#u(t,s){let e=this.getElement("tests").querySelector(`[data-test-id="${t}"]`);if(e==null){this.#i(`Unable to find test element for test: ${t}`);return}e.toggleAttribute("success",!1),e.classList.add("running"),e.part.add("running"),e.classList.remove("success","fail"),e.part.remove("success","fail");let a=e.querySelector(".error-message");a!=null&&(a.textContent="");let r=e.querySelector("details");r!=null&&(r.open=!1);let n=M,o,l=M,i;try{let c=this.#e.get(y);if(c!=null){for(let[g,m]of c)if(m.has(t)){n=await g();break}}o=await s();let u=this.#e.get(k);if(u!=null){for(let[g,m]of u)if(m.has(t)){l=await g();break}}i="before",n!=M&&this.#a(e,n,!0,void 0,i),i=void 0,this.#a(e,o,!0,void 0,i),i="after",l!=M&&this.#a(e,l,!0,void 0,i)}catch(c){this.#a(e,o,!1,c,i),console.error(c),this.#t=!1}finally{e?.classList.remove("running"),e?.part.remove("running")}}#a(t,s,e,a,r){if(s instanceof HTMLElement)this.#o(t,s,e,r);else if(s==null){let o=r==null?"Passed":"Hook Ran Successfully",l=this.#s(e==!0?`${o}`:`Failed${a!=null?`:
388
- ${a.message}`:""}`,e,r);this.#o(t,l,e,r)}else if(typeof s=="string"){let o=this.#s(`${s}${a==null?"":`:
389
- ${a.message}`}`,e,r);this.#o(t,o,e,r)}else if(typeof s=="object"){let o=s;if(o.success!=null&&o.expected!=null&&o.value!=null){let l=r==null?"Passed":"Success",i=r==null?"Failed":"Fail",c=this.#s(`${o.success==!0?`${l}:`:`${i}:`}
388
+ Result: ${e}`)}async toContainText(t){let s=await this}async toHaveAttribute(t){let s=await this;if(!(s instanceof HTMLElement))throw new Error("Unable to check for attribute on non-HTMLElement target");if(s.getAttribute(t))throw new Error("Taret does not have attribute")}},y=Symbol("beforeAll"),v=Symbol("beforeEach"),k=Symbol("afterAll"),x=Symbol("afterEach"),A=class{static timeoutMS=500;static#e;static#p;static expect(t){return new T(async(e,r)=>{if(t instanceof Promise){let a=await t;e(a);return}e(t)})}static expectSync(t){return new T(async(e,r)=>{if(t instanceof Promise){let a=await t;e(a);return}e(t)})}static expectBefore(t){return new T(async(e,r)=>{if(t instanceof Promise){let a=await t;e(a);return}e(t)})}};function q(h){return A.expect(h)}var F=":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";function $(h){let t=[...h.querySelectorAll(`${F}[id]`)];for(let e=0;e<t.length;e++)t[e].part.add(t[e].id);let s=[...h.querySelectorAll(`${F}[class]`)];for(let e=0;e<s.length;e++)s[e].part.add(...s[e].classList)}var j=(r=>(r.BeforeAll="beforeall",r.AfterAll="afterall",r.BeforeTest="beforetest",r.AfterTest="aftertest",r))(j||{}),M=Symbol("No Test Defined"),P=new CSSStyleSheet;P.replaceSync(S);var D="code-tests",R=class extends HTMLElement{componentParts=new Map;getElement(t){if(this.componentParts.get(t)==null){let s=this.findElement(t);s!=null&&this.componentParts.set(t,s)}return this.componentParts.get(t)}findElement(t){return this.shadowRoot.getElementById(t)}#e=new Map;#p={[y]:L(),[v]:L(),[x]:L(),[k]:L()};#t=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=H,this.shadowRoot.adoptedStyleSheets.push(P),this.#c=this.#h.bind(this)}connectedCallback(){this.addEventListener("click",this.#c);let t=this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path");t!=null&&(this.loadTests(t),$(this.shadowRoot))}disconnectedCallback(){this.removeEventListener("click",this.#c)}#c;#h(t){let s=t.composedPath().find(n=>n instanceof HTMLButtonElement&&n.classList.contains("run"));if(s==null)return;let e=s.closest("li");if(e==null){s.hasAttribute("data-all")==!0&&this.runTests();return}let r=e.dataset.testId;if(r==null)return;let a=this.#s.get(r);a!=null&&this.#u(r,a)}async loadTests(t){try{this.getElement("tests").innerHTML="",this.#s.clear(),this.classList.remove("has-before-hook"),this.classList.remove("has-after-hook");let s=window.location.href.lastIndexOf("/"),r=window.location.href.substring(s).indexOf(".")!=-1==!0?window.location.href.substring(0,s+1):window.location.href,a=r+t.substring(0,t.lastIndexOf("/")+1),n=r+t,o=await(await fetch(n)).text();o=o.replaceAll(/['"`](((\.\/)|(\.\.\/))+(.*))['"`]/g,`'${a}$1'`);let l=new File([o],t.substring(t.lastIndexOf("/")),{type:"text/javascript"}),i=await import(URL.createObjectURL(l)),c=i.tests??i.default;if(c==null)throw new Error(`Unable to find tests definition in file at path: ${t}`);let b=c[y];if(b!=null){if(this.#e.get(y)==null){let u=new Map;u.set(b,new Set),this.#e.set(y,u)}this.classList.add("has-before-hook")}let E=c[v];if(E!=null&&this.#e.get(v)==null){let u=new Map;u.set(E,new Set),this.#e.set(v,u)}let g=c[k];if(g!=null){if(this.#e.get(k)==null){let u=new Map;u.set(g,new Set),this.#e.set(k,u)}this.classList.add("has-after-hook")}let m=c[x];if(m!=null&&this.#e.get(x)==null){let u=new Map;u.set(m,new Set),this.#e.set(x,u)}for(let[w,u]of Object.entries(c)){let C=this.#g(w,u);if(b!=null){let d=this.#e.get(y);if(d!=null){let p=d.get(b);p?.add(C)}}if(E!=null){let d=this.#e.get(v);if(d!=null){let p=d.get(E);p?.add(C)}}if(g!=null){let d=this.#e.get(k);if(d!=null){let p=d.get(g);p?.add(C)}}if(m!=null){let d=this.#e.get(x);if(d!=null){let p=d.get(m);p?.add(C)}}}}catch(s){this.#i("An error occurred while loading the tasks:",s)}}async runTests(){this.dispatchEvent(new CustomEvent("beforeall",{bubbles:!0,composed:!0})),this.#t=!0,this.classList.add("running"),this.toggleAttribute("success",!1),this.#f();let t=this.hasAttribute("in-order"),s=this.#e.get(y);if(s!=null){let a;try{let n=this.getElement("before-all-details");n.classList.add("running"),n.part.add("running");for(let[o,l]of s)a=await o(),this.#n(a,!0,"before");n.part.remove("running"),n.classList.remove("running")}catch(n){this.#n(a,!1,"before",n),console.error(n),this.#t=!1;return}}if(t==!1){let a=[];for(let[n,o]of this.#s)a.push(this.#u(n,o));await Promise.all(a)}else for(let[a,n]of this.#s){if(this.#t==!1)break;await this.#u(a,n)}if(this.#t==!1)return;let e=this.#e.get(k);if(e!=null){let a;try{let n=this.getElement("after-all-details");n.classList.add("running"),n.part.add("running");for(let[o,l]of e)a=await o(),this.#n(a,!0,"after");n.part.remove("running"),n.classList.remove("running")}catch(n){this.#n(a,!1,"after",n),console.error(n),this.#t=!1;return}}let r=this.shadowRoot.querySelectorAll('[success="false"]');this.setAttribute("success",r.length==0?"true":"false"),this.classList.remove("running"),this.part.remove("running"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}))}#f(){for(let[e,r]of this.#s){let a=this.getElement("tests").querySelector(`[data-test-id="${e}"]`);if(a==null){this.#i(`Unable to find test element for test: ${e}`);return}a.toggleAttribute("success",!1),a.classList.remove("success","fail"),a.part.remove("success","fail")}let t=this.getElement("before-all-details");t.toggleAttribute("success",!1),t.classList.remove("success","fail"),t.part.remove("success","fail");let s=this.getElement("after-all-details");s.toggleAttribute("success",!1),s.classList.remove("success","fail"),s.part.remove("success","fail")}async#u(t,s){let e=this.getElement("tests").querySelector(`[data-test-id="${t}"]`);if(e==null){this.#i(`Unable to find test element for test: ${t}`);return}e.toggleAttribute("success",!1),e.classList.add("running"),e.part.add("running"),e.classList.remove("success","fail"),e.part.remove("success","fail");let r=e.querySelector(".result-icon");r?.classList.remove("success","fail"),r?.part.remove("success","fail"),r?.classList.add("running"),r?.part.add("running");let a=e.querySelector(".error-message");a!=null&&(a.textContent="");let n=e.querySelector("details");n!=null&&(n.open=!1);let o=M,l,f=M,i;try{if(this.dispatchEvent(new CustomEvent("beforetest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:e}}))==!0){let b=this.#e.get(v);if(b!=null){for(let[g,m]of b)if(m.has(t)){o=await g();break}}l=await s();let E=this.#e.get(x);if(E!=null){for(let[g,m]of E)if(m.has(t)){f=await g();break}}i="before",o!=M&&this.#a(e,o,!0,void 0,i),i=void 0,this.#a(e,l,!0,void 0,i),i="after",f!=M&&this.#a(e,f,!0,void 0,i)}}catch(c){this.#a(e,l,!1,c,i),console.error(c),this.#t=!1}finally{e?.classList.remove("running"),e?.part.remove("running"),r?.classList.remove("running"),r?.part.remove("running"),this.dispatchEvent(new CustomEvent("aftertest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:e}}))}}#a(t,s,e,r,a){if(s instanceof HTMLElement)this.#o(t,s,e,a);else if(s==null){let o=a==null?"Passed":"Hook Ran Successfully",l=this.#r(e==!0?`${o}`:`Failed${r!=null?`:
389
+ ${r.message}`:""}`,e,a);this.#o(t,l,e,a)}else if(typeof s=="string"){let o=this.#r(`${s}${r==null?"":`:
390
+ ${r.message}`}`,e,a);this.#o(t,o,e,a)}else if(typeof s=="object"){let o=s;if(o.success!=null&&o.expected!=null&&o.value!=null){let l=a==null?"Passed":"Success",f=a==null?"Failed":"Fail",i=this.#r(`${o.success==!0?`${l}:`:`${f}:`}
390
391
  Expected:${o.expected}
391
- Result:${o.value}`,o.success,r);this.#o(t,c,e,r)}}let n=t.querySelector("details");n!=null&&(n.open=!0)}#n(t,s,e,a){if(t instanceof HTMLElement)this.#l(t,s,e);else{let n;if(t==null)n=this.#s(s==!0?"Hook Ran Successfully":`Failed${a!=null?`:
392
- ${a.message}`:""}`,s),this.#l(n,s,e);else if(typeof t=="string")n=this.#s(`${t}${a==null?"":`:
393
- ${a.message}`}`,s),this.#l(n,s,e);else if(typeof t=="object"){let o=t;o.success!=null&&o.expected!=null&&o.value!=null&&(n=this.#s(`${o.success==!0?"Success:":"Fail:"}
392
+ Result:${o.value}`,o.success,a);this.#o(t,i,e,a)}}let n=t.querySelector("details");n!=null&&(n.open=!0)}#n(t,s,e,r){if(t instanceof HTMLElement)this.#l(t,s,e);else{let n;if(t==null)n=this.#r(s==!0?"Hook Ran Successfully":`Failed${r!=null?`:
393
+ ${r.message}`:""}`,s),this.#l(n,s,e);else if(typeof t=="string")n=this.#r(`${t}${r==null?"":`:
394
+ ${r.message}`}`,s),this.#l(n,s,e);else if(typeof t=="object"){let o=t;o.success!=null&&o.expected!=null&&o.value!=null&&(n=this.#r(`${o.success==!0?"Success:":"Fail:"}
394
395
  Expected:${o.expected}
395
- Result:${o.value}`,o.success),this.#l(n,s,e))}}let r=this.getElement(`${e}-all-details`);r!=null&&(r.open=!0)}static create(t){let s=document.createElement("code-tests");return console.log(t),s}#r=new Map;#g(t,s){let e=w();this.#r.set(e,s);let a=this.#m(e,t);return this.getElement("tests").append(a),e}#m(t,s){let e=document.createElement("li");e.dataset.testId=t,e.classList.add("test"),e.part.add("test");let a=document.createElement("details");a.classList.add("test-details"),a.part.add("test-details");let r=document.createElement("summary");r.classList.add("test-summary"),r.part.add("test-summary");let n=document.createElement("div");n.classList.add("result-icon"),n.part.add("result-icon"),r.append(n);let o=document.createElement("span");o.classList.add("description","test-description"),o.textContent=s,r.append(o);let l=document.createElement("button");l.classList.add("run","test-run"),l.part.add("run","test-run"),l.textContent="Run Test",l.title="Run Test",r.append(l);let i=document.createElement("div");i.classList.add("before-result","test-before-result"),i.part.add("before-result","test-before-result");let c=document.createElement("div");c.classList.add("result","test-result"),c.part.add("result","test-result");let u=document.createElement("div");return u.classList.add("after-result","test-after-result"),u.part.add("after-result","test-after-result"),a.append(r),a.append(i),a.append(c),a.append(u),e.append(a),e}#o(t,s,e,a){t.setAttribute("success",e==!0?"true":"false"),t.classList.toggle("success",e),t.part.toggle("success",e),t.classList.toggle("fail",!e),t.part.toggle("fail",!e);let r=t.querySelector(`.${a==null?"result":a=="before"?"before-result":"after-result"}`);if(r==null){this.#i("Unable to find result element");return}r.innerHTML="",r.appendChild(s)}#s(t,s,e){let a=document.createElement("code");a.classList.add("code"),a.part.add("code");let r=document.createElement("pre");r.textContent=t;let n=s==!0?"success-message":"error-message";return r.classList.add("pre",n),r.part.add("pre",n),a.appendChild(r),a}#l(t,s,e){let a=this.getElement(`${e}-all-details`),r=this.getElement(`${e}-all-results`);a.setAttribute("success",s==!0?"true":"false"),a.classList.toggle("success",s),a.part.toggle("success",s),a.classList.toggle("fail",!s),a.part.toggle("fail",!s),r.innerHTML="",r.appendChild(t)}#i(t,s){s instanceof Error&&(t+=`
396
- ${s.message}`,console.error(s));let e=document.createElement("li");e.classList.add("error","process-error"),e.part.add("error","process-error");let a=document.createElement("code");a.classList.add("code","process-error-code"),a.part.add("code","process-error-code");let r=document.createElement("pre");r.classList.add("pre","process-error-pre"),r.part.add("pre","process-error-pre"),r.textContent=t,a.append(r),e.append(a),this.getElement("tests").append(e)}#d(t){if(t=="ordered"){let s=this.shadowRoot.querySelector("ul");if(s==null)return;let e=this.shadowRoot?.querySelectorAll("li"),a=document.createElement("ol");e!=null&&a.append(...e),a.id="tests",s.replaceWith(a)}else{let s=this.shadowRoot.querySelector("ol");if(s==null)return;let e=this.shadowRoot?.querySelectorAll("li"),a=document.createElement("ul");a.id="tests",e!=null&&a.append(...e),s.replaceWith(a)}}static observedAttributes=["in-order"];attributeChangedCallback(t,s,e){t=="in-order"&&(e==null?this.#d("unordered"):this.#d("ordered"))}};function w(){let f=new Uint8Array(20);crypto.getRandomValues(f);let t=[].slice.apply(f).map(function(e){return String.fromCharCode(e)}).join("");return btoa(t).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}customElements.get(D)==null&&customElements.define(D,R);export{E as AFTERALL,k as AFTEREACH,b as BEFOREALL,y as BEFOREEACH,A as CodeTests,R as CodeTestsElement,q as expect};
396
+ Result:${o.value}`,o.success),this.#l(n,s,e))}}let a=this.getElement(`${e}-all-details`);a!=null&&(a.open=!0)}static create(t){let s=document.createElement("code-tests");return console.log(t),s}#s=new Map;#g(t,s){let e=L();this.#s.set(e,s);let r=this.#m(e,t);return this.getElement("tests").append(r),e}#m(t,s){let e=document.createElement("li");e.dataset.testId=t,e.classList.add("test"),e.part.add("test");let r=document.createElement("details");r.classList.add("test-details"),r.part.add("test-details");let a=document.createElement("summary");a.classList.add("test-summary"),a.part.add("test-summary");let n=document.createElement("div");n.classList.add("result-icon"),n.part.add("result-icon"),a.append(n);let o=document.createElement("span");o.classList.add("description","test-description"),o.textContent=s,a.append(o);let l=document.createElement("button");l.classList.add("run","test-run"),l.part.add("run","test-run"),l.textContent="Run Test",l.title="Run Test",a.append(l);let f=document.createElement("div");f.classList.add("before-result","test-before-result"),f.part.add("before-result","test-before-result");let i=document.createElement("div");i.classList.add("result","test-result"),i.part.add("result","test-result");let c=document.createElement("div");return c.classList.add("after-result","test-after-result"),c.part.add("after-result","test-after-result"),r.append(a),r.append(f),r.append(i),r.append(c),e.append(r),e}#o(t,s,e,r){t.setAttribute("success",e==!0?"true":"false"),t.classList.toggle("success",e),t.part.toggle("success",e),t.classList.toggle("fail",!e),t.part.toggle("fail",!e);let a=t.querySelector(".result-icon");a?.classList.toggle("success",e),a?.part.toggle("success",e),a?.classList.toggle("fail",!e),a?.part.toggle("fail",!e);let n=t.querySelector(`.${r==null?"result":r=="before"?"before-result":"after-result"}`);if(n==null){this.#i("Unable to find result element");return}n.innerHTML="",n.appendChild(s)}#r(t,s,e){let r=document.createElement("code");r.classList.add("code"),r.part.add("code");let a=document.createElement("pre");a.textContent=t;let n=s==!0?"success-message":"error-message";return a.classList.add("pre",n),a.part.add("pre",n),r.appendChild(a),r}#l(t,s,e){let r=this.getElement(`${e}-all-details`),a=this.getElement(`${e}-all-results`);r.setAttribute("success",s==!0?"true":"false"),r.classList.toggle("success",s),r.part.toggle("success",s),r.classList.toggle("fail",!s),r.part.toggle("fail",!s),a.innerHTML="",a.appendChild(t)}#i(t,s){s instanceof Error&&(t+=`
397
+ ${s.message}`,console.error(s));let e=document.createElement("li");e.classList.add("error","process-error"),e.part.add("error","process-error");let r=document.createElement("code");r.classList.add("code","process-error-code"),r.part.add("code","process-error-code");let a=document.createElement("pre");a.classList.add("pre","process-error-pre"),a.part.add("pre","process-error-pre"),a.textContent=t,r.append(a),e.append(r),this.getElement("tests").append(e)}#d(t){if(t=="ordered"){let s=this.shadowRoot.querySelector("ul");if(s==null)return;let e=this.shadowRoot?.querySelectorAll("li"),r=document.createElement("ol");e!=null&&r.append(...e),r.id="tests",s.replaceWith(r)}else{let s=this.shadowRoot.querySelector("ol");if(s==null)return;let e=this.shadowRoot?.querySelectorAll("li"),r=document.createElement("ul");r.id="tests",e!=null&&r.append(...e),s.replaceWith(r)}}static observedAttributes=["in-order"];attributeChangedCallback(t,s,e){t=="in-order"&&(e==null?this.#d("unordered"):this.#d("ordered"))}};function L(){let h=new Uint8Array(20);crypto.getRandomValues(h);let t=[].slice.apply(h).map(function(e){return String.fromCharCode(e)}).join("");return btoa(t).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}customElements.get(D)==null&&customElements.define(D,R);export{k as AFTERALL,x as AFTEREACH,y as BEFOREALL,v as BEFOREEACH,j as CodeTestEventType,A as CodeTests,R as CodeTestsElement,q as expect};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@magnit-ce/code-tests",
3
- "version": "0.0.2",
4
- "description": "A custom html element that provides a selection gallery as a dialog, to mimic an os-native file browser.",
3
+ "version": "0.0.3",
4
+ "description": "A custom html element that interprets and runs tests in a browser.",
5
5
  "type": "module",
6
6
  "main": "dist/code-tests.js",
7
7
  "module": "dist/code-tests.mjs",