@akashjs/runtime 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +21 -0
  2. package/dist/animate.cjs +2 -0
  3. package/dist/animate.cjs.map +1 -0
  4. package/dist/animate.js +2 -0
  5. package/dist/animate.js.map +1 -0
  6. package/dist/chunk-24I477TY.js +32 -0
  7. package/dist/chunk-24I477TY.js.map +1 -0
  8. package/dist/chunk-2PUQBTK5.cjs +5 -0
  9. package/dist/chunk-2PUQBTK5.cjs.map +1 -0
  10. package/dist/chunk-2X7GUBTG.cjs +2 -0
  11. package/dist/chunk-2X7GUBTG.cjs.map +1 -0
  12. package/dist/chunk-3HWR5MIF.js +2 -0
  13. package/dist/chunk-3HWR5MIF.js.map +1 -0
  14. package/dist/chunk-4K6DIB7A.js +2 -0
  15. package/dist/chunk-4K6DIB7A.js.map +1 -0
  16. package/dist/chunk-BJKK7MKL.js +5 -0
  17. package/dist/chunk-BJKK7MKL.js.map +1 -0
  18. package/dist/chunk-FWWD2YSS.cjs +2 -0
  19. package/dist/chunk-FWWD2YSS.cjs.map +1 -0
  20. package/dist/chunk-GWEBEL7E.js +2 -0
  21. package/dist/chunk-GWEBEL7E.js.map +1 -0
  22. package/dist/chunk-J4TFVNKP.cjs +32 -0
  23. package/dist/chunk-J4TFVNKP.cjs.map +1 -0
  24. package/dist/chunk-KI5MVV64.cjs +2 -0
  25. package/dist/chunk-KI5MVV64.cjs.map +1 -0
  26. package/dist/chunk-N4IP63GR.js +2 -0
  27. package/dist/chunk-N4IP63GR.js.map +1 -0
  28. package/dist/chunk-PEDMDFZM.js +2 -0
  29. package/dist/chunk-PEDMDFZM.js.map +1 -0
  30. package/dist/chunk-Q3E2UVUK.js +2 -0
  31. package/dist/chunk-Q3E2UVUK.js.map +1 -0
  32. package/dist/chunk-RRB7VGW7.js +2 -0
  33. package/dist/chunk-RRB7VGW7.js.map +1 -0
  34. package/dist/chunk-UVM6CYWX.cjs +2 -0
  35. package/dist/chunk-UVM6CYWX.cjs.map +1 -0
  36. package/dist/chunk-Y5HEEST4.cjs +2 -0
  37. package/dist/chunk-Y5HEEST4.cjs.map +1 -0
  38. package/dist/chunk-YFCIWM3C.cjs +2 -0
  39. package/dist/chunk-YFCIWM3C.cjs.map +1 -0
  40. package/dist/chunk-ZE7R72IH.cjs +2 -0
  41. package/dist/chunk-ZE7R72IH.cjs.map +1 -0
  42. package/dist/core.cjs +2 -0
  43. package/dist/core.cjs.map +1 -0
  44. package/dist/core.js +2 -0
  45. package/dist/core.js.map +1 -0
  46. package/dist/index.cjs +51 -5458
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.js +51 -4579
  49. package/dist/index.js.map +1 -1
  50. package/dist/machine.cjs +2 -0
  51. package/dist/machine.cjs.map +1 -0
  52. package/dist/machine.js +2 -0
  53. package/dist/machine.js.map +1 -0
  54. package/dist/offline.cjs +2 -0
  55. package/dist/offline.cjs.map +1 -0
  56. package/dist/offline.js +2 -0
  57. package/dist/offline.js.map +1 -0
  58. package/dist/pwa.cjs +2 -0
  59. package/dist/pwa.cjs.map +1 -0
  60. package/dist/pwa.js +2 -0
  61. package/dist/pwa.js.map +1 -0
  62. package/dist/ssr.cjs +2 -0
  63. package/dist/ssr.cjs.map +1 -0
  64. package/dist/ssr.js +2 -0
  65. package/dist/ssr.js.map +1 -0
  66. package/dist/store.cjs +2 -0
  67. package/dist/store.cjs.map +1 -0
  68. package/dist/store.js +2 -0
  69. package/dist/store.js.map +1 -0
  70. package/dist/sync.cjs +2 -0
  71. package/dist/sync.cjs.map +1 -0
  72. package/dist/sync.js +2 -0
  73. package/dist/sync.js.map +1 -0
  74. package/dist/test.cjs +4 -369
  75. package/dist/test.cjs.map +1 -1
  76. package/dist/test.js +4 -165
  77. package/dist/test.js.map +1 -1
  78. package/package.json +30 -5
  79. package/dist/chunk-D3IR22HI.js +0 -662
  80. package/dist/chunk-D3IR22HI.js.map +0 -1
