@magnit-ce/code-tests 0.0.11 → 0.0.13

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.
@@ -20,13 +20,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/code-tests.ts
21
21
  var code_tests_exports = {};
22
22
  __export(code_tests_exports, {
23
- AFTERALL: () => AFTERALL,
24
- AFTEREACH: () => AFTEREACH,
25
- BEFOREALL: () => BEFOREALL,
26
- BEFOREEACH: () => BEFOREEACH,
27
23
  CodeTestEventType: () => CodeTestEventType,
28
24
  CodeTests: () => CodeTests,
29
25
  CodeTestsElement: () => CodeTestsElement,
26
+ HookType: () => HookType,
30
27
  expect: () => expect,
31
28
  prompt: () => prompt
32
29
  });
@@ -163,11 +160,25 @@ var code_tests_default = `:host
163
160
  display: none;
164
161
  }
165
162
  :host(.has-before-hook) #before-all-details
166
- ,:host(.has-before-hook) #after-all-details
163
+ ,:host(.has-after-hook) #after-all-details
164
+ {
165
+ display: initial;
166
+ }
167
+ :host(.has-required-before-hook) #required-before-any-details
168
+ ,:host(.has-required-after-hook) #required-after-any-details
167
169
  {
168
170
  display: initial;
169
171
  }
170
172
 
173
+ #required-before-any-summary
174
+ ,#required-after-any-summary
175
+ {
176
+ background: var(--surface-process);
177
+ color: var(--text-process);
178
+ border: solid 1px var(--text-process);
179
+ grid-template-columns: auto auto 1fr;
180
+ }
181
+
171
182
  #tests
172
183
  {
173
184
  margin: 0;
@@ -431,7 +442,7 @@ pre
431
442
  }`;
432
443
 
433
444
  // src/code-tests.html?raw
434
- var code_tests_default2 = '<slot name="header">\n <header id="header">\n <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>\n <slot name="play-button">\n <button type="button" class="run" data-all>\n <slot name="play-button-label">\n <span id="play-button-label" class="button-label label icon">Run Tests</span>\n </slot>\n </button>\n </slot>\n <slot name="details"></slot>\n </header>\n</slot>\n<details id="before-all-details" class="hook">\n <summary id="before-all-summary">\n <span id="before-all-result-icon" class="result-icon"></span>\n <span id="before-all-description" class="description">Results from Before All Hook</span>\n </summary>\n <div id="before-all-results" class="results"></div>\n</details>\n<ul id="tests"></ul>\n<details id="after-all-details" class="hook">\n <summary id="after-all-summary">\n <span id="after-all-result-icon" class="result-icon"></span>\n <span id="after-all-description" class="description">Results from After All Hook</span>\n </summary>\n <div id="after-all-results" class="results"></div>\n</details>\n\n<template id="prompt-template">\n <div class="prompt" part="prompt">\n <div class="prompt-display">\n <span class="icon prompt-icon"></span>\n <span class="label prompt-label"></span>\n </div>\n <div class="prompt-actions">\n <button class="prompt-button accept" type="button">Accept</button>\n <button class="prompt-button reject" type="button">Reject</button>\n </div>\n </div>\n</template>';
445
+ var code_tests_default2 = '<slot name="header">\n <header id="header">\n <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>\n <slot name="play-button">\n <button type="button" class="run" data-all>\n <slot name="play-button-label">\n <span id="play-button-label" class="button-label label icon">Run Tests</span>\n </slot>\n </button>\n </slot>\n <slot name="details"></slot>\n </header>\n</slot>\n<details id="required-before-any-details" class="hook">\n <summary id="required-before-any-summary">\n <span id="required-before-any-result-icon" class="result-icon"></span>\n <span id="required-before-any-description" class="description">Results from Required Before Any Hook</span>\n </summary>\n <div id="required-before-any-results" class="results"></div>\n</details>\n<details id="before-all-details" class="hook">\n <summary id="before-all-summary">\n <span id="before-all-result-icon" class="result-icon"></span>\n <span id="before-all-description" class="description">Results from Before All Hook</span>\n </summary>\n <div id="before-all-results" class="results"></div>\n</details>\n<ul id="tests"></ul>\n<details id="after-all-details" class="hook">\n <summary id="after-all-summary">\n <span id="after-all-result-icon" class="result-icon"></span>\n <span id="after-all-description" class="description">Results from After All Hook</span>\n </summary>\n <div id="after-all-results" class="results"></div>\n</details>\n<details id="required-after-any-details" class="hook">\n <summary id="required-after-any-summary">\n <span id="required-after-any-result-icon" class="result-icon"></span>\n <span id="required-after-any-description" class="description">Results from Required After Any Hook</span>\n </summary>\n <div id="required-after-any-results" class="results"></div>\n</details>\n\n<template id="prompt-template">\n <div class="prompt" part="prompt">\n <div class="prompt-display">\n <span class="icon prompt-icon"></span>\n <span class="label prompt-label"></span>\n </div>\n <div class="prompt-actions">\n <button class="prompt-button accept" type="button">Accept</button>\n <button class="prompt-button reject" type="button">Reject</button>\n </div>\n </div>\n</template>';
435
446
 
436
447
  // src/api.ts
437
448
  var TestPromise = class extends Promise {
@@ -463,10 +474,6 @@ var TestPromise = class extends Promise {
463
474
  }
464
475
  }
465
476
  };