package/dist/test.js CHANGED
@@ -1,166 +1,5 @@
1
- import { defineComponent, provide } from './chunk-D3IR22HI.js';
2
-
3
- // src/test.ts
4
- function mount(component, options) {
5
- const container = document.createElement("div");
6
- container.setAttribute("data-akash-test-root", "");
7
- const props = options?.props ?? {};
8
- const provides = options?.provide;
9
- let node;
10
- if (provides && provides.size > 0) {
11
- const Wrapper = defineComponent(() => {
12
- for (const [key, value] of provides) {
13
- provide(key, value);
14
- }
15
- return () => component(props);
16
- });
17
- node = Wrapper({});
18
- } else {
19
- node = component(props);
20
- }
21
- container.appendChild(node);
22
- document.body.appendChild(container);
23
- return {
24
- container,
25
- unmount() {
26
- container.remove();
27
- },
28
- getByText(text) {
29
- const el = findByText(container, text);
30
- if (!el) {
31
- throw new Error(
32
- `[AkashJS Test] Could not find element with text: "${text}"
33
- Container HTML: ${container.innerHTML.slice(0, 200)}`
34
- );
35
- }
36
- return el;
37
- },
38
- getByRole(role) {
39
- const el = container.querySelector(`[role="${role}"]`) ?? findImplicitRole(container, role);
40
- if (!el) {
41
- throw new Error(
42
- `[AkashJS Test] Could not find element with role: "${role}"
43
- Container HTML: ${container.innerHTML.slice(0, 200)}`
44
- );
45
- }
46
- return el;
47
- },
48
- getByTestId(id) {
49
- const el = container.querySelector(`[data-testid="${id}"]`);
50
- if (!el) {
51
- throw new Error(
52
- `[AkashJS Test] Could not find element with data-testid: "${id}"
53
- Container HTML: ${container.innerHTML.slice(0, 200)}`
54
- );
55
- }
56
- return el;
57
- },
58
- queryAll(selector) {
59
- return Array.from(container.querySelectorAll(selector));
60
- },
61
- query(selector) {
62
- return container.querySelector(selector);
63
- }
64
- };
65
- }
66
- var fireEvent = {
67
- async click(el) {
68
- el.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
69
- await tick();
70
- },
71
- async input(el, value) {
72
- const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
73
- el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype,
74
- "value"
75
- )?.set;
76
- if (nativeInputValueSetter) {
77
- nativeInputValueSetter.call(el, value);
78
- } else {
79
- el.value = value;
80
- }
81
- el.dispatchEvent(new Event("input", { bubbles: true }));
82
- el.dispatchEvent(new Event("change", { bubbles: true }));
83
- await tick();
84
- },
85
- async submit(el) {
86
- el.dispatchEvent(new Event("submit", { bubbles: true, cancelable: true }));
87
- await tick();
88
- },
89
- async focus(el) {
90
- el.focus();
91
- el.dispatchEvent(new FocusEvent("focus", { bubbles: true }));
92
- await tick();
93
- },
94
- async blur(el) {
95
- el.blur();
96
- el.dispatchEvent(new FocusEvent("blur", { bubbles: true }));
97
- await tick();
98
- },
99
- async keyDown(el, key, options) {
100
- el.dispatchEvent(new KeyboardEvent("keydown", { key, bubbles: true, ...options }));
101
- await tick();
102
- },
103
- async keyUp(el, key, options) {
104
- el.dispatchEvent(new KeyboardEvent("keyup", { key, bubbles: true, ...options }));
105
- await tick();
106
- }
107
- };
108
- function tick() {
109
- return new Promise((resolve) => queueMicrotask(resolve));
110
- }
111
- function findByText(root, text) {
112
- let best = null;
113
- const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
114
- let node = walker.nextNode();
115
- while (node) {
116
- if (node instanceof HTMLElement && node.textContent?.includes(text)) {
117
- best = node;
118
- }
119
- node = walker.nextNode();
120
- }
121
- if (!best && root.textContent?.includes(text)) {
122
- best = root;
123
- }
124
- return best;
125
- }
126
- var IMPLICIT_ROLES = {
127
- button: ["button"],
128
- a: ["link"],
129
- input: ["textbox", "checkbox", "radio", "spinbutton", "slider"],
130
- select: ["combobox", "listbox"],
131
- textarea: ["textbox"],
132
- img: ["img"],
133
- form: ["form"],
134
- nav: ["navigation"],
135
- main: ["main"],
136
- header: ["banner"],
137
- footer: ["contentinfo"],
138
- aside: ["complementary"],
139
- section: ["region"],
140
- article: ["article"],
141
- ul: ["list"],
142
- ol: ["list"],
143
- li: ["listitem"],
144
- table: ["table"],
145
- th: ["columnheader"],
146
- td: ["cell"],
147
- h1: ["heading"],
148
- h2: ["heading"],
149
- h3: ["heading"],
150
- h4: ["heading"],
151
- h5: ["heading"],
152
- h6: ["heading"]
153
- };
154
- function findImplicitRole(root, role) {
155
- const tags = [];
156
- for (const [tag, roles] of Object.entries(IMPLICIT_ROLES)) {
157
- if (roles.includes(role)) tags.push(tag);
158
- }
159
- if (tags.length === 0) return null;
160
- const selector = tags.join(", ");
161
- return root.querySelector(selector);
162
- }
163
-
164
- export { fireEvent, mount };
165
- //# sourceMappingURL=test.js.map
1
+ import {y as y$1,f}from'./chunk-BJKK7MKL.js';import'./chunk-4K6DIB7A.js';function M(e,n){let t=document.createElement("div");t.setAttribute("data-akash-test-root","");let l=n?.props??{},o=n?.provide,a;return o&&o.size>0?a=y$1(()=>{for(let[i,d]of o)f(i,d);return ()=>e(l)})({}):a=e(l),t.appendChild(a),document.body.appendChild(t),{container:t,unmount(){t.remove();},getByText(r){let i=m(t,r);if(!i)throw new Error(`[AkashJS Test] Could not find element with text: "${r}"
2
+ Container HTML: ${t.innerHTML.slice(0,200)}`);return i},getByRole(r){let i=t.querySelector(`[role="${r}"]`)??p(t,r);if(!i)throw new Error(`[AkashJS Test] Could not find element with role: "${r}"
3
+ Container HTML: ${t.innerHTML.slice(0,200)}`);return i},getByTestId(r){let i=t.querySelector(`[data-testid="${r}"]`);if(!i)throw new Error(`[AkashJS Test] Could not find element with data-testid: "${r}"
4
+ Container HTML: ${t.innerHTML.slice(0,200)}`);return i},queryAll(r){return Array.from(t.querySelectorAll(r))},query(r){return t.querySelector(r)}}}var y={async click(e){e.dispatchEvent(new MouseEvent("click",{bubbles:true,cancelable:true})),await s();},async input(e,n){let t=Object.getOwnPropertyDescriptor(e instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,"value")?.set;t?t.call(e,n):e.value=n,e.dispatchEvent(new Event("input",{bubbles:true})),e.dispatchEvent(new Event("change",{bubbles:true})),await s();},async submit(e){e.dispatchEvent(new Event("submit",{bubbles:true,cancelable:true})),await s();},async focus(e){e.focus(),e.dispatchEvent(new FocusEvent("focus",{bubbles:true})),await s();},async blur(e){e.blur(),e.dispatchEvent(new FocusEvent("blur",{bubbles:true})),await s();},async keyDown(e,n,t){e.dispatchEvent(new KeyboardEvent("keydown",{key:n,bubbles:true,...t})),await s();},async keyUp(e,n,t){e.dispatchEvent(new KeyboardEvent("keyup",{key:n,bubbles:true,...t})),await s();}};function s(){return new Promise(e=>queueMicrotask(e))}function m(e,n){let t=null,l=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),o=l.nextNode();for(;o;)o instanceof HTMLElement&&o.textContent?.includes(n)&&(t=o),o=l.nextNode();return !t&&e.textContent?.includes(n)&&(t=e),t}var E={button:["button"],a:["link"],input:["textbox","checkbox","radio","spinbutton","slider"],select:["combobox","listbox"],textarea:["textbox"],img:["img"],form:["form"],nav:["navigation"],main:["main"],header:["banner"],footer:["contentinfo"],aside:["complementary"],section:["region"],article:["article"],ul:["list"],ol:["list"],li:["listitem"],table:["table"],th:["columnheader"],td:["cell"],h1:["heading"],h2:["heading"],h3:["heading"],h4:["heading"],h5:["heading"],h6:["heading"]};function p(e,n){let t=[];for(let[o,a]of Object.entries(E))a.includes(n)&&t.push(o);if(t.length===0)return null;let l=t.join(", ");return e.querySelector(l)}export{y as fireEvent,M as mount};//# sourceMappingURL=test.js.map
166
5
  //# sourceMappingURL=test.js.map
package/dist/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/test.ts"],"names":[],"mappings":";;;AAqDO,SAAS,KAAA,CACd,WACA,OAAA,EACa;AACb,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,YAAA,CAAa,wBAAwB,EAAE,CAAA;AAEjD,EAAA,MAAM,KAAA,GAAS,OAAA,EAAS,KAAA,IAAS,EAAC;AAClC,EAAA,MAAM,WAAW,OAAA,EAAS,OAAA;AAE1B,EAAA,IAAI,IAAA;AAEJ,EAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,GAAO,CAAA,EAAG;AAEjC,IAAA,MAAM,OAAA,GAAU,gBAAgB,MAAM;AACpC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,QAAA,EAAU;AACnC,QAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MACpB;AACA,MAAA,OAAO,MAAM,UAAU,KAAK,CAAA;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,IAAA,GAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,EACnB,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,UAAU,KAAK,CAAA;AAAA,EACxB;AAEA,EAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAG1B,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AAEnC,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IAEA,OAAA,GAAU;AACR,MAAA,SAAA,CAAU,MAAA,EAAO;AAAA,IACnB,CAAA;AAAA,IAEA,UAAU,IAAA,EAA2B;AACnC,MAAA,MAAM,EAAA,GAAK,UAAA,CAAW,SAAA,EAAW,IAAI,CAAA;AACrC,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,qDAAqD,IAAI,CAAA;AAAA,kBAAA,EAClC,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,SAC1D;AAAA,MACF;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IAEA,UAAU,IAAA,EAA2B;AACnC,MAAA,MAAM,EAAA,GAAK,UAAU,aAAA,CAA2B,CAAA,OAAA,EAAU,IAAI,CAAA,EAAA,CAAI,CAAA,IAC7D,gBAAA,CAAiB,SAAA,EAAW,IAAI,CAAA;AACrC,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,qDAAqD,IAAI,CAAA;AAAA,kBAAA,EAClC,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,SAC1D;AAAA,MACF;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IAEA,YAAY,EAAA,EAAyB;AACnC,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,aAAA,CAA2B,CAAA,cAAA,EAAiB,EAAE,CAAA,EAAA,CAAI,CAAA;AACvE,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,4DAA4D,EAAE,CAAA;AAAA,kBAAA,EACvC,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,SAC1D;AAAA,MACF;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IAEA,SAAS,QAAA,EAAiC;AACxC,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAA8B,QAAQ,CAAC,CAAA;AAAA,IACrE,CAAA;AAAA,IAEA,MAAM,QAAA,EAAsC;AAC1C,MAAA,OAAO,SAAA,CAAU,cAA2B,QAAQ,CAAA;AAAA,IACtD;AAAA,GACF;AACF;AAaO,IAAM,SAAA,GAAY;AAAA,EACvB,MAAM,MAAM,EAAA,EAAgC;AAC1C,IAAA,EAAA,CAAG,aAAA,CAAc,IAAI,UAAA,CAAW,OAAA,EAAS,EAAE,SAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,CAAC,CAAA;AAC7E,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAA;AAAA,EAEA,MAAM,KAAA,CAAM,EAAA,EAA4C,KAAA,EAA8B;AAEpF,IAAA,MAAM,yBAAyB,MAAA,CAAO,wBAAA;AAAA,MACpC,EAAA,YAAc,mBAAA,GAAsB,mBAAA,CAAoB,SAAA,GAAY,gBAAA,CAAiB,SAAA;AAAA,MACrF;AAAA,KACF,EAAG,GAAA;AAEH,IAAA,IAAI,sBAAA,EAAwB;AAC1B,MAAA,sBAAA,CAAuB,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAC,GAAW,KAAA,GAAQ,KAAA;AAAA,IACtB;AAEA,IAAA,EAAA,CAAG,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AACtD,IAAA,EAAA,CAAG,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AACvD,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAA;AAAA,EAEA,MAAM,OAAO,EAAA,EAAoC;AAC/C,IAAA,EAAA,CAAG,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,SAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,CAAC,CAAA;AACzE,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAA;AAAA,EAEA,MAAM,MAAM,EAAA,EAAgC;AAC1C,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,EAAA,CAAG,aAAA,CAAc,IAAI,UAAA,CAAW,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3D,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAA;AAAA,EAEA,MAAM,KAAK,EAAA,EAAgC;AACzC,IAAA,EAAA,CAAG,IAAA,EAAK;AACR,IAAA,EAAA,CAAG,aAAA,CAAc,IAAI,UAAA,CAAW,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC1D,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAA;AAAA,EAEA,MAAM,OAAA,CAAQ,EAAA,EAAiB,GAAA,EAAa,OAAA,EAA4C;AACtF,IAAA,EAAA,CAAG,aAAA,CAAc,IAAI,aAAA,CAAc,SAAA,EAAW,EAAE,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,GAAG,OAAA,EAAS,CAAC,CAAA;AACjF,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAA;AAAA,EAEA,MAAM,KAAA,CAAM,EAAA,EAAiB,GAAA,EAAa,OAAA,EAA4C;AACpF,IAAA,EAAA,CAAG,aAAA,CAAc,IAAI,aAAA,CAAc,OAAA,EAAS,EAAE,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,GAAG,OAAA,EAAS,CAAC,CAAA;AAC/E,IAAA,MAAM,IAAA,EAAK;AAAA,EACb;AACF;AAKA,SAAS,IAAA,GAAsB;AAC7B,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,cAAA,CAAe,OAAO,CAAC,CAAA;AACzD;AAGA,SAAS,UAAA,CAAW,MAAmB,IAAA,EAAkC;AAEvE,EAAA,IAAI,IAAA,GAA2B,IAAA;AAE/B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,gBAAA,CAAiB,IAAA,EAAM,WAAW,YAAY,CAAA;AACtE,EAAA,IAAI,IAAA,GAAoB,OAAO,QAAA,EAAS;AAExC,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,IAAI,gBAAgB,WAAA,IAAe,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,IAAI,CAAA,EAAG;AACnE,MAAA,IAAA,GAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAA,GAAO,OAAO,QAAA,EAAS;AAAA,EACzB;AAGA,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,IAAI,CAAA,EAAG;AAC7C,IAAA,IAAA,GAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAaA,IAAM,cAAA,GAA2C;AAAA,EAC/C,MAAA,EAAQ,CAAC,QAAQ,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,MAAM,CAAA;AAAA,EACV,OAAO,CAAC,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,cAAc,QAAQ,CAAA;AAAA,EAC9D,MAAA,EAAQ,CAAC,UAAA,EAAY,SAAS,CAAA;AAAA,EAC9B,QAAA,EAAU,CAAC,SAAS,CAAA;AAAA,EACpB,GAAA,EAAK,CAAC,KAAK,CAAA;AAAA,EACX,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,EACb,GAAA,EAAK,CAAC,YAAY,CAAA;AAAA,EAClB,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,EACb,MAAA,EAAQ,CAAC,QAAQ,CAAA;AAAA,EACjB,MAAA,EAAQ,CAAC,aAAa,CAAA;AAAA,EACtB,KAAA,EAAO,CAAC,eAAe,CAAA;AAAA,EACvB,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,EAClB,OAAA,EAAS,CAAC,SAAS,CAAA;AAAA,EACnB,EAAA,EAAI,CAAC,MAAM,CAAA;AAAA,EACX,EAAA,EAAI,CAAC,MAAM,CAAA;AAAA,EACX,EAAA,EAAI,CAAC,UAAU,CAAA;AAAA,EACf,KAAA,EAAO,CAAC,OAAO,CAAA;AAAA,EACf,EAAA,EAAI,CAAC,cAAc,CAAA;AAAA,EACnB,EAAA,EAAI,CAAC,MAAM,CAAA;AAAA,EACX,EAAA,EAAI,CAAC,SAAS,CAAA;AAAA,EACd,EAAA,EAAI,CAAC,SAAS,CAAA;AAAA,EACd,EAAA,EAAI,CAAC,SAAS,CAAA;AAAA,EACd,EAAA,EAAI,CAAC,SAAS,CAAA;AAAA,EACd,EAAA,EAAI,CAAC,SAAS,CAAA;AAAA,EACd,EAAA,EAAI,CAAC,SAAS;AAChB,CAAA;AAEA,SAAS,gBAAA,CAAiB,MAAmB,IAAA,EAAkC;AAE7E,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AACzD,IAAA,IAAI,MAAM,QAAA,CAAS,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC/B,EAAA,OAAO,IAAA,CAAK,cAA2B,QAAQ,CAAA;AACjD","file":"test.js","sourcesContent":["/**\n * @akashjs/runtime/test — Test utilities.\n *\n * Provides mount(), fireEvent, and query helpers for testing\n * AkashJS components with Vitest (or any test runner).\n *\n * No TestBed, no module configuration, no compileComponents().\n * Just mount a component and query the resulting DOM.\n */\n\nimport { defineComponent } from './component.js';\nimport { provide } from './context.js';\nimport type { Component } from './component.js';\nimport type { InjectionKey } from './context.js';\n\n// --- Mount result ---\n\nexport interface MountResult {\n /** The root container element */\n container: HTMLElement;\n /** Unmount the component and clean up */\n unmount(): void;\n /** Find the first element whose text content contains the given string */\n getByText(text: string): HTMLElement;\n /** Find the first element with the given ARIA role */\n getByRole(role: string): HTMLElement;\n /** Find the first element with the given data-testid */\n getByTestId(id: string): HTMLElement;\n /** Query all elements matching a CSS selector */\n queryAll(selector: string): HTMLElement[];\n /** Query the first element matching a CSS selector, or null */\n query(selector: string): HTMLElement | null;\n}\n\n// --- Mount options ---\n\nexport interface MountOptions<P extends Record<string, unknown>> {\n /** Props to pass to the component */\n props?: P;\n /** Context values to provide (Map of InjectionKey -> value) */\n provide?: Map<InjectionKey<any>, any>;\n}\n\n// --- mount() ---\n\n/**\n * Mount a component into a detached DOM element for testing.\n *\n * ```ts\n * const { getByText, getByRole } = mount(Counter, { props: { initial: 5 } });\n * expect(getByText('Count: 5')).toBeTruthy();\n * ```\n */\nexport function mount<P extends Record<string, unknown> = Record<string, unknown>>(\n component: Component<P>,\n options?: MountOptions<P>,\n): MountResult {\n const container = document.createElement('div');\n container.setAttribute('data-akash-test-root', '');\n\n const props = (options?.props ?? {}) as P & { children?: undefined };\n const provides = options?.provide;\n\n let node: Node;\n\n if (provides && provides.size > 0) {\n // Wrap in a provider component to inject context values\n const Wrapper = defineComponent(() => {\n for (const [key, value] of provides) {\n provide(key, value);\n }\n return () => component(props);\n });\n node = Wrapper({});\n } else {\n node = component(props);\n }\n\n container.appendChild(node);\n\n // Attach to document so queries work properly\n document.body.appendChild(container);\n\n return {\n container,\n\n unmount() {\n container.remove();\n },\n\n getByText(text: string): HTMLElement {\n const el = findByText(container, text);\n if (!el) {\n throw new Error(\n `[AkashJS Test] Could not find element with text: \"${text}\"\\n` +\n ` Container HTML: ${container.innerHTML.slice(0, 200)}`,\n );\n }\n return el;\n },\n\n getByRole(role: string): HTMLElement {\n const el = container.querySelector<HTMLElement>(`[role=\"${role}\"]`)\n ?? findImplicitRole(container, role);\n if (!el) {\n throw new Error(\n `[AkashJS Test] Could not find element with role: \"${role}\"\\n` +\n ` Container HTML: ${container.innerHTML.slice(0, 200)}`,\n );\n }\n return el;\n },\n\n getByTestId(id: string): HTMLElement {\n const el = container.querySelector<HTMLElement>(`[data-testid=\"${id}\"]`);\n if (!el) {\n throw new Error(\n `[AkashJS Test] Could not find element with data-testid: \"${id}\"\\n` +\n ` Container HTML: ${container.innerHTML.slice(0, 200)}`,\n );\n }\n return el;\n },\n\n queryAll(selector: string): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(selector));\n },\n\n query(selector: string): HTMLElement | null {\n return container.querySelector<HTMLElement>(selector);\n },\n };\n}\n\n// --- fireEvent ---\n\n/**\n * Fire DOM events on elements. Returns a promise that resolves\n * after a microtask, giving effects time to flush.\n *\n * ```ts\n * await fireEvent.click(button);\n * await fireEvent.input(input, 'hello');\n * ```\n */\nexport const fireEvent = {\n async click(el: HTMLElement): Promise<void> {\n el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));\n await tick();\n },\n\n async input(el: HTMLInputElement | HTMLTextAreaElement, value: string): Promise<void> {\n // Set the value property directly (as a user typing would)\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype,\n 'value',\n )?.set;\n\n if (nativeInputValueSetter) {\n nativeInputValueSetter.call(el, value);\n } else {\n (el as any).value = value;\n }\n\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n await tick();\n },\n\n async submit(el: HTMLFormElement): Promise<void> {\n el.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n await tick();\n },\n\n async focus(el: HTMLElement): Promise<void> {\n el.focus();\n el.dispatchEvent(new FocusEvent('focus', { bubbles: true }));\n await tick();\n },\n\n async blur(el: HTMLElement): Promise<void> {\n el.blur();\n el.dispatchEvent(new FocusEvent('blur', { bubbles: true }));\n await tick();\n },\n\n async keyDown(el: HTMLElement, key: string, options?: KeyboardEventInit): Promise<void> {\n el.dispatchEvent(new KeyboardEvent('keydown', { key, bubbles: true, ...options }));\n await tick();\n },\n\n async keyUp(el: HTMLElement, key: string, options?: KeyboardEventInit): Promise<void> {\n el.dispatchEvent(new KeyboardEvent('keyup', { key, bubbles: true, ...options }));\n await tick();\n },\n};\n\n// --- Internal helpers ---\n\n/** Wait one microtask for effects to flush */\nfunction tick(): Promise<void> {\n return new Promise((resolve) => queueMicrotask(resolve));\n}\n\n/** Walk DOM tree to find the deepest element containing text */\nfunction findByText(root: HTMLElement, text: string): HTMLElement | null {\n // Walk all descendant elements; keep the deepest match\n let best: HTMLElement | null = null;\n\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n let node: Node | null = walker.nextNode(); // skip root itself on first call\n\n while (node) {\n if (node instanceof HTMLElement && node.textContent?.includes(text)) {\n best = node; // deeper elements overwrite shallower ones\n }\n node = walker.nextNode();\n }\n\n // If no descendant matched, check root itself\n if (!best && root.textContent?.includes(text)) {\n best = root;\n }\n\n return best;\n}\n\nfunction getDirectTextContent(el: HTMLElement): string {\n let text = '';\n for (const child of el.childNodes) {\n if (child.nodeType === Node.TEXT_NODE) {\n text += child.textContent ?? '';\n }\n }\n return text;\n}\n\n/** Map of HTML tag names to their implicit ARIA roles */\nconst IMPLICIT_ROLES: Record<string, string[]> = {\n button: ['button'],\n a: ['link'],\n input: ['textbox', 'checkbox', 'radio', 'spinbutton', 'slider'],\n select: ['combobox', 'listbox'],\n textarea: ['textbox'],\n img: ['img'],\n form: ['form'],\n nav: ['navigation'],\n main: ['main'],\n header: ['banner'],\n footer: ['contentinfo'],\n aside: ['complementary'],\n section: ['region'],\n article: ['article'],\n ul: ['list'],\n ol: ['list'],\n li: ['listitem'],\n table: ['table'],\n th: ['columnheader'],\n td: ['cell'],\n h1: ['heading'],\n h2: ['heading'],\n h3: ['heading'],\n h4: ['heading'],\n h5: ['heading'],\n h6: ['heading'],\n};\n\nfunction findImplicitRole(root: HTMLElement, role: string): HTMLElement | null {\n // Find tags that implicitly have this role\n const tags: string[] = [];\n for (const [tag, roles] of Object.entries(IMPLICIT_ROLES)) {\n if (roles.includes(role)) tags.push(tag);\n }\n\n if (tags.length === 0) return null;\n\n const selector = tags.join(', ');\n return root.querySelector<HTMLElement>(selector);\n}\n"]}
1
+ {"version":3,"sources":["../src/test.ts"],"names":["mount","component","options","container","props","provides","node","defineComponent","key","value","provide","text","el","findByText","role","findImplicitRole","id","selector","fireEvent","tick","nativeInputValueSetter","resolve","root","best","walker","IMPLICIT_ROLES","tags","tag","roles"],"mappings":"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","file":"test.js","sourcesContent":["/**\n * @akashjs/runtime/test — Test utilities.\n *\n * Provides mount(), fireEvent, and query helpers for testing\n * AkashJS components with Vitest (or any test runner).\n *\n * No TestBed, no module configuration, no compileComponents().\n * Just mount a component and query the resulting DOM.\n */\n\nimport { defineComponent } from './component.js';\nimport { provide } from './context.js';\nimport type { Component } from './component.js';\nimport type { InjectionKey } from './context.js';\n\n// --- Mount result ---\n\nexport interface MountResult {\n /** The root container element */\n container: HTMLElement;\n /** Unmount the component and clean up */\n unmount(): void;\n /** Find the first element whose text content contains the given string */\n getByText(text: string): HTMLElement;\n /** Find the first element with the given ARIA role */\n getByRole(role: string): HTMLElement;\n /** Find the first element with the given data-testid */\n getByTestId(id: string): HTMLElement;\n /** Query all elements matching a CSS selector */\n queryAll(selector: string): HTMLElement[];\n /** Query the first element matching a CSS selector, or null */\n query(selector: string): HTMLElement | null;\n}\n\n// --- Mount options ---\n\nexport interface MountOptions<P extends Record<string, unknown>> {\n /** Props to pass to the component */\n props?: P;\n /** Context values to provide (Map of InjectionKey -> value) */\n provide?: Map<InjectionKey<any>, any>;\n}\n\n// --- mount() ---\n\n/**\n * Mount a component into a detached DOM element for testing.\n *\n * ```ts\n * const { getByText, getByRole } = mount(Counter, { props: { initial: 5 } });\n * expect(getByText('Count: 5')).toBeTruthy();\n * ```\n */\nexport function mount<P extends Record<string, unknown> = Record<string, unknown>>(\n component: Component<P>,\n options?: MountOptions<P>,\n): MountResult {\n const container = document.createElement('div');\n container.setAttribute('data-akash-test-root', '');\n\n const props = (options?.props ?? {}) as P & { children?: undefined };\n const provides = options?.provide;\n\n let node: Node;\n\n if (provides && provides.size > 0) {\n // Wrap in a provider component to inject context values\n const Wrapper = defineComponent(() => {\n for (const [key, value] of provides) {\n provide(key, value);\n }\n return () => component(props);\n });\n node = Wrapper({});\n } else {\n node = component(props);\n }\n\n container.appendChild(node);\n\n // Attach to document so queries work properly\n document.body.appendChild(container);\n\n return {\n container,\n\n unmount() {\n container.remove();\n },\n\n getByText(text: string): HTMLElement {\n const el = findByText(container, text);\n if (!el) {\n throw new Error(\n `[AkashJS Test] Could not find element with text: \"${text}\"\\n` +\n ` Container HTML: ${container.innerHTML.slice(0, 200)}`,\n );\n }\n return el;\n },\n\n getByRole(role: string): HTMLElement {\n const el = container.querySelector<HTMLElement>(`[role=\"${role}\"]`)\n ?? findImplicitRole(container, role);\n if (!el) {\n throw new Error(\n `[AkashJS Test] Could not find element with role: \"${role}\"\\n` +\n ` Container HTML: ${container.innerHTML.slice(0, 200)}`,\n );\n }\n return el;\n },\n\n getByTestId(id: string): HTMLElement {\n const el = container.querySelector<HTMLElement>(`[data-testid=\"${id}\"]`);\n if (!el) {\n throw new Error(\n `[AkashJS Test] Could not find element with data-testid: \"${id}\"\\n` +\n ` Container HTML: ${container.innerHTML.slice(0, 200)}`,\n );\n }\n return el;\n },\n\n queryAll(selector: string): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(selector));\n },\n\n query(selector: string): HTMLElement | null {\n return container.querySelector<HTMLElement>(selector);\n },\n };\n}\n\n// --- fireEvent ---\n\n/**\n * Fire DOM events on elements. Returns a promise that resolves\n * after a microtask, giving effects time to flush.\n *\n * ```ts\n * await fireEvent.click(button);\n * await fireEvent.input(input, 'hello');\n * ```\n */\nexport const fireEvent = {\n async click(el: HTMLElement): Promise<void> {\n el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));\n await tick();\n },\n\n async input(el: HTMLInputElement | HTMLTextAreaElement, value: string): Promise<void> {\n // Set the value property directly (as a user typing would)\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype,\n 'value',\n )?.set;\n\n if (nativeInputValueSetter) {\n nativeInputValueSetter.call(el, value);\n } else {\n (el as any).value = value;\n }\n\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n await tick();\n },\n\n async submit(el: HTMLFormElement): Promise<void> {\n el.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n await tick();\n },\n\n async focus(el: HTMLElement): Promise<void> {\n el.focus();\n el.dispatchEvent(new FocusEvent('focus', { bubbles: true }));\n await tick();\n },\n\n async blur(el: HTMLElement): Promise<void> {\n el.blur();\n el.dispatchEvent(new FocusEvent('blur', { bubbles: true }));\n await tick();\n },\n\n async keyDown(el: HTMLElement, key: string, options?: KeyboardEventInit): Promise<void> {\n el.dispatchEvent(new KeyboardEvent('keydown', { key, bubbles: true, ...options }));\n await tick();\n },\n\n async keyUp(el: HTMLElement, key: string, options?: KeyboardEventInit): Promise<void> {\n el.dispatchEvent(new KeyboardEvent('keyup', { key, bubbles: true, ...options }));\n await tick();\n },\n};\n\n// --- Internal helpers ---\n\n/** Wait one microtask for effects to flush */\nfunction tick(): Promise<void> {\n return new Promise((resolve) => queueMicrotask(resolve));\n}\n\n/** Walk DOM tree to find the deepest element containing text */\nfunction findByText(root: HTMLElement, text: string): HTMLElement | null {\n // Walk all descendant elements; keep the deepest match\n let best: HTMLElement | null = null;\n\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n let node: Node | null = walker.nextNode(); // skip root itself on first call\n\n while (node) {\n if (node instanceof HTMLElement && node.textContent?.includes(text)) {\n best = node; // deeper elements overwrite shallower ones\n }\n node = walker.nextNode();\n }\n\n // If no descendant matched, check root itself\n if (!best && root.textContent?.includes(text)) {\n best = root;\n }\n\n return best;\n}\n\nfunction getDirectTextContent(el: HTMLElement): string {\n let text = '';\n for (const child of el.childNodes) {\n if (child.nodeType === Node.TEXT_NODE) {\n text += child.textContent ?? '';\n }\n }\n return text;\n}\n\n/** Map of HTML tag names to their implicit ARIA roles */\nconst IMPLICIT_ROLES: Record<string, string[]> = {\n button: ['button'],\n a: ['link'],\n input: ['textbox', 'checkbox', 'radio', 'spinbutton', 'slider'],\n select: ['combobox', 'listbox'],\n textarea: ['textbox'],\n img: ['img'],\n form: ['form'],\n nav: ['navigation'],\n main: ['main'],\n header: ['banner'],\n footer: ['contentinfo'],\n aside: ['complementary'],\n section: ['region'],\n article: ['article'],\n ul: ['list'],\n ol: ['list'],\n li: ['listitem'],\n table: ['table'],\n th: ['columnheader'],\n td: ['cell'],\n h1: ['heading'],\n h2: ['heading'],\n h3: ['heading'],\n h4: ['heading'],\n h5: ['heading'],\n h6: ['heading'],\n};\n\nfunction findImplicitRole(root: HTMLElement, role: string): HTMLElement | null {\n // Find tags that implicitly have this role\n const tags: string[] = [];\n for (const [tag, roles] of Object.entries(IMPLICIT_ROLES)) {\n if (roles.includes(role)) tags.push(tag);\n }\n\n if (tags.length === 0) return null;\n\n const selector = tags.join(', ');\n return root.querySelector<HTMLElement>(selector);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akashjs/runtime",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "AkashJS core runtime — signals, components, DOM rendering",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -8,14 +8,38 @@
8
8
  "types": "dist/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
- "types": "./dist/index.d.ts",
12
11
  "import": "./dist/index.js",
13
- "require": "./dist/index.cjs"
12
+ "require": "./dist/index.cjs",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./core": {
16
+ "import": "./dist/core.js",
17
+ "require": "./dist/core.cjs"
14
18
  },
15
19
  "./test": {
16
- "types": "./dist/test.d.ts",
17
20
  "import": "./dist/test.js",
18
21
  "require": "./dist/test.cjs"
22
+ },
23
+ "./store": {
24
+ "import": "./dist/store.js"
25
+ },
26
+ "./ssr": {
27
+ "import": "./dist/ssr.js"
28
+ },
29
+ "./sync": {
30
+ "import": "./dist/sync.js"
31
+ },
32
+ "./offline": {
33
+ "import": "./dist/offline.js"
34
+ },
35
+ "./animate": {
36
+ "import": "./dist/animate.js"
37
+ },
38
+ "./machine": {
39
+ "import": "./dist/machine.js"
40
+ },
41
+ "./pwa": {
42
+ "import": "./dist/pwa.js"
19
43
  }
20
44
  },
21
45
  "sideEffects": false,
@@ -25,7 +49,8 @@
25
49
  "test": "vitest"
26
50
  },
27
51
  "files": [
28
- "dist"
52
+ "dist",
53
+ "README.md"
29
54
  ],
30
55
  "license": "MIT",
31
56
  "publishConfig": {