466
- var BEFOREALL = Symbol("beforeAll");
467
- var BEFOREEACH = Symbol("beforeEach");
468
- var AFTERALL = Symbol("afterAll");
469
- var AFTEREACH = Symbol("afterEach");
470
477
  var CodeTests = class _CodeTests {
471
478
  static timeoutMS = 500;
472
479
  static #expectInterval;
@@ -574,6 +581,15 @@ function assignClassAndIdToPart(shadowRoot) {
574
581
  }
575
582
 
576
583
  // src/code-tests.ts
584
+ var HookType = /* @__PURE__ */ ((HookType2) => {
585
+ HookType2["BeforeAll"] = "beforeall";
586
+ HookType2["AfterAll"] = "afterall";
587
+ HookType2["BeforeEach"] = "beforeeach";
588
+ HookType2["AfterEach"] = "aftereach";
589
+ HookType2["RequiredBeforeAny"] = "requiredbeforeany";
590
+ HookType2["RequiredAfterAny"] = "requiredafterany";
591
+ return HookType2;
592
+ })(HookType || {});
577
593
  var CodeTestEventType = /* @__PURE__ */ ((CodeTestEventType2) => {
578
594
  CodeTestEventType2["BeforeAll"] = "beforeall";
579
595
  CodeTestEventType2["AfterAll"] = "afterall";
@@ -600,13 +616,7 @@ var CodeTestsElement = class extends HTMLElement {
600
616
  findElement(id) {
601
617
  return this.shadowRoot.getElementById(id);
602
618
  }
603
- #hooks = /* @__PURE__ */ new Map();
604
- #hookIds = {
605
- [BEFOREALL]: generateId(),
606
- [BEFOREEACH]: generateId(),
607
- [AFTEREACH]: generateId(),
608
- [AFTERALL]: generateId()
609
- };
619
+ #hooks = {};
610
620
  #continueRunningTests = true;
611
621
  constructor() {
612
622
  super();
@@ -621,7 +631,7 @@ var CodeTestsElement = class extends HTMLElement {
621
631
  if (this.getAttribute("auto") == "false") {
622
632
  return;
623
633
  }
624
- const testsPath = this.getAttribute("src") ?? this.getAttribute("test") ?? this.getAttribute("tests") ?? this.getAttribute("run") ?? this.getAttribute("path");
634
+ const testsPath = this.#getCurrentTestsPath();
625
635
  if (testsPath == null) {
626
636
  return;
627
637
  }
@@ -691,82 +701,44 @@ var CodeTestsElement = class extends HTMLElement {
691
701
  if (tests == void 0) {
692
702
  throw new Error(`Unable to find tests definition in file at path: ${path}`);
693
703
  }
694
- const beforeAll = tests[BEFOREALL];
704
+ const beforeAll = tests["beforeall" /* BeforeAll */];
695
705
  if (beforeAll != null) {
696
- const hookMap = this.#hooks.get(BEFOREALL);
697
- if (hookMap == null) {
698
- const map = /* @__PURE__ */ new Map();
699
- map.set(beforeAll, /* @__PURE__ */ new Set());
700
- this.#hooks.set(BEFOREALL, map);
701
- }
706
+ this.#hooks["beforeall" /* BeforeAll */] = beforeAll;
707
+ delete tests["beforeall" /* BeforeAll */];
702
708
  this.classList.add("has-before-hook");
703
709
  }
704
- const beforeEach = tests[BEFOREEACH];
705
- if (beforeEach != null) {
706
- const hookMap = this.#hooks.get(BEFOREEACH);
707
- if (hookMap == null) {
708
- const map = /* @__PURE__ */ new Map();
709
- map.set(beforeEach, /* @__PURE__ */ new Set());
710
- this.#hooks.set(BEFOREEACH, map);
711
- }
712
- }
713
- const afterAll = tests[AFTERALL];
710
+ const afterAll = tests["afterall" /* AfterAll */];
714
711
  if (afterAll != null) {
715
- const hookMap = this.#hooks.get(AFTERALL);
716
- if (hookMap == null) {
717
- const map = /* @__PURE__ */ new Map();
718
- map.set(afterAll, /* @__PURE__ */ new Set());
719
- this.#hooks.set(AFTERALL, map);
720
- }
712
+ this.#hooks["afterall" /* AfterAll */] = afterAll;
713
+ delete tests["afterall" /* AfterAll */];
721
714
  this.classList.add("has-after-hook");
722
715
  }
723
- const afterEach = tests[AFTEREACH];
716
+ const beforeEach = tests["beforeeach" /* BeforeEach */];
717
+ if (beforeEach != null) {
718
+ this.#hooks["beforeeach" /* BeforeEach */] = beforeEach;
719
+ delete tests["beforeeach" /* BeforeEach */];
720
+ }
721
+ const afterEach = tests["aftereach" /* AfterEach */];
724
722
  if (afterEach != null) {
725
- const hookMap = this.#hooks.get(AFTEREACH);
726
- if (hookMap == null) {
727
- const map = /* @__PURE__ */ new Map();
728
- map.set(afterEach, /* @__PURE__ */ new Set());
729
- this.#hooks.set(AFTEREACH, map);
730
- }
723
+ this.#hooks["aftereach" /* AfterEach */] = afterEach;
724
+ delete tests["aftereach" /* AfterEach */];
725
+ }
726
+ const requiredBeforeAny = tests["requiredbeforeany" /* RequiredBeforeAny */];
727
+ if (requiredBeforeAny != null) {
728
+ this.#hooks["requiredbeforeany" /* RequiredBeforeAny */] = requiredBeforeAny;
729
+ delete tests["requiredbeforeany" /* RequiredBeforeAny */];
730
+ this.classList.add("has-required-before-hook");
731
+ this.part.add("has-required-before-hook");
732
+ }
733
+ const requiredAfterAny = tests["requiredafterany" /* RequiredAfterAny */];
734
+ if (requiredAfterAny != null) {
735
+ this.#hooks["requiredafterany" /* RequiredAfterAny */] = requiredAfterAny;
736
+ delete tests["requiredafterany" /* RequiredAfterAny */];
737
+ this.classList.add("has-required-after-hook");
738
+ this.part.add("has-required-after-hook");
731
739
  }
732
740
  for (const [description, test] of Object.entries(tests)) {
733
- const id = this.#addTest(description, test);
734
- if (beforeAll != null) {
735
- const hookMap = this.#hooks.get(BEFOREALL);
736
- if (hookMap != null) {
737
- const testIds = hookMap.get(beforeAll);
738
- if (testIds != null) {
739
- testIds.add(id);
740
- }
741
- }
742
- }
743
- if (beforeEach != null) {
744
- const hookMap = this.#hooks.get(BEFOREEACH);
745
- if (hookMap != null) {
746
- const testIds = hookMap.get(beforeEach);
747
- if (testIds != null) {
748
- testIds.add(id);
749
- }
750
- }
751
- }
752
- if (afterAll != null) {
753
- const hookMap = this.#hooks.get(AFTERALL);
754
- if (hookMap != null) {
755
- const testIds = hookMap.get(afterAll);
756
- if (testIds != null) {
757
- testIds.add(id);
758
- }
759
- }
760
- }
761
- if (afterEach != null) {
762
- const hookMap = this.#hooks.get(AFTEREACH);
763
- if (hookMap != null) {
764
- const testIds = hookMap.get(afterEach);
765
- if (testIds != null) {
766
- testIds.add(id);
767
- }
768
- }
769
- }
741
+ this.#addTest(description, test);
770
742
  }
771
743
  } catch (error) {
772
744
  this.#addProcessError("An error occurred while loading the tasks:", error);
@@ -793,24 +765,49 @@ var CodeTestsElement = class extends HTMLElement {
793
765
  }
794
766
  this.#clearTestStatuses();
795
767
  const inOrder = this.hasAttribute("in-order");
796
- const beforeHooks = this.#hooks.get(BEFOREALL);
797
- if (beforeHooks != null) {
768
+ const requiredBeforeHook = this.#hooks["requiredbeforeany" /* RequiredBeforeAny */];
769
+ if (requiredBeforeHook != null) {
770
+ let hookResult;
771
+ try {
772
+ const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
773
+ requiredBeforeAnyHookElement.classList.add("running");
774
+ requiredBeforeAnyHookElement.part.add("running");
775
+ if (this.isCanceled == true) {
776
+ throw new Error("Test has been cancelled");
777
+ }
778
+ hookResult = await requiredBeforeHook(this, requiredBeforeAnyHookElement);
779
+ this.#handleHookResult(hookResult, true, "before", true);
780
+ requiredBeforeAnyHookElement.part.remove("running");
781
+ requiredBeforeAnyHookElement.classList.remove("running");
782
+ } catch (error) {
783
+ this.#handleHookResult(hookResult, false, "before", true, error);
784
+ console.error(error);
785
+ this.#continueRunningTests = false;
786
+ this.classList.remove("running");
787
+ this.part.remove("running");
788
+ if (playButtonLabel != null) {
789
+ playButtonLabel.textContent = "Run Tests";
790
+ }
791
+ this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
792
+ return;
793
+ }
794
+ }
795
+ const beforeHook = this.#hooks["beforeall" /* BeforeAll */];
796
+ if (beforeHook != null) {
798
797
  let hookResult;
799
798
  try {
800
799
  const beforeAllHookElement = this.getElement(`before-all-details`);
801
800
  beforeAllHookElement.classList.add("running");
802
801
  beforeAllHookElement.part.add("running");
803
- for (const [hook, ids] of beforeHooks) {
804
- if (this.isCanceled == true) {
805
- throw new Error("Test has been cancelled");
806
- }
807
- hookResult = await hook(this, beforeAllHookElement);
808
- this.#handleHookResult(hookResult, true, "before");
802
+ if (this.isCanceled == true) {
803
+ throw new Error("Test has been cancelled");
809
804
  }
805
+ hookResult = await beforeHook(this, beforeAllHookElement);
806
+ this.#handleHookResult(hookResult, true, "before", false);
810
807
  beforeAllHookElement.part.remove("running");
811
808
  beforeAllHookElement.classList.remove("running");
812
809
  } catch (error) {
813
- this.#handleHookResult(hookResult, false, "before", error);
810
+ this.#handleHookResult(hookResult, false, "before", false, error);
814
811
  console.error(error);
815
812
  this.#continueRunningTests = false;
816
813
  this.classList.remove("running");
@@ -833,7 +830,7 @@ var CodeTestsElement = class extends HTMLElement {
833
830
  if (this.#continueRunningTests == false) {
834
831
  break;
835
832
  }
836
- await this.#runTest(id, test);
833
+ await this.#runTest(id, test, false);
837
834
  }
838
835
  }
839
836
  if (this.#continueRunningTests == false) {
@@ -845,25 +842,42 @@ var CodeTestsElement = class extends HTMLElement {
845
842
  this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
846
843
  return;
847
844
  }
848
- const afterHooks = this.#hooks.get(AFTERALL);
849
- if (afterHooks != null) {
845
+ const afterHook = this.#hooks["afterall" /* AfterAll */];
846
+ if (afterHook != null) {
850
847
  let hookResult;
851
848
  try {
852
849
  const afterAllHookElement = this.getElement(`after-all-details`);
853
850
  afterAllHookElement.classList.add("running");
854
851
  afterAllHookElement.part.add("running");
855
- for (const [hook, ids] of afterHooks) {
856
- if (this.isCanceled == true) {
857
- throw new Error("Test has been cancelled");
858
- }
859
- hookResult = await hook(this, afterAllHookElement);
860
- this.#handleHookResult(hookResult, true, "after");
852
+ if (this.isCanceled == true) {
853
+ throw new Error("Test has been cancelled");
861
854
  }
855
+ hookResult = await afterHook(this, afterAllHookElement);
856
+ this.#handleHookResult(hookResult, true, "after", false);
862
857
  afterAllHookElement.part.remove("running");
863
858
  afterAllHookElement.classList.remove("running");
864
859
  } catch (error) {
865
- this.#handleHookResult(hookResult, false, "after", error);
860
+ this.#handleHookResult(hookResult, false, "after", false, error);
866
861
  console.error(error);
862
+ const requiredAfterHook2 = this.#hooks["requiredafterany" /* RequiredAfterAny */];
863
+ if (requiredAfterHook2 != null) {
864
+ let hookResult2;
865
+ try {
866
+ const requiredAfterAnyHookElement = this.getElement(`required-after-any-details`);
867
+ requiredAfterAnyHookElement.classList.add("running");
868
+ requiredAfterAnyHookElement.part.add("running");
869
+ if (this.isCanceled == true) {
870
+ throw new Error("Test has been cancelled");
871
+ }
872
+ hookResult2 = await requiredAfterHook2(this, requiredAfterAnyHookElement);
873
+ this.#handleHookResult(hookResult2, true, "after", true);
874
+ requiredAfterAnyHookElement.part.remove("running");
875
+ requiredAfterAnyHookElement.classList.remove("running");
876
+ } catch (error2) {
877
+ this.#handleHookResult(hookResult2, false, "after", true, error2);
878
+ console.error(error2);
879
+ }
880
+ }
867
881
  this.#continueRunningTests = false;
868
882
  this.classList.remove("running");
869
883
  this.part.remove("running");
@@ -874,6 +888,26 @@ var CodeTestsElement = class extends HTMLElement {
874
888
  return;
875
889
  }
876
890
  }
891
+ const requiredAfterHook = this.#hooks["requiredafterany" /* RequiredAfterAny */];
892
+ if (requiredAfterHook != null) {
893
+ let hookResult;
894
+ try {
895
+ const requiredAfterAnyHookElement = this.getElement(`required-after-any-details`);
896
+ requiredAfterAnyHookElement.classList.add("running");
897
+ requiredAfterAnyHookElement.part.add("running");
898
+ if (this.isCanceled == true) {
899
+ throw new Error("Test has been cancelled");
900
+ }
901
+ hookResult = await requiredAfterHook(this, requiredAfterAnyHookElement);
902
+ this.#handleHookResult(hookResult, true, "after", true);
903
+ requiredAfterAnyHookElement.part.remove("running");
904
+ requiredAfterAnyHookElement.classList.remove("running");
905
+ } catch (error) {
906
+ this.#handleHookResult(hookResult, false, "after", true, error);
907
+ console.error(error);
908
+ this.#continueRunningTests = false;
909
+ }
910
+ }
877
911
  const failedTests = this.shadowRoot.querySelectorAll('[success="false"]');
878
912
  this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
879
913
  this.classList.remove("running");
@@ -903,7 +937,7 @@ var CodeTestsElement = class extends HTMLElement {
903
937
  afterAllHookElement.classList.remove("success", "fail");
904
938
  afterAllHookElement.part.remove("success", "fail");
905
939
  }
906
- async #runTest(testId, test) {
940
+ async #runTest(testId, test, handleRequiredTests = true) {
907
941
  const testElement = this.getElement("tests").querySelector(`[data-test-id="${testId}"]`);
908
942
  if (testElement == null) {
909
943
  this.#addProcessError(`Unable to find test element for test: ${testId}`);
@@ -933,17 +967,38 @@ var CodeTestsElement = class extends HTMLElement {
933
967
  let testType;
934
968
  try {
935
969
  const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
970
+ if (handleRequiredTests == true) {
971
+ const requiredBeforeHook = this.#hooks["requiredbeforeany" /* RequiredBeforeAny */];
972
+ if (requiredBeforeHook != null) {
973
+ let hookResult;
974
+ try {
975
+ const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
976
+ requiredBeforeAnyHookElement.classList.add("running");
977
+ requiredBeforeAnyHookElement.part.add("running");
978
+ if (this.isCanceled == true) {
979
+ throw new Error("Test has been cancelled");
980
+ }
981
+ hookResult = await requiredBeforeHook(this, requiredBeforeAnyHookElement);
982
+ this.#handleHookResult(hookResult, true, "before", true);
983
+ requiredBeforeAnyHookElement.part.remove("running");
984
+ requiredBeforeAnyHookElement.classList.remove("running");
985
+ } catch (error) {
986
+ this.#handleHookResult(hookResult, true, "before", true, error);
987
+ console.error(error);
988
+ this.#continueRunningTests = false;
989
+ return;
990
+ }
991
+ }
992
+ }
993
+ if (this.#continueRunningTests == false) {
994
+ throw new Error("Tests have been disabled from continuing to run.");
995
+ }
936
996
  if (allowTest == false || this.isCanceled == true) {
937
997
  throw new Error("Test has been cancelled");
938
998
  }
939
- const beforeHooks = this.#hooks.get(BEFOREEACH);
940
- if (beforeHooks != null) {
941
- for (const [hook, ids] of beforeHooks) {
942
- if (ids.has(testId)) {
943
- beforeResult = await hook(this, testElement);
944
- break;
945
- }
946
- }
999
+ const beforeHook = this.#hooks["beforeeach" /* BeforeEach */];
1000
+ if (beforeHook != null) {
1001
+ beforeResult = await beforeHook(this, testElement);
947
1002
  }
948
1003
  if (this.isCanceled == true) {
949
1004
  throw new Error("Test has been cancelled");
@@ -952,12 +1007,30 @@ var CodeTestsElement = class extends HTMLElement {
952
1007
  if (this.isCanceled == true) {
953
1008
  throw new Error("Test has been cancelled");
954
1009
  }
955
- const afterHooks = this.#hooks.get(AFTEREACH);
956
- if (afterHooks != null) {
957
- for (const [hook, ids] of afterHooks) {
958
- if (ids.has(testId)) {
959
- afterResult = await hook(this, testElement);
960
- break;
1010
+ const afterHook = this.#hooks["aftereach" /* AfterEach */];
1011
+ if (afterHook != null) {
1012
+ afterResult = await afterHook(this, testElement);
1013
+ }
1014
+ if (handleRequiredTests == true) {
1015
+ const requiredAfterHook = this.#hooks["requiredafterany" /* RequiredAfterAny */];
1016
+ if (requiredAfterHook != null) {
1017
+ let hookResult;
1018
+ try {
1019
+ const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
1020
+ requiredBeforeAnyHookElement.classList.add("running");
1021
+ requiredBeforeAnyHookElement.part.add("running");
1022
+ if (this.isCanceled == true) {
1023
+ throw new Error("Test has been cancelled");
1024
+ }
1025
+ hookResult = await requiredAfterHook(this, requiredBeforeAnyHookElement);
1026
+ this.#handleHookResult(hookResult, true, "after", true);
1027
+ requiredBeforeAnyHookElement.part.remove("running");
1028
+ requiredBeforeAnyHookElement.classList.remove("running");
1029
+ } catch (error) {
1030
+ this.#handleHookResult(hookResult, true, "after", true, error);
1031
+ console.error(error);
1032
+ this.#continueRunningTests = false;
1033
+ return;
961
1034
  }
962
1035
  }
963
1036
  }
@@ -1015,19 +1088,19 @@ Result:${objectResult.value}`,
1015
1088
  detailsElement.open = true;
1016
1089
  }
1017
1090
  }
1018
- #handleHookResult(result, finishedTest, beforeOrAfter, error) {
1091
+ #handleHookResult(result, finishedTest, beforeOrAfter, required, error) {
1019
1092
  if (result instanceof HTMLElement) {
1020
- this.#setHookResult(result, finishedTest, beforeOrAfter);
1093
+ this.#setHookResult(result, finishedTest, beforeOrAfter, required);
1021
1094
  } else {
1022
1095
  let defaultResult;
1023
1096
  if (result == void 0) {
1024
1097
  defaultResult = this.#createDefaultResult(finishedTest == true ? "Hook Ran Successfully" : `Failed${error != null ? `:
1025
1098
  ${error.message}` : ""}`, finishedTest);
1026
- this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
1099
+ this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
1027
1100
  } else if (typeof result == "string") {
1028
1101
  defaultResult = this.#createDefaultResult(`${result}${error == null ? "" : `:
1029
1102
  ${error.message}`}`, finishedTest);
1030
- this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
1103
+ this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
1031
1104
  } else if (typeof result == "object") {
1032
1105
  const objectResult = result;
1033
1106
  if (objectResult.success != void 0 && objectResult.expected != void 0 && objectResult.value != void 0) {
@@ -1037,7 +1110,7 @@ Expected:${objectResult.expected}
1037
1110
  Result:${objectResult.value}`,
1038
1111
  objectResult.success
1039
1112
  );
1040
- this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
1113
+ this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
1041
1114
  }
1042
1115
  }
1043
1116
  }
@@ -1130,9 +1203,10 @@ Result:${objectResult.value}`,
1130
1203
  codeElement.appendChild(preElement);
1131
1204
  return codeElement;
1132
1205
  }
1133
- #setHookResult(valueElement, success, beforeOrAfter) {
1134
- const detailsElement = this.getElement(`${beforeOrAfter}-all-details`);
1135
- const resultsElement = this.getElement(`${beforeOrAfter}-all-results`);
1206
+ #setHookResult(valueElement, success, beforeOrAfter, required) {
1207
+ const selector = required == true ? `required-${beforeOrAfter}-any` : `${beforeOrAfter}-all`;
1208
+ const detailsElement = this.getElement(`${selector}-details`);
1209
+ const resultsElement = this.getElement(`${selector}-results`);
1136
1210
  detailsElement.setAttribute("success", success == true ? "true" : "false");
1137
1211
  detailsElement.classList.toggle("success", success);
1138
1212
  detailsElement.part.toggle("success", success);
@@ -1213,13 +1287,10 @@ if (customElements.get(COMPONENT_TAG_NAME) == null) {
1213
1287
  }
1214
1288
  // Annotate the CommonJS export names for ESM import in node:
1215
1289
  0 && (module.exports = {
1216
- AFTERALL,
1217
- AFTEREACH,
1218
- BEFOREALL,
1219
- BEFOREEACH,
1220
1290
  CodeTestEventType,
1221
1291
  CodeTests,
1222
1292
  CodeTestsElement,
1293
+ HookType,
1223
1294
  expect,
1224
1295
  prompt
1225
1296
  });
@@ -4,10 +4,6 @@ declare class TestPromise<T> extends Promise<T> {
4
4
  toContainText(value: string): Promise<void>;
5
5
  toHaveAttribute(value: string): Promise<void>;
6
6
  }
7
- declare const BEFOREALL: unique symbol;
8
- declare const BEFOREEACH: unique symbol;
9
- declare const AFTERALL: unique symbol;
10
- declare const AFTEREACH: unique symbol;
11
7
  declare class CodeTests {
12
8
  #private;
13
9
  static timeoutMS: number;
@@ -27,6 +23,14 @@ type PromptOptions = {
27
23
  declare function prompt(host: CodeTestsElement, parent: HTMLElement, message: string, options?: PromptOptions): Promise<boolean>;
28
24
 
29
25
  type CodeTestsProperties = {};
26
+ declare enum HookType {
27
+ BeforeAll = "beforeall",
28
+ AfterAll = "afterall",
29
+ BeforeEach = "beforeeach",
30
+ AfterEach = "aftereach",
31
+ RequiredBeforeAny = "requiredbeforeany",
32
+ RequiredAfterAny = "requiredafterany"
33
+ }
30
34
  declare enum CodeTestEventType {
31
35
  BeforeAll = "beforeall",
32
36
  AfterAll = "afterall",
@@ -51,4 +55,4 @@ declare class CodeTestsElement extends HTMLElement {
51
55
  attributeChangedCallback(attributeName: string, oldValue: string, newValue: string): void;
52
56
  }
53
57
 
54
- export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, expect, prompt };
58
+ export { CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, HookType, expect, prompt };
@@ -4,10 +4,6 @@ declare class TestPromise<T> extends Promise<T> {
4
4
  toContainText(value: string): Promise<void>;
5
5
  toHaveAttribute(value: string): Promise<void>;
6
6
  }
7
- declare const BEFOREALL: unique symbol;
8
- declare const BEFOREEACH: unique symbol;
9
- declare const AFTERALL: unique symbol;
10
- declare const AFTEREACH: unique symbol;
11
7
  declare class CodeTests {
12
8
  #private;
13
9
  static timeoutMS: number;
@@ -27,6 +23,14 @@ type PromptOptions = {
27
23
  declare function prompt(host: CodeTestsElement, parent: HTMLElement, message: string, options?: PromptOptions): Promise<boolean>;
28
24
 
29
25
  type CodeTestsProperties = {};
26
+ declare enum HookType {
27
+ BeforeAll = "beforeall",
28
+ AfterAll = "afterall",
29
+ BeforeEach = "beforeeach",
30
+ AfterEach = "aftereach",
31
+ RequiredBeforeAny = "requiredbeforeany",
32
+ RequiredAfterAny = "requiredafterany"
33
+ }
30
34
  declare enum CodeTestEventType {
31
35
  BeforeAll = "beforeall",
32
36
  AfterAll = "afterall",
@@ -51,4 +55,4 @@ declare class CodeTestsElement extends HTMLElement {
51
55
  attributeChangedCallback(attributeName: string, oldValue: string, newValue: string): void;
52
56
  }
53
57
 
54
- export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, expect, prompt };
58
+ export { CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, HookType, expect, prompt };
@@ -129,11 +129,25 @@ var code_tests_default = `:host
129
129
  display: none;
130
130
  }
131
131
  :host(.has-before-hook) #before-all-details
132
- ,:host(.has-before-hook) #after-all-details
132
+ ,:host(.has-after-hook) #after-all-details
133
+ {
134
+ display: initial;
135
+ }
136
+ :host(.has-required-before-hook) #required-before-any-details
137
+ ,:host(.has-required-after-hook) #required-after-any-details
133
138
  {
134
139
  display: initial;
135
140
  }
136
141
 
142
+ #required-before-any-summary
143
+ ,#required-after-any-summary
144
+ {
145
+ background: var(--surface-process);
146
+ color: var(--text-process);
147
+ border: solid 1px var(--text-process);
148
+ grid-template-columns: auto auto 1fr;
149
+ }
150
+
137
151
  #tests
138
152
  {
139
153
  margin: 0;
@@ -397,7 +411,7 @@ pre
397
411
  }`;
398
412
 
399
413
  // src/code-tests.html?raw
400
- var code_tests_default2 = '<slot name="header">\n <header id="header">\n <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>\n <slot name="play-button">\n <button type="button" class="run" data-all>\n <slot name="play-button-label">\n <span id="play-button-label" class="button-label label icon">Run Tests</span>\n </slot>\n </button>\n </slot>\n <slot name="details"></slot>\n </header>\n</slot>\n<details id="before-all-details" class="hook">\n <summary id="before-all-summary">\n <span id="before-all-result-icon" class="result-icon"></span>\n <span id="before-all-description" class="description">Results from Before All Hook</span>\n </summary>\n <div id="before-all-results" class="results"></div>\n</details>\n<ul id="tests"></ul>\n<details id="after-all-details" class="hook">\n <summary id="after-all-summary">\n <span id="after-all-result-icon" class="result-icon"></span>\n <span id="after-all-description" class="description">Results from After All Hook</span>\n </summary>\n <div id="after-all-results" class="results"></div>\n</details>\n\n<template id="prompt-template">\n <div class="prompt" part="prompt">\n <div class="prompt-display">\n <span class="icon prompt-icon"></span>\n <span class="label prompt-label"></span>\n </div>\n <div class="prompt-actions">\n <button class="prompt-button accept" type="button">Accept</button>\n <button class="prompt-button reject" type="button">Reject</button>\n </div>\n </div>\n</template>';
414
+ var code_tests_default2 = '<slot name="header">\n <header id="header">\n <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>\n <slot name="play-button">\n <button type="button" class="run" data-all>\n <slot name="play-button-label">\n <span id="play-button-label" class="button-label label icon">Run Tests</span>\n </slot>\n </button>\n </slot>\n <slot name="details"></slot>\n </header>\n</slot>\n<details id="required-before-any-details" class="hook">\n <summary id="required-before-any-summary">\n <span id="required-before-any-result-icon" class="result-icon"></span>\n <span id="required-before-any-description" class="description">Results from Required Before Any Hook</span>\n </summary>\n <div id="required-before-any-results" class="results"></div>\n</details>\n<details id="before-all-details" class="hook">\n <summary id="before-all-summary">\n <span id="before-all-result-icon" class="result-icon"></span>\n <span id="before-all-description" class="description">Results from Before All Hook</span>\n </summary>\n <div id="before-all-results" class="results"></div>\n</details>\n<ul id="tests"></ul>\n<details id="after-all-details" class="hook">\n <summary id="after-all-summary">\n <span id="after-all-result-icon" class="result-icon"></span>\n <span id="after-all-description" class="description">Results from After All Hook</span>\n </summary>\n <div id="after-all-results" class="results"></div>\n</details>\n<details id="required-after-any-details" class="hook">\n <summary id="required-after-any-summary">\n <span id="required-after-any-result-icon" class="result-icon"></span>\n <span id="required-after-any-description" class="description">Results from Required After Any Hook</span>\n </summary>\n <div id="required-after-any-results" class="results"></div>\n</details>\n\n<template id="prompt-template">\n <div class="prompt" part="prompt">\n <div class="prompt-display">\n <span class="icon prompt-icon"></span>\n <span class="label prompt-label"></span>\n </div>\n <div class="prompt-actions">\n <button class="prompt-button accept" type="button">Accept</button>\n <button class="prompt-button reject" type="button">Reject</button>\n </div>\n </div>\n</template>';
401
415
 
402
416
  // src/api.ts
403
417
  var TestPromise = class extends Promise {
@@ -429,10 +443,6 @@ var TestPromise = class extends Promise {
429
443
  }
430
444
  }
431
445
  };
432
- var BEFOREALL = Symbol("beforeAll");
433
- var BEFOREEACH = Symbol("beforeEach");
434
- var AFTERALL = Symbol("afterAll");
435
- var AFTEREACH = Symbol("afterEach");
436
446
  var CodeTests = class _CodeTests {
437
447
  static timeoutMS = 500;
438
448
  static #expectInterval;
@@ -540,6 +550,15 @@ function assignClassAndIdToPart(shadowRoot) {
540
550
  }
541
551
 
542
552
  // src/code-tests.ts
553
+ var HookType = /* @__PURE__ */ ((HookType2) => {
554
+ HookType2["BeforeAll"] = "beforeall";
555
+ HookType2["AfterAll"] = "afterall";
556
+ HookType2["BeforeEach"] = "beforeeach";
557
+ HookType2["AfterEach"] = "aftereach";
558
+ HookType2["RequiredBeforeAny"] = "requiredbeforeany";
559
+ HookType2["RequiredAfterAny"] = "requiredafterany";
560
+ return HookType2;
561
+ })(HookType || {});
543
562
  var CodeTestEventType = /* @__PURE__ */ ((CodeTestEventType2) => {
544
563
  CodeTestEventType2["BeforeAll"] = "beforeall";
545
564
  CodeTestEventType2["AfterAll"] = "afterall";
@@ -566,13 +585,7 @@ var CodeTestsElement = class extends HTMLElement {
566
585
  findElement(id) {
567
586
  return this.shadowRoot.getElementById(id);
568
587
  }
569
- #hooks = /* @__PURE__ */ new Map();
570
- #hookIds = {
571
- [BEFOREALL]: generateId(),
572
- [BEFOREEACH]: generateId(),
573
- [AFTEREACH]: generateId(),
574
- [AFTERALL]: generateId()
575
- };
588
+ #hooks = {};
576
589
  #continueRunningTests = true;
577
590
  constructor() {
578
591
  super();
@@ -587,7 +600,7 @@ var CodeTestsElement = class extends HTMLElement {
587
600
  if (this.getAttribute("auto") == "false") {
588
601
  return;
589
602
  }
590
- const testsPath = this.getAttribute("src") ?? this.getAttribute("test") ?? this.getAttribute("tests") ?? this.getAttribute("run") ?? this.getAttribute("path");
603
+ const testsPath = this.#getCurrentTestsPath();
591
604
  if (testsPath == null) {
592
605
  return;
593
606
  }
@@ -657,82 +670,44 @@ var CodeTestsElement = class extends HTMLElement {
657
670
  if (tests == void 0) {
658
671
  throw new Error(`Unable to find tests definition in file at path: ${path}`);
659
672
  }
660
- const beforeAll = tests[BEFOREALL];
673
+ const beforeAll = tests["beforeall" /* BeforeAll */];
661
674
  if (beforeAll != null) {
662
- const hookMap = this.#hooks.get(BEFOREALL);
663
- if (hookMap == null) {
664
- const map = /* @__PURE__ */ new Map();
665
- map.set(beforeAll, /* @__PURE__ */ new Set());
666
- this.#hooks.set(BEFOREALL, map);
667
- }
675
+ this.#hooks["beforeall" /* BeforeAll */] = beforeAll;
676
+ delete tests["beforeall" /* BeforeAll */];
668
677
  this.classList.add("has-before-hook");
669
678
  }
670
- const beforeEach = tests[BEFOREEACH];
671
- if (beforeEach != null) {
672
- const hookMap = this.#hooks.get(BEFOREEACH);
673
- if (hookMap == null) {
674
- const map = /* @__PURE__ */ new Map();
675
- map.set(beforeEach, /* @__PURE__ */ new Set());
676
- this.#hooks.set(BEFOREEACH, map);
677
- }
678
- }
679
- const afterAll = tests[AFTERALL];
679
+ const afterAll = tests["afterall" /* AfterAll */];
680
680
  if (afterAll != null) {
681
- const hookMap = this.#hooks.get(AFTERALL);
682
- if (hookMap == null) {
683
- const map = /* @__PURE__ */ new Map();
684
- map.set(afterAll, /* @__PURE__ */ new Set());
685
- this.#hooks.set(AFTERALL, map);
686
- }
681
+ this.#hooks["afterall" /* AfterAll */] = afterAll;
682
+ delete tests["afterall" /* AfterAll */];
687
683
  this.classList.add("has-after-hook");
688
684
  }
689
- const afterEach = tests[AFTEREACH];
685
+ const beforeEach = tests["beforeeach" /* BeforeEach */];
686
+ if (beforeEach != null) {
687
+ this.#hooks["beforeeach" /* BeforeEach */] = beforeEach;
688
+ delete tests["beforeeach" /* BeforeEach */];
689
+ }
690
+ const afterEach = tests["aftereach" /* AfterEach */];
690
691
  if (afterEach != null) {
691
- const hookMap = this.#hooks.get(AFTEREACH);
692
- if (hookMap == null) {
693
- const map = /* @__PURE__ */ new Map();
694
- map.set(afterEach, /* @__PURE__ */ new Set());
695
- this.#hooks.set(AFTEREACH, map);
696
- }
692
+ this.#hooks["aftereach" /* AfterEach */] = afterEach;
693
+ delete tests["aftereach" /* AfterEach */];
694
+ }
695
+ const requiredBeforeAny = tests["requiredbeforeany" /* RequiredBeforeAny */];
696
+ if (requiredBeforeAny != null) {
697
+ this.#hooks["requiredbeforeany" /* RequiredBeforeAny */] = requiredBeforeAny;
698
+ delete tests["requiredbeforeany" /* RequiredBeforeAny */];
699
+ this.classList.add("has-required-before-hook");
700
+ this.part.add("has-required-before-hook");
701
+ }
702
+ const requiredAfterAny = tests["requiredafterany" /* RequiredAfterAny */];
703
+ if (requiredAfterAny != null) {
704
+ this.#hooks["requiredafterany" /* RequiredAfterAny */] = requiredAfterAny;
705
+ delete tests["requiredafterany" /* RequiredAfterAny */];
706
+ this.classList.add("has-required-after-hook");
707
+ this.part.add("has-required-after-hook");
697
708
  }
698
709
  for (const [description, test] of Object.entries(tests)) {
699
- const id = this.#addTest(description, test);
700
- if (beforeAll != null) {
701
- const hookMap = this.#hooks.get(BEFOREALL);
702
- if (hookMap != null) {
703
- const testIds = hookMap.get(beforeAll);
704
- if (testIds != null) {
705
- testIds.add(id);
706
- }
707
- }
708
- }
709
- if (beforeEach != null) {
710
- const hookMap = this.#hooks.get(BEFOREEACH);
711
- if (hookMap != null) {
712
- const testIds = hookMap.get(beforeEach);
713
- if (testIds != null) {
714
- testIds.add(id);
715
- }
716
- }
717
- }
718
- if (afterAll != null) {
719
- const hookMap = this.#hooks.get(AFTERALL);
720
- if (hookMap != null) {
721
- const testIds = hookMap.get(afterAll);
722
- if (testIds != null) {
723
- testIds.add(id);
724
- }
725
- }
726
- }
727
- if (afterEach != null) {
728
- const hookMap = this.#hooks.get(AFTEREACH);
729
- if (hookMap != null) {
730
- const testIds = hookMap.get(afterEach);
731
- if (testIds != null) {
732
- testIds.add(id);
733
- }
734
- }
735
- }
710
+ this.#addTest(description, test);
736
711
  }
737
712
  } catch (error) {
738
713
  this.#addProcessError("An error occurred while loading the tasks:", error);
@@ -759,24 +734,49 @@ var CodeTestsElement = class extends HTMLElement {
759
734
  }
760
735
  this.#clearTestStatuses();
761
736
  const inOrder = this.hasAttribute("in-order");
762
- const beforeHooks = this.#hooks.get(BEFOREALL);
763
- if (beforeHooks != null) {
737
+ const requiredBeforeHook = this.#hooks["requiredbeforeany" /* RequiredBeforeAny */];
738
+ if (requiredBeforeHook != null) {
739
+ let hookResult;
740
+ try {
741
+ const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
742
+ requiredBeforeAnyHookElement.classList.add("running");
743
+ requiredBeforeAnyHookElement.part.add("running");
744
+ if (this.isCanceled == true) {
745
+ throw new Error("Test has been cancelled");
746
+ }
747
+ hookResult = await requiredBeforeHook(this, requiredBeforeAnyHookElement);
748
+ this.#handleHookResult(hookResult, true, "before", true);
749
+ requiredBeforeAnyHookElement.part.remove("running");
750
+ requiredBeforeAnyHookElement.classList.remove("running");
751
+ } catch (error) {
752
+ this.#handleHookResult(hookResult, false, "before", true, error);
753
+ console.error(error);
754
+ this.#continueRunningTests = false;
755
+ this.classList.remove("running");
756
+ this.part.remove("running");
757
+ if (playButtonLabel != null) {
758
+ playButtonLabel.textContent = "Run Tests";
759
+ }
760
+ this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
761
+ return;
762
+ }
763
+ }
764
+ const beforeHook = this.#hooks["beforeall" /* BeforeAll */];
765
+ if (beforeHook != null) {
764
766
  let hookResult;
765
767
  try {
766
768
  const beforeAllHookElement = this.getElement(`before-all-details`);
767
769
  beforeAllHookElement.classList.add("running");
768
770
  beforeAllHookElement.part.add("running");
769
- for (const [hook, ids] of beforeHooks) {
770
- if (this.isCanceled == true) {
771
- throw new Error("Test has been cancelled");
772
- }
773
- hookResult = await hook(this, beforeAllHookElement);
774
- this.#handleHookResult(hookResult, true, "before");
771
+ if (this.isCanceled == true) {
772
+ throw new Error("Test has been cancelled");
775
773
  }
774
+ hookResult = await beforeHook(this, beforeAllHookElement);
775
+ this.#handleHookResult(hookResult, true, "before", false);
776
776
  beforeAllHookElement.part.remove("running");
777
777
  beforeAllHookElement.classList.remove("running");
778
778
  } catch (error) {
779
- this.#handleHookResult(hookResult, false, "before", error);
779
+ this.#handleHookResult(hookResult, false, "before", false, error);
780
780
  console.error(error);
781
781
  this.#continueRunningTests = false;
782
782
  this.classList.remove("running");
@@ -799,7 +799,7 @@ var CodeTestsElement = class extends HTMLElement {
799
799
  if (this.#continueRunningTests == false) {
800
800
  break;
801
801
  }
802
- await this.#runTest(id, test);
802
+ await this.#runTest(id, test, false);
803
803
  }
804
804
  }
805
805
  if (this.#continueRunningTests == false) {
@@ -811,25 +811,42 @@ var CodeTestsElement = class extends HTMLElement {
811
811
  this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
812
812
  return;
813
813
  }
814
- const afterHooks = this.#hooks.get(AFTERALL);
815
- if (afterHooks != null) {
814
+ const afterHook = this.#hooks["afterall" /* AfterAll */];
815
+ if (afterHook != null) {
816
816
  let hookResult;
817
817
  try {
818
818
  const afterAllHookElement = this.getElement(`after-all-details`);
819
819
  afterAllHookElement.classList.add("running");
820
820
  afterAllHookElement.part.add("running");
821
- for (const [hook, ids] of afterHooks) {
822
- if (this.isCanceled == true) {
823
- throw new Error("Test has been cancelled");
824
- }
825
- hookResult = await hook(this, afterAllHookElement);
826
- this.#handleHookResult(hookResult, true, "after");
821
+ if (this.isCanceled == true) {
822
+ throw new Error("Test has been cancelled");
827
823
  }
824
+ hookResult = await afterHook(this, afterAllHookElement);
825
+ this.#handleHookResult(hookResult, true, "after", false);
828
826
  afterAllHookElement.part.remove("running");
829
827
  afterAllHookElement.classList.remove("running");
830
828
  } catch (error) {
831
- this.#handleHookResult(hookResult, false, "after", error);
829
+ this.#handleHookResult(hookResult, false, "after", false, error);
832
830
  console.error(error);
831
+ const requiredAfterHook2 = this.#hooks["requiredafterany" /* RequiredAfterAny */];
832
+ if (requiredAfterHook2 != null) {
833
+ let hookResult2;
834
+ try {
835
+ const requiredAfterAnyHookElement = this.getElement(`required-after-any-details`);
836
+ requiredAfterAnyHookElement.classList.add("running");
837
+ requiredAfterAnyHookElement.part.add("running");
838
+ if (this.isCanceled == true) {
839
+ throw new Error("Test has been cancelled");
840
+ }
841
+ hookResult2 = await requiredAfterHook2(this, requiredAfterAnyHookElement);
842
+ this.#handleHookResult(hookResult2, true, "after", true);
843
+ requiredAfterAnyHookElement.part.remove("running");
844
+ requiredAfterAnyHookElement.classList.remove("running");
845
+ } catch (error2) {
846
+ this.#handleHookResult(hookResult2, false, "after", true, error2);
847
+ console.error(error2);
848
+ }
849
+ }
833
850
  this.#continueRunningTests = false;
834
851
  this.classList.remove("running");
835
852
  this.part.remove("running");
@@ -840,6 +857,26 @@ var CodeTestsElement = class extends HTMLElement {
840
857
  return;
841
858
  }
842
859
  }
860
+ const requiredAfterHook = this.#hooks["requiredafterany" /* RequiredAfterAny */];
861
+ if (requiredAfterHook != null) {
862
+ let hookResult;
863
+ try {
864
+ const requiredAfterAnyHookElement = this.getElement(`required-after-any-details`);
865
+ requiredAfterAnyHookElement.classList.add("running");
866
+ requiredAfterAnyHookElement.part.add("running");
867
+ if (this.isCanceled == true) {
868
+ throw new Error("Test has been cancelled");
869
+ }
870
+ hookResult = await requiredAfterHook(this, requiredAfterAnyHookElement);
871
+ this.#handleHookResult(hookResult, true, "after", true);
872
+ requiredAfterAnyHookElement.part.remove("running");
873
+ requiredAfterAnyHookElement.classList.remove("running");
874
+ } catch (error) {
875
+ this.#handleHookResult(hookResult, false, "after", true, error);
876
+ console.error(error);
877
+ this.#continueRunningTests = false;
878
+ }
879
+ }
843
880
  const failedTests = this.shadowRoot.querySelectorAll('[success="false"]');
844
881
  this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
845
882
  this.classList.remove("running");
@@ -869,7 +906,7 @@ var CodeTestsElement = class extends HTMLElement {
869
906
  afterAllHookElement.classList.remove("success", "fail");
870
907
  afterAllHookElement.part.remove("success", "fail");
871
908
  }
872
- async #runTest(testId, test) {
909
+ async #runTest(testId, test, handleRequiredTests = true) {
873
910
  const testElement = this.getElement("tests").querySelector(`[data-test-id="${testId}"]`);
874
911
  if (testElement == null) {
875
912
  this.#addProcessError(`Unable to find test element for test: ${testId}`);
@@ -899,17 +936,38 @@ var CodeTestsElement = class extends HTMLElement {
899
936
  let testType;
900
937
  try {
901
938
  const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
939
+ if (handleRequiredTests == true) {
940
+ const requiredBeforeHook = this.#hooks["requiredbeforeany" /* RequiredBeforeAny */];
941
+ if (requiredBeforeHook != null) {
942
+ let hookResult;
943
+ try {
944
+ const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
945
+ requiredBeforeAnyHookElement.classList.add("running");
946
+ requiredBeforeAnyHookElement.part.add("running");
947
+ if (this.isCanceled == true) {
948
+ throw new Error("Test has been cancelled");
949
+ }
950
+ hookResult = await requiredBeforeHook(this, requiredBeforeAnyHookElement);
951
+ this.#handleHookResult(hookResult, true, "before", true);
952
+ requiredBeforeAnyHookElement.part.remove("running");
953
+ requiredBeforeAnyHookElement.classList.remove("running");
954
+ } catch (error) {
955
+ this.#handleHookResult(hookResult, true, "before", true, error);
956
+ console.error(error);
957
+ this.#continueRunningTests = false;
958
+ return;
959
+ }
960
+ }
961
+ }
962
+ if (this.#continueRunningTests == false) {
963
+ throw new Error("Tests have been disabled from continuing to run.");
964
+ }
902
965
  if (allowTest == false || this.isCanceled == true) {
903
966
  throw new Error("Test has been cancelled");
904
967
  }
905
- const beforeHooks = this.#hooks.get(BEFOREEACH);
906
- if (beforeHooks != null) {
907
- for (const [hook, ids] of beforeHooks) {
908
- if (ids.has(testId)) {
909
- beforeResult = await hook(this, testElement);
910
- break;
911
- }
912
- }
968
+ const beforeHook = this.#hooks["beforeeach" /* BeforeEach */];
969
+ if (beforeHook != null) {
970
+ beforeResult = await beforeHook(this, testElement);
913
971
  }
914
972
  if (this.isCanceled == true) {
915
973
  throw new Error("Test has been cancelled");
@@ -918,12 +976,30 @@ var CodeTestsElement = class extends HTMLElement {
918
976
  if (this.isCanceled == true) {
919
977
  throw new Error("Test has been cancelled");
920
978
  }
921
- const afterHooks = this.#hooks.get(AFTEREACH);
922
- if (afterHooks != null) {
923
- for (const [hook, ids] of afterHooks) {
924
- if (ids.has(testId)) {
925
- afterResult = await hook(this, testElement);
926
- break;
979
+ const afterHook = this.#hooks["aftereach" /* AfterEach */];
980
+ if (afterHook != null) {
981
+ afterResult = await afterHook(this, testElement);
982
+ }
983
+ if (handleRequiredTests == true) {
984
+ const requiredAfterHook = this.#hooks["requiredafterany" /* RequiredAfterAny */];
985
+ if (requiredAfterHook != null) {
986
+ let hookResult;
987
+ try {
988
+ const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
989
+ requiredBeforeAnyHookElement.classList.add("running");
990
+ requiredBeforeAnyHookElement.part.add("running");
991
+ if (this.isCanceled == true) {
992
+ throw new Error("Test has been cancelled");
993
+ }
994
+ hookResult = await requiredAfterHook(this, requiredBeforeAnyHookElement);
995
+ this.#handleHookResult(hookResult, true, "after", true);
996
+ requiredBeforeAnyHookElement.part.remove("running");
997
+ requiredBeforeAnyHookElement.classList.remove("running");
998
+ } catch (error) {
999
+ this.#handleHookResult(hookResult, true, "after", true, error);
1000
+ console.error(error);
1001
+ this.#continueRunningTests = false;
1002
+ return;
927
1003
  }
928
1004
  }
929
1005
  }
@@ -981,19 +1057,19 @@ Result:${objectResult.value}`,
981
1057
  detailsElement.open = true;
982
1058
  }
983
1059
  }
984
- #handleHookResult(result, finishedTest, beforeOrAfter, error) {
1060
+ #handleHookResult(result, finishedTest, beforeOrAfter, required, error) {
985
1061
  if (result instanceof HTMLElement) {
986
- this.#setHookResult(result, finishedTest, beforeOrAfter);
1062
+ this.#setHookResult(result, finishedTest, beforeOrAfter, required);
987
1063
  } else {
988
1064
  let defaultResult;
989
1065
  if (result == void 0) {
990
1066
  defaultResult = this.#createDefaultResult(finishedTest == true ? "Hook Ran Successfully" : `Failed${error != null ? `:
991
1067
  ${error.message}` : ""}`, finishedTest);
992
- this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
1068
+ this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
993
1069
  } else if (typeof result == "string") {
994
1070
  defaultResult = this.#createDefaultResult(`${result}${error == null ? "" : `:
995
1071
  ${error.message}`}`, finishedTest);
996
- this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
1072
+ this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
997
1073
  } else if (typeof result == "object") {
998
1074
  const objectResult = result;
999
1075
  if (objectResult.success != void 0 && objectResult.expected != void 0 && objectResult.value != void 0) {
@@ -1003,7 +1079,7 @@ Expected:${objectResult.expected}
1003
1079
  Result:${objectResult.value}`,
1004
1080
  objectResult.success
1005
1081
  );
1006
- this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
1082
+ this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
1007
1083
  }
1008
1084
  }
1009
1085
  }
@@ -1096,9 +1172,10 @@ Result:${objectResult.value}`,
1096
1172
  codeElement.appendChild(preElement);
1097
1173
  return codeElement;
1098
1174
  }
1099
- #setHookResult(valueElement, success, beforeOrAfter) {
1100
- const detailsElement = this.getElement(`${beforeOrAfter}-all-details`);
1101
- const resultsElement = this.getElement(`${beforeOrAfter}-all-results`);
1175
+ #setHookResult(valueElement, success, beforeOrAfter, required) {
1176
+ const selector = required == true ? `required-${beforeOrAfter}-any` : `${beforeOrAfter}-all`;
1177
+ const detailsElement = this.getElement(`${selector}-details`);
1178
+ const resultsElement = this.getElement(`${selector}-results`);
1102
1179
  detailsElement.setAttribute("success", success == true ? "true" : "false");
1103
1180
  detailsElement.classList.toggle("success", success);
1104
1181
  detailsElement.part.toggle("success", success);
@@ -1178,13 +1255,10 @@ if (customElements.get(COMPONENT_TAG_NAME) == null) {
1178
1255
  customElements.define(COMPONENT_TAG_NAME, CodeTestsElement);
1179
1256
  }
1180
1257
  export {
1181
- AFTERALL,
1182
- AFTEREACH,
1183
- BEFOREALL,
1184
- BEFOREEACH,
1185
1258
  CodeTestEventType,
1186
1259
  CodeTests,
1187
1260
  CodeTestsElement,
1261
+ HookType,
1188
1262
  expect,
1189
1263
  prompt
1190
1264
  };
@@ -1,4 +1,4 @@
1
- var S=`:host
1
+ var w=`:host
2
2
  {
3
3
  /*** gray ***/
4
4
  --uchu-light-gray-raw: 95.57% 0.003 286.35;
@@ -128,10 +128,24 @@ var S=`:host
128
128
  display: none;
129
129
  }
130
130
  :host(.has-before-hook) #before-all-details
131
- ,:host(.has-before-hook) #after-all-details
131
+ ,:host(.has-after-hook) #after-all-details
132
132
  {
133
133
  display: initial;
134
134
  }
135
+ :host(.has-required-before-hook) #required-before-any-details
136
+ ,:host(.has-required-after-hook) #required-after-any-details
137
+ {
138
+ display: initial;
139
+ }
140
+
141
+ #required-before-any-summary
142
+ ,#required-after-any-summary
143
+ {
144
+ background: var(--surface-process);
145
+ color: var(--text-process);
146
+ border: solid 1px var(--text-process);
147
+ grid-template-columns: auto auto 1fr;
148
+ }
135
149
 
136
150
  #tests
137
151
  {
@@ -393,7 +407,7 @@ pre
393
407
  {
394
408
  from { transform: rotate(0deg); }
395
409
  to { transform: rotate(360deg); }
396
- }`;var F=`<slot name="header">
410
+ }`;var x=`<slot name="header">
397
411
  <header id="header">
398
412
  <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>
399
413
  <slot name="play-button">
@@ -406,6 +420,13 @@ pre
406
420
  <slot name="details"></slot>
407
421
  </header>
408
422
  </slot>
423
+ <details id="required-before-any-details" class="hook">
424
+ <summary id="required-before-any-summary">
425
+ <span id="required-before-any-result-icon" class="result-icon"></span>
426
+ <span id="required-before-any-description" class="description">Results from Required Before Any Hook</span>
427
+ </summary>
428
+ <div id="required-before-any-results" class="results"></div>
429
+ </details>
409
430
  <details id="before-all-details" class="hook">
410
431
  <summary id="before-all-summary">
411
432
  <span id="before-all-result-icon" class="result-icon"></span>
@@ -421,6 +442,13 @@ pre
421
442
  </summary>
422
443
  <div id="after-all-results" class="results"></div>
423
444
  </details>
445
+ <details id="required-after-any-details" class="hook">
446
+ <summary id="required-after-any-summary">
447
+ <span id="required-after-any-result-icon" class="result-icon"></span>
448
+ <span id="required-after-any-description" class="description">Results from Required After Any Hook</span>
449
+ </summary>
450
+ <div id="required-after-any-results" class="results"></div>
451
+ </details>
424
452
 
425
453
  <template id="prompt-template">
426
454
  <div class="prompt" part="prompt">
@@ -433,15 +461,15 @@ pre
433
461
  <button class="prompt-button reject" type="button">Reject</button>
434
462
  </div>
435
463
  </div>
436
- </template>`;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.
437
- Expected: ${t}
438
- 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")}},v=Symbol("beforeAll"),y=Symbol("beforeEach"),k=Symbol("afterAll"),x=Symbol("afterEach"),L=class d{static timeoutMS=500;static#e;static#p;static expect(t){return new T(async(e,r)=>{if(t instanceof Promise){let n=await t;e(n);return}e(t)})}static expectSync(t){return new T(async(e,r)=>{if(t instanceof Promise){let n=await t;e(n);return}e(t)})}static expectBefore(t){return new T(async(e,r)=>{if(t instanceof Promise){let n=await t;e(n);return}e(t)})}static async prompt(t,s,e,r){return new Promise((n,o)=>{let a=t.findElement("prompt-template"),l=d.createElementFromTemplate(a);l.querySelector(".label").textContent=e;let c=h=>{let f=h.composedPath();if(f.find(i=>i instanceof HTMLButtonElement&&i.classList.contains("accept"))!=null){let i=r?.onAccept?.()??!0;l.removeEventListener("click",c),n(i);return}if(f.find(i=>i instanceof HTMLButtonElement&&i.classList.contains("reject"))!=null){let i=r?.onReject?.()??!1;l.removeEventListener("click",c),n(i);return}};l.addEventListener("click",c),r?.acceptLabel!=null&&(l.querySelector(".accept").textContent=r.acceptLabel),r?.rejectLabel!=null&&(l.querySelector(".reject").textContent=r.rejectLabel);let u=s instanceof HTMLDetailsElement?s:s.querySelector(".test-details");u!=null&&(u.open=!0),s.querySelector(".result")?.append(l)})}static createElementFromTemplate(t,s){let e=t instanceof HTMLTemplateElement?t:document.querySelector(t);if(e==null)throw new Error(`Unable to find template element from selector: ${t}`);let r=e.content.cloneNode(!0).querySelector("*");if(r==null)throw new Error("Unable to find first child of template element");return s?.append(r),r}};function I(d){return L.expect(d)}function U(d,t,s,e){return L.prompt(d,t,s,e)}var $=":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";function P(d){let t=[...d.querySelectorAll(`${$}[id]`)];for(let e=0;e<t.length;e++)t[e].part.add(t[e].id);let s=[...d.querySelectorAll(`${$}[class]`)];for(let e=0;e<s.length;e++)s[e].part.add(...s[e].classList)}var z=(n=>(n.BeforeAll="beforeall",n.AfterAll="afterall",n.BeforeTest="beforetest",n.AfterTest="aftertest",n.Cancel="cancel",n))(z||{}),H=Symbol("No Test Defined"),D=new CSSStyleSheet;D.replaceSync(S);var B="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={[v]:C(),[y]:C(),[x]:C(),[k]:C()};#t=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=F,this.shadowRoot.adoptedStyleSheets.push(D),this.#c=this.#h.bind(this)}connectedCallback(){if(P(this.shadowRoot),this.addEventListener("click",this.#c),this.getAttribute("auto")=="false")return;let t=this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path");t!=null&&this.loadTests(t)}disconnectedCallback(){this.removeEventListener("click",this.#c)}#c;#h(t){let s=t.composedPath().find(o=>o instanceof HTMLButtonElement&&o.classList.contains("run"));if(s==null)return;let e=s.closest("li");if(e==null){if(s.hasAttribute("data-all")==!0)if(this.classList.contains("running")){if(this.classList.contains("canceled"))return;this.cancel()}else this.runTests();return}let r=e.dataset.testId;if(r==null)return;let n=this.#s.get(r);n!=null&&(this.isCanceled=!1,this.classList.remove("canceled"),this.part.remove("canceled"),this.#u(r,n))}#f(){return this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path")}async loadTests(t){let s=t??this.#f();if(s!=null)try{this.getElement("tests").innerHTML="",this.#s.clear(),this.classList.remove("has-before-hook"),this.classList.remove("has-after-hook");let e=window.location.href.lastIndexOf("/"),n=window.location.href.substring(e).indexOf(".")!=-1==!0?window.location.href.substring(0,e+1):window.location.href,o=n+s.substring(0,s.lastIndexOf("/")+1),a=n+s,l=await(await fetch(a)).text();l=l.replaceAll(/['"`](((\.\/)|(\.\.\/))+(.*))['"`]/g,`'${o}$1'`);let c=new File([l],s.substring(s.lastIndexOf("/")),{type:"text/javascript"}),h=await import(URL.createObjectURL(c)),f=h.tests??h.default;if(f==null)throw new Error(`Unable to find tests definition in file at path: ${s}`);let E=f[v];if(E!=null){if(this.#e.get(v)==null){let p=new Map;p.set(E,new Set),this.#e.set(v,p)}this.classList.add("has-before-hook")}let b=f[y];if(b!=null&&this.#e.get(y)==null){let p=new Map;p.set(b,new Set),this.#e.set(y,p)}let i=f[k];if(i!=null){if(this.#e.get(k)==null){let p=new Map;p.set(i,new Set),this.#e.set(k,p)}this.classList.add("has-after-hook")}let A=f[x];if(A!=null&&this.#e.get(x)==null){let p=new Map;p.set(A,new Set),this.#e.set(x,p)}for(let[w,p]of Object.entries(f)){let M=this.#g(w,p);if(E!=null){let m=this.#e.get(v);if(m!=null){let g=m.get(E);g?.add(M)}}if(b!=null){let m=this.#e.get(y);if(m!=null){let g=m.get(b);g?.add(M)}}if(i!=null){let m=this.#e.get(k);if(m!=null){let g=m.get(i);g?.add(M)}}if(A!=null){let m=this.#e.get(x);if(m!=null){let g=m.get(A);g?.add(M)}}}}catch(e){this.#i("An error occurred while loading the tasks:",e)}}isCanceled=!1;cancel(){this.isCanceled=!0,this.classList.add("canceled"),this.part.add("canceled"),this.dispatchEvent(new CustomEvent("cancel",{bubbles:!0,composed:!0}))}async runTests(){this.dispatchEvent(new CustomEvent("beforeall",{bubbles:!0,composed:!0})),this.#t=!0,this.classList.add("running"),this.isCanceled=!1,this.classList.remove("canceled"),this.part.remove("canceled"),this.toggleAttribute("success",!1);let t=this.findElement("play-button-label");t!=null&&(t.textContent="Cancel"),this.#m();let s=this.hasAttribute("in-order"),e=this.#e.get(v);if(e!=null){let o;try{let a=this.getElement("before-all-details");a.classList.add("running"),a.part.add("running");for(let[l,c]of e){if(this.isCanceled==!0)throw new Error("Test has been cancelled");o=await l(this,a),this.#a(o,!0,"before")}a.part.remove("running"),a.classList.remove("running")}catch(a){this.#a(o,!1,"before",a),console.error(a),this.#t=!1,this.classList.remove("running"),this.part.remove("running"),t!=null&&(t.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}if(s==!1){let o=[];for(let[a,l]of this.#s)o.push(this.#u(a,l));await Promise.all(o)}else for(let[o,a]of this.#s){if(this.#t==!1)break;await this.#u(o,a)}if(this.#t==!1){this.classList.remove("running"),this.part.remove("running"),t!=null&&(t.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}let r=this.#e.get(k);if(r!=null){let o;try{let a=this.getElement("after-all-details");a.classList.add("running"),a.part.add("running");for(let[l,c]of r){if(this.isCanceled==!0)throw new Error("Test has been cancelled");o=await l(this,a),this.#a(o,!0,"after")}a.part.remove("running"),a.classList.remove("running")}catch(a){this.#a(o,!1,"after",a),console.error(a),this.#t=!1,this.classList.remove("running"),this.part.remove("running"),t!=null&&(t.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}let n=this.shadowRoot.querySelectorAll('[success="false"]');this.setAttribute("success",n.length==0?"true":"false"),this.classList.remove("running"),this.part.remove("running"),t!=null&&(t.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}))}#m(){for(let[e,r]of this.#s){let n=this.getElement("tests").querySelector(`[data-test-id="${e}"]`);if(n==null){this.#i(`Unable to find test element for test: ${e}`);return}n.toggleAttribute("success",!1),n.classList.remove("success","fail"),n.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 n=e.querySelector(".error-message");n!=null&&(n.textContent="");let o=e.querySelector("details");o!=null&&(o.open=!1);let a=H,l,c=H,u;try{if(this.dispatchEvent(new CustomEvent("beforetest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:e}}))==!1||this.isCanceled==!0)throw new Error("Test has been cancelled");let f=this.#e.get(y);if(f!=null){for(let[b,i]of f)if(i.has(t)){a=await b(this,e);break}}if(this.isCanceled==!0)throw new Error("Test has been cancelled");if(l=await s(this,e),this.isCanceled==!0)throw new Error("Test has been cancelled");let E=this.#e.get(x);if(E!=null){for(let[b,i]of E)if(i.has(t)){c=await b(this,e);break}}u="before",a!=H&&this.#n(e,a,!0,void 0,u),u=void 0,this.#n(e,l,!0,void 0,u),u="after",c!=H&&this.#n(e,c,!0,void 0,u)}catch(h){this.#n(e,l,!1,h,u),console.error(h),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}}))}}#n(t,s,e,r,n){if(s instanceof HTMLElement)this.#o(t,s,e,n);else if(s==null){let a=n==null?"Passed":"Hook Ran Successfully",l=this.#r(e==!0?`${a}`:`Failed${r!=null?`:
439
- ${r.message}`:""}`,e,n);this.#o(t,l,e,n)}else if(typeof s=="string"){let a=this.#r(`${s}${r==null?"":`:
440
- ${r.message}`}`,e,n);this.#o(t,a,e,n)}else if(typeof s=="object"){let a=s;if(a.success!=null&&a.expected!=null&&a.value!=null){let l=n==null?"Passed":"Success",c=n==null?"Failed":"Fail",u=this.#r(`${a.success==!0?`${l}:`:`${c}:`}
441
- Expected:${a.expected}
442
- Result:${a.value}`,a.success,n);this.#o(t,u,e,n)}}let o=t.querySelector("details");o!=null&&(o.open=!0)}#a(t,s,e,r){if(t instanceof HTMLElement)this.#l(t,s,e);else{let o;if(t==null)o=this.#r(s==!0?"Hook Ran Successfully":`Failed${r!=null?`:
443
- ${r.message}`:""}`,s),this.#l(o,s,e);else if(typeof t=="string")o=this.#r(`${t}${r==null?"":`:
444
- ${r.message}`}`,s),this.#l(o,s,e);else if(typeof t=="object"){let a=t;a.success!=null&&a.expected!=null&&a.value!=null&&(o=this.#r(`${a.success==!0?"Success:":"Fail:"}
445
- Expected:${a.expected}
446
- Result:${a.value}`,a.success),this.#l(o,s,e))}}let n=this.getElement(`${e}-all-details`);n!=null&&(n.open=!0)}static create(t){return document.createElement("code-tests")}#s=new Map;#g(t,s){let e=C();this.#s.set(e,s);let r=this.#b(e,t);return this.getElement("tests").append(r),e}#b(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 n=document.createElement("summary");n.classList.add("test-summary"),n.part.add("test-summary");let o=document.createElement("div");o.classList.add("result-icon"),o.part.add("result-icon"),n.append(o);let a=document.createElement("span");a.classList.add("description","test-description"),a.textContent=s,n.append(a);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",n.append(l);let c=document.createElement("div");c.classList.add("before-result","test-before-result"),c.part.add("before-result","test-before-result");let u=document.createElement("div");u.classList.add("result","test-result"),u.part.add("result","test-result");let h=document.createElement("div");return h.classList.add("after-result","test-after-result"),h.part.add("after-result","test-after-result"),r.append(n),r.append(c),r.append(u),r.append(h),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 n=t.querySelector(".result-icon");n?.classList.toggle("success",e),n?.part.toggle("success",e),n?.classList.toggle("fail",!e),n?.part.toggle("fail",!e);let o=t.querySelector(`.${r==null?"result":r=="before"?"before-result":"after-result"}`);if(o==null){this.#i("Unable to find result element");return}o.innerHTML="",o.appendChild(s)}#r(t,s,e){let r=document.createElement("code");r.classList.add("code"),r.part.add("code");let n=document.createElement("pre");n.textContent=t;let o=s==!0?"success-message":"error-message";return n.classList.add("pre",o),n.part.add("pre",o),r.appendChild(n),r}#l(t,s,e){let r=this.getElement(`${e}-all-details`),n=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),n.innerHTML="",n.appendChild(t)}#i(t,s){s instanceof Error&&(t+=`
447
- ${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 n=document.createElement("pre");n.classList.add("pre","process-error-pre"),n.part.add("pre","process-error-pre"),n.textContent=t,r.append(n),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 C(){let d=new Uint8Array(20);crypto.getRandomValues(d);let t=[].slice.apply(d).map(function(e){return String.fromCharCode(e)}).join("");return btoa(t).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}customElements.get(B)==null&&customElements.define(B,R);export{k as AFTERALL,x as AFTEREACH,v as BEFOREALL,y as BEFOREEACH,z as CodeTestEventType,L as CodeTests,R as CodeTestsElement,I as expect,U as prompt};
464
+ </template>`;var y=class extends Promise{async toBeDefined(e){if(await this==null)throw new Error(`${e??"Value"} is undefined`)}async toBe(e,r=!1){let t=await this;if((r==!0?t===e:t==e)==!1)throw new Error(` Value is not equal.
465
+ Expected: ${e}
466
+ Result: ${t}`)}async toContainText(e){let r=await this}async toHaveAttribute(e){let r=await this;if(!(r instanceof HTMLElement))throw new Error("Unable to check for attribute on non-HTMLElement target");if(r.getAttribute(e))throw new Error("Taret does not have attribute")}},E=class f{static timeoutMS=500;static#e;static#r;static expect(e){return new y(async(t,s)=>{if(e instanceof Promise){let n=await e;t(n);return}t(e)})}static expectSync(e){return new y(async(t,s)=>{if(e instanceof Promise){let n=await e;t(n);return}t(e)})}static expectBefore(e){return new y(async(t,s)=>{if(e instanceof Promise){let n=await e;t(n);return}t(e)})}static async prompt(e,r,t,s){return new Promise((n,l)=>{let i=e.findElement("prompt-template"),o=f.createElementFromTemplate(i);o.querySelector(".label").textContent=t;let a=u=>{let c=u.composedPath();if(c.find(h=>h instanceof HTMLButtonElement&&h.classList.contains("accept"))!=null){let h=s?.onAccept?.()??!0;o.removeEventListener("click",a),n(h);return}if(c.find(h=>h instanceof HTMLButtonElement&&h.classList.contains("reject"))!=null){let h=s?.onReject?.()??!1;o.removeEventListener("click",a),n(h);return}};o.addEventListener("click",a),s?.acceptLabel!=null&&(o.querySelector(".accept").textContent=s.acceptLabel),s?.rejectLabel!=null&&(o.querySelector(".reject").textContent=s.rejectLabel);let p=r instanceof HTMLDetailsElement?r:r.querySelector(".test-details");p!=null&&(p.open=!0),r.querySelector(".result")?.append(o)})}static createElementFromTemplate(e,r){let t=e instanceof HTMLTemplateElement?e:document.querySelector(e);if(t==null)throw new Error(`Unable to find template element from selector: ${e}`);let s=t.content.cloneNode(!0).querySelector("*");if(s==null)throw new Error("Unable to find first child of template element");return r?.append(s),s}};function S(f){return E.expect(f)}function $(f,e,r,t){return E.prompt(f,e,r,t)}var A=":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";function L(f){let e=[...f.querySelectorAll(`${A}[id]`)];for(let t=0;t<e.length;t++)e[t].part.add(e[t].id);let r=[...f.querySelectorAll(`${A}[class]`)];for(let t=0;t<r.length;t++)r[t].part.add(...r[t].classList)}var P=(l=>(l.BeforeAll="beforeall",l.AfterAll="afterall",l.BeforeEach="beforeeach",l.AfterEach="aftereach",l.RequiredBeforeAny="requiredbeforeany",l.RequiredAfterAny="requiredafterany",l))(P||{}),F=(n=>(n.BeforeAll="beforeall",n.AfterAll="afterall",n.BeforeTest="beforetest",n.AfterTest="aftertest",n.Cancel="cancel",n))(F||{}),v=Symbol("No Test Defined"),H=new CSSStyleSheet;H.replaceSync(w);var C="code-tests",k=class extends HTMLElement{componentParts=new Map;getElement(e){if(this.componentParts.get(e)==null){let r=this.findElement(e);r!=null&&this.componentParts.set(e,r)}return this.componentParts.get(e)}findElement(e){return this.shadowRoot.getElementById(e)}#e={};#r=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=x,this.shadowRoot.adoptedStyleSheets.push(H),this.#c=this.#h.bind(this)}connectedCallback(){if(L(this.shadowRoot),this.addEventListener("click",this.#c),this.getAttribute("auto")=="false")return;let e=this.#d();e!=null&&this.loadTests(e)}disconnectedCallback(){this.removeEventListener("click",this.#c)}#c;#h(e){let r=e.composedPath().find(l=>l instanceof HTMLButtonElement&&l.classList.contains("run"));if(r==null)return;let t=r.closest("li");if(t==null){if(r.hasAttribute("data-all")==!0)if(this.classList.contains("running")){if(this.classList.contains("canceled"))return;this.cancel()}else this.runTests();return}let s=t.dataset.testId;if(s==null)return;let n=this.#s.get(s);n!=null&&(this.isCanceled=!1,this.classList.remove("canceled"),this.part.remove("canceled"),this.#u(s,n))}#d(){return this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path")}async loadTests(e){let r=e??this.#d();if(r!=null)try{this.getElement("tests").innerHTML="",this.#s.clear(),this.classList.remove("has-before-hook"),this.classList.remove("has-after-hook");let t=window.location.href.lastIndexOf("/"),n=window.location.href.substring(t).indexOf(".")!=-1==!0?window.location.href.substring(0,t+1):window.location.href,l=n+r.substring(0,r.lastIndexOf("/")+1),i=n+r,o=await(await fetch(i)).text();o=o.replaceAll(/['"`](((\.\/)|(\.\.\/))+(.*))['"`]/g,`'${l}$1'`);let a=new File([o],r.substring(r.lastIndexOf("/")),{type:"text/javascript"}),u=await import(URL.createObjectURL(a)),c=u.tests??u.default;if(c==null)throw new Error(`Unable to find tests definition in file at path: ${r}`);let g=c.beforeall;g!=null&&(this.#e.beforeall=g,delete c.beforeall,this.classList.add("has-before-hook"));let b=c.afterall;b!=null&&(this.#e.afterall=b,delete c.afterall,this.classList.add("has-after-hook"));let h=c.beforeeach;h!=null&&(this.#e.beforeeach=h,delete c.beforeeach);let m=c.aftereach;m!=null&&(this.#e.aftereach=m,delete c.aftereach);let d=c.requiredbeforeany;d!=null&&(this.#e.requiredbeforeany=d,delete c.requiredbeforeany,this.classList.add("has-required-before-hook"),this.part.add("has-required-before-hook"));let T=c.requiredafterany;T!=null&&(this.#e.requiredafterany=T,delete c.requiredafterany,this.classList.add("has-required-after-hook"),this.part.add("has-required-after-hook"));for(let[q,R]of Object.entries(c))this.#m(q,R)}catch(t){this.#i("An error occurred while loading the tasks:",t)}}isCanceled=!1;cancel(){this.isCanceled=!0,this.classList.add("canceled"),this.part.add("canceled"),this.dispatchEvent(new CustomEvent("cancel",{bubbles:!0,composed:!0}))}async runTests(){this.dispatchEvent(new CustomEvent("beforeall",{bubbles:!0,composed:!0})),this.#r=!0,this.classList.add("running"),this.isCanceled=!1,this.classList.remove("canceled"),this.part.remove("canceled"),this.toggleAttribute("success",!1);let e=this.findElement("play-button-label");e!=null&&(e.textContent="Cancel"),this.#f();let r=this.hasAttribute("in-order"),t=this.#e.requiredbeforeany;if(t!=null){let o;try{let a=this.getElement("required-before-any-details");if(a.classList.add("running"),a.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");o=await t(this,a),this.#t(o,!0,"before",!0),a.part.remove("running"),a.classList.remove("running")}catch(a){this.#t(o,!1,"before",!0,a),console.error(a),this.#r=!1,this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}let s=this.#e.beforeall;if(s!=null){let o;try{let a=this.getElement("before-all-details");if(a.classList.add("running"),a.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");o=await s(this,a),this.#t(o,!0,"before",!1),a.part.remove("running"),a.classList.remove("running")}catch(a){this.#t(o,!1,"before",!1,a),console.error(a),this.#r=!1,this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}if(r==!1){let o=[];for(let[a,p]of this.#s)o.push(this.#u(a,p));await Promise.all(o)}else for(let[o,a]of this.#s){if(this.#r==!1)break;await this.#u(o,a,!1)}if(this.#r==!1){this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}let n=this.#e.afterall;if(n!=null){let o;try{let a=this.getElement("after-all-details");if(a.classList.add("running"),a.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");o=await n(this,a),this.#t(o,!0,"after",!1),a.part.remove("running"),a.classList.remove("running")}catch(a){this.#t(o,!1,"after",!1,a),console.error(a);let p=this.#e.requiredafterany;if(p!=null){let u;try{let c=this.getElement("required-after-any-details");if(c.classList.add("running"),c.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");u=await p(this,c),this.#t(u,!0,"after",!0),c.part.remove("running"),c.classList.remove("running")}catch(c){this.#t(u,!1,"after",!0,c),console.error(c)}}this.#r=!1,this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}let l=this.#e.requiredafterany;if(l!=null){let o;try{let a=this.getElement("required-after-any-details");if(a.classList.add("running"),a.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");o=await l(this,a),this.#t(o,!0,"after",!0),a.part.remove("running"),a.classList.remove("running")}catch(a){this.#t(o,!1,"after",!0,a),console.error(a),this.#r=!1}}let i=this.shadowRoot.querySelectorAll('[success="false"]');this.setAttribute("success",i.length==0?"true":"false"),this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}))}#f(){for(let[t,s]of this.#s){let n=this.getElement("tests").querySelector(`[data-test-id="${t}"]`);if(n==null){this.#i(`Unable to find test element for test: ${t}`);return}n.toggleAttribute("success",!1),n.classList.remove("success","fail"),n.part.remove("success","fail")}let e=this.getElement("before-all-details");e.toggleAttribute("success",!1),e.classList.remove("success","fail"),e.part.remove("success","fail");let r=this.getElement("after-all-details");r.toggleAttribute("success",!1),r.classList.remove("success","fail"),r.part.remove("success","fail")}async#u(e,r,t=!0){let s=this.getElement("tests").querySelector(`[data-test-id="${e}"]`);if(s==null){this.#i(`Unable to find test element for test: ${e}`);return}s.toggleAttribute("success",!1),s.classList.add("running"),s.part.add("running"),s.classList.remove("success","fail"),s.part.remove("success","fail");let n=s.querySelector(".result-icon");n?.classList.remove("success","fail"),n?.part.remove("success","fail"),n?.classList.add("running"),n?.part.add("running");let l=s.querySelector(".error-message");l!=null&&(l.textContent="");let i=s.querySelector("details");i!=null&&(i.open=!1);let o=v,a,p=v,u;try{let c=this.dispatchEvent(new CustomEvent("beforetest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:s}}));if(t==!0){let h=this.#e.requiredbeforeany;if(h!=null){let m;try{let d=this.getElement("required-before-any-details");if(d.classList.add("running"),d.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");m=await h(this,d),this.#t(m,!0,"before",!0),d.part.remove("running"),d.classList.remove("running")}catch(d){this.#t(m,!0,"before",!0,d),console.error(d),this.#r=!1;return}}}if(this.#r==!1)throw new Error("Tests have been disabled from continuing to run.");if(c==!1||this.isCanceled==!0)throw new Error("Test has been cancelled");let g=this.#e.beforeeach;if(g!=null&&(o=await g(this,s)),this.isCanceled==!0)throw new Error("Test has been cancelled");if(a=await r(this,s),this.isCanceled==!0)throw new Error("Test has been cancelled");let b=this.#e.aftereach;if(b!=null&&(p=await b(this,s)),t==!0){let h=this.#e.requiredafterany;if(h!=null){let m;try{let d=this.getElement("required-before-any-details");if(d.classList.add("running"),d.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");m=await h(this,d),this.#t(m,!0,"after",!0),d.part.remove("running"),d.classList.remove("running")}catch(d){this.#t(m,!0,"after",!0,d),console.error(d),this.#r=!1;return}}}u="before",o!=v&&this.#a(s,o,!0,void 0,u),u=void 0,this.#a(s,a,!0,void 0,u),u="after",p!=v&&this.#a(s,p,!0,void 0,u)}catch(c){this.#a(s,a,!1,c,u),console.error(c),this.#r=!1}finally{s?.classList.remove("running"),s?.part.remove("running"),n?.classList.remove("running"),n?.part.remove("running"),this.dispatchEvent(new CustomEvent("aftertest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:s}}))}}#a(e,r,t,s,n){if(r instanceof HTMLElement)this.#o(e,r,t,n);else if(r==null){let i=n==null?"Passed":"Hook Ran Successfully",o=this.#n(t==!0?`${i}`:`Failed${s!=null?`:
467
+ ${s.message}`:""}`,t,n);this.#o(e,o,t,n)}else if(typeof r=="string"){let i=this.#n(`${r}${s==null?"":`:
468
+ ${s.message}`}`,t,n);this.#o(e,i,t,n)}else if(typeof r=="object"){let i=r;if(i.success!=null&&i.expected!=null&&i.value!=null){let o=n==null?"Passed":"Success",a=n==null?"Failed":"Fail",p=this.#n(`${i.success==!0?`${o}:`:`${a}:`}
469
+ Expected:${i.expected}
470
+ Result:${i.value}`,i.success,n);this.#o(e,p,t,n)}}let l=e.querySelector("details");l!=null&&(l.open=!0)}#t(e,r,t,s,n){if(e instanceof HTMLElement)this.#l(e,r,t,s);else{let i;if(e==null)i=this.#n(r==!0?"Hook Ran Successfully":`Failed${n!=null?`:
471
+ ${n.message}`:""}`,r),this.#l(i,r,t,s);else if(typeof e=="string")i=this.#n(`${e}${n==null?"":`:
472
+ ${n.message}`}`,r),this.#l(i,r,t,s);else if(typeof e=="object"){let o=e;o.success!=null&&o.expected!=null&&o.value!=null&&(i=this.#n(`${o.success==!0?"Success:":"Fail:"}
473
+ Expected:${o.expected}
474
+ Result:${o.value}`,o.success),this.#l(i,r,t,s))}}let l=this.getElement(`${t}-all-details`);l!=null&&(l.open=!0)}static create(e){return document.createElement("code-tests")}#s=new Map;#m(e,r){let t=D();this.#s.set(t,r);let s=this.#g(t,e);return this.getElement("tests").append(s),t}#g(e,r){let t=document.createElement("li");t.dataset.testId=e,t.classList.add("test"),t.part.add("test");let s=document.createElement("details");s.classList.add("test-details"),s.part.add("test-details");let n=document.createElement("summary");n.classList.add("test-summary"),n.part.add("test-summary");let l=document.createElement("div");l.classList.add("result-icon"),l.part.add("result-icon"),n.append(l);let i=document.createElement("span");i.classList.add("description","test-description"),i.textContent=r,n.append(i);let o=document.createElement("button");o.classList.add("run","test-run"),o.part.add("run","test-run"),o.textContent="Run Test",o.title="Run Test",n.append(o);let a=document.createElement("div");a.classList.add("before-result","test-before-result"),a.part.add("before-result","test-before-result");let p=document.createElement("div");p.classList.add("result","test-result"),p.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"),s.append(n),s.append(a),s.append(p),s.append(u),t.append(s),t}#o(e,r,t,s){e.setAttribute("success",t==!0?"true":"false"),e.classList.toggle("success",t),e.part.toggle("success",t),e.classList.toggle("fail",!t),e.part.toggle("fail",!t);let n=e.querySelector(".result-icon");n?.classList.toggle("success",t),n?.part.toggle("success",t),n?.classList.toggle("fail",!t),n?.part.toggle("fail",!t);let l=e.querySelector(`.${s==null?"result":s=="before"?"before-result":"after-result"}`);if(l==null){this.#i("Unable to find result element");return}l.innerHTML="",l.appendChild(r)}#n(e,r,t){let s=document.createElement("code");s.classList.add("code"),s.part.add("code");let n=document.createElement("pre");n.textContent=e;let l=r==!0?"success-message":"error-message";return n.classList.add("pre",l),n.part.add("pre",l),s.appendChild(n),s}#l(e,r,t,s){let n=s==!0?`required-${t}-any`:`${t}-all`,l=this.getElement(`${n}-details`),i=this.getElement(`${n}-results`);l.setAttribute("success",r==!0?"true":"false"),l.classList.toggle("success",r),l.part.toggle("success",r),l.classList.toggle("fail",!r),l.part.toggle("fail",!r),i.innerHTML="",i.appendChild(e)}#i(e,r){r instanceof Error&&(e+=`
475
+ ${r.message}`,console.error(r));let t=document.createElement("li");t.classList.add("error","process-error"),t.part.add("error","process-error");let s=document.createElement("code");s.classList.add("code","process-error-code"),s.part.add("code","process-error-code");let n=document.createElement("pre");n.classList.add("pre","process-error-pre"),n.part.add("pre","process-error-pre"),n.textContent=e,s.append(n),t.append(s),this.getElement("tests").append(t)}#p(e){if(e=="ordered"){let r=this.shadowRoot.querySelector("ul");if(r==null)return;let t=this.shadowRoot?.querySelectorAll("li"),s=document.createElement("ol");t!=null&&s.append(...t),s.id="tests",r.replaceWith(s)}else{let r=this.shadowRoot.querySelector("ol");if(r==null)return;let t=this.shadowRoot?.querySelectorAll("li"),s=document.createElement("ul");s.id="tests",t!=null&&s.append(...t),r.replaceWith(s)}}static observedAttributes=["in-order"];attributeChangedCallback(e,r,t){e=="in-order"&&(t==null?this.#p("unordered"):this.#p("ordered"))}};function D(){let f=new Uint8Array(20);crypto.getRandomValues(f);let e=[].slice.apply(f).map(function(t){return String.fromCharCode(t)}).join("");return btoa(e).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}customElements.get(C)==null&&customElements.define(C,k);export{F as CodeTestEventType,E as CodeTests,k as CodeTestsElement,P as HookType,S as expect,$ as prompt};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magnit-ce/code-tests",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
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",