saloe 0.0.1

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 (45) hide show
  1. package/README.md +19 -0
  2. package/demos/cloudflare-worker-actions/.wrangler/state/v3/cache/miniflare-CacheObject/9f458c07675338a7426a7b81ac4fb1baf92d034efbcaaf4336379640ed744ded.sqlite +0 -0
  3. package/demos/cloudflare-worker-actions/package.json +29 -0
  4. package/demos/cloudflare-worker-actions/public/input.js +5 -0
  5. package/demos/cloudflare-worker-actions/public/load.js +5 -0
  6. package/demos/cloudflare-worker-actions/public/submit.js +6 -0
  7. package/demos/cloudflare-worker-actions/server.js +93 -0
  8. package/demos/cloudflare-worker-actions/vite.config.js +25 -0
  9. package/demos/cloudflare-worker-actions/wrangler.toml +35 -0
  10. package/demos/cloudflare-worker-server/package.json +29 -0
  11. package/demos/cloudflare-worker-server/server.js +75 -0
  12. package/demos/cloudflare-worker-server/vite.config.js +25 -0
  13. package/demos/cloudflare-worker-server/wrangler.toml +32 -0
  14. package/dist/actions.cjs.js +280 -0
  15. package/dist/actions.es.js +280 -0
  16. package/dist/cloudflare-kv.cjs.js +29 -0
  17. package/dist/cloudflare-kv.es.js +29 -0
  18. package/dist/cloudflare-worker.cjs.js +19 -0
  19. package/dist/cloudflare-worker.es.js +19 -0
  20. package/dist/cookie.cjs.js +18 -0
  21. package/dist/cookie.es.js +18 -0
  22. package/dist/html.cjs.js +78 -0
  23. package/dist/html.es.js +78 -0
  24. package/dist/router.cjs.js +51 -0
  25. package/dist/router.es.js +51 -0
  26. package/dist/urlpattern.cjs.js +23 -0
  27. package/dist/urlpattern.es.js +6 -0
  28. package/dist/util.cjs.js +36 -0
  29. package/dist/util.es.js +36 -0
  30. package/dist/vite.cjs.js +102 -0
  31. package/dist/vite.es.js +101 -0
  32. package/dist/worker.cjs.js +43 -0
  33. package/dist/worker.es.js +43 -0
  34. package/package.json +63 -0
  35. package/src/actions.js +284 -0
  36. package/src/cloudflare-kv.js +36 -0
  37. package/src/cloudflare-worker.js +23 -0
  38. package/src/cookie.js +22 -0
  39. package/src/html.js +99 -0
  40. package/src/router.js +61 -0
  41. package/src/urlpattern.js +11 -0
  42. package/src/util.js +44 -0
  43. package/src/vite.js +127 -0
  44. package/src/worker.js +46 -0
  45. package/vite.config.js +36 -0
@@ -0,0 +1,280 @@
1
+ var __freeze = Object.freeze;
2
+ var __defProp = Object.defineProperty;
3
+ var __template = (cooked, raw) => __freeze(__defProp(cooked, "raw", { value: __freeze(raw || cooked.slice()) }));
4
+ var _a, _b;
5
+ import { html } from "./html.es.js";
6
+ const LISTENER_SCRIPT = html(_a || (_a = __template([`
7
+ <script defer>
8
+ (() => {
9
+ const EVENTS_PREVENT_DEFAULT_MANDATORY = [
10
+ 'submit'
11
+ ]
12
+
13
+ const EVENTS_FIRE_DOCUMENT_BODY_LISTENERS = [
14
+ 'mouseover',
15
+ 'click',
16
+ ]
17
+
18
+ const EVENTS = [
19
+ 'submit',
20
+ 'input',
21
+ 'blur',
22
+ 'change',
23
+ 'focus',
24
+ 'invalid',
25
+ ]
26
+
27
+
28
+ const addListener = ({ srcElement, event, listeners }) => {
29
+ srcElement?.addEventListener(event, (e) => {
30
+ executeListeners({ e, srcElement, listeners })
31
+ })
32
+ }
33
+
34
+ const executeListeners = ({ e, srcElement, listeners }) => {
35
+ listeners?.forEach((listener) => {
36
+ if (listener) listener({ e, srcElement })
37
+ })
38
+ }
39
+
40
+ const getListenerFromScript = ({ script, event }) => {
41
+ if (!script) return null
42
+ if (script[event]) return script[event]
43
+ const prev = Object.keys(script)?.find((key) => script[key][event])
44
+ if (!prev) return null
45
+ return script[prev][event]
46
+ }
47
+
48
+ const fetchListeners = async ({ srcElement, event, e }) => {
49
+ if (!srcElement?.getAttribute) return
50
+
51
+ const scriptNames = srcElement?.getAttribute('on-' + event)
52
+ if (!scriptNames) return
53
+
54
+ if (scriptNames && EVENTS_PREVENT_DEFAULT_MANDATORY.includes(event)) e.preventDefault()
55
+
56
+ const scripts = await Promise.all(
57
+ scriptNames?.split(',')?.map((scriptName) => {
58
+ const scriptToImport = '/' + scriptName?.trim() + '.js'
59
+ return import(scriptToImport)?.catch((err) => { })
60
+ })
61
+ )
62
+
63
+ const listeners = scripts?.map((script) => getListenerFromScript({ script, event }))
64
+
65
+ return listeners
66
+
67
+ // if (['load', 'click', 'submit', 'input', 'change'].includes(event)) executeListeners({ e, srcElement, listeners })
68
+ // if (['focus', 'blur', 'invalid', 'click', 'submit', 'input', 'change'].includes(event)) addListener({ srcElement, event, listeners })
69
+
70
+ // srcElement?.removeAttribute('on-' + event)
71
+ }
72
+
73
+ const addScripts = () => {
74
+ const scriptsToLoad = [...document.querySelectorAll('script[data-script-to-load]')]
75
+ return Promise.all(
76
+ scriptsToLoad?.map((scriptToLoad) => {
77
+ const id = scriptToLoad?.getAttribute('data-script-to-load')
78
+ scriptToLoad.removeAttribute('data-script-to-load')
79
+
80
+ const attrs = scriptToLoad?.getAttributeNames()?.reduce((acc, attrName) => {
81
+ const attrValue = scriptToLoad.getAttribute(attrName)
82
+ if (attrValue !== 'text/script-to-load') acc[attrName] = attrValue
83
+ return acc
84
+ }, {})
85
+
86
+ const content = scriptToLoad?.textContent
87
+
88
+ scriptToLoad?.remove()
89
+
90
+ return loadScript({ id, attrs, content }).catch((err) => {
91
+ console.error(err)
92
+ })
93
+ })
94
+ )
95
+ }
96
+
97
+ const loadScript = ({ id, attrs, content }) => {
98
+ const script = document?.createElement('script')
99
+
100
+ Object.keys(attrs)?.forEach((attrKey) => script?.setAttribute(attrKey, attrs[attrKey]))
101
+ script.id = id
102
+
103
+ if (content) script?.insertAdjacentHTML('beforeend', content)
104
+
105
+ return new Promise((resolve, reject) => {
106
+ if (!attrs.src) {
107
+ resolve()
108
+ document?.body?.insertAdjacentElement('beforeend', script)
109
+ return
110
+ }
111
+
112
+ script.onload = script.onreadystatechange = function () {
113
+ if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {
114
+ resolve()
115
+ script.onload = script.onreadystatechange = null
116
+ }
117
+ }
118
+
119
+ script.onerror = () => {
120
+ console.error('script failed to load')
121
+ reject(new Error('Failed to load script with src ' + script.src))
122
+ }
123
+
124
+ document?.body?.insertAdjacentElement('beforeend', script)
125
+ })
126
+ }
127
+
128
+ // load
129
+ const fireLoadListener = () => {
130
+ const event = 'load'
131
+ const srcElements = document?.querySelectorAll('[on-' + event + ']')
132
+
133
+ srcElements?.forEach(async (srcElement) => {
134
+ const listeners = await fetchListeners({ srcElement, event, e: null })
135
+ executeListeners({ e: null, srcElement, listeners })
136
+
137
+ srcElement?.removeAttribute('on-' + event)
138
+ })
139
+ }
140
+
141
+ // invalid
142
+ const fireInvalidListener = () => {
143
+ const event = 'invalid'
144
+ const srcElements = document?.querySelectorAll('[on-' + event + ']')
145
+
146
+ srcElements?.forEach(async (srcElement) => {
147
+ const listeners = await fetchListeners({ srcElement, event, e: null })
148
+ addListener({ srcElement, event, listeners })
149
+ })
150
+ }
151
+
152
+ // blur
153
+ const fireBlurListener = () => {
154
+ const event = 'blur'
155
+ const srcElements = document?.querySelectorAll('[on-' + event + ']')
156
+
157
+ srcElements?.forEach(async (srcElement) => {
158
+ const listeners = await fetchListeners({ srcElement, event, e: null })
159
+ addListener({ srcElement, event, listeners })
160
+ })
161
+ }
162
+
163
+ // focus
164
+ const fireFocusListener = () => {
165
+ const event = 'focus'
166
+ const srcElements = document?.querySelectorAll('[on-' + event + ']')
167
+
168
+ srcElements?.forEach(async (srcElement) => {
169
+ const listeners = await fetchListeners({ srcElement, event, e: null })
170
+ addListener({ srcElement, event, listeners })
171
+ })
172
+ }
173
+
174
+ // observers
175
+ const fireObserverListeners = () => {
176
+ const srcElements = [...document.querySelectorAll('[on-observe]')]
177
+
178
+ const uniqueScriptNames = [...srcElements?.reduce((acc, srcElement) => {
179
+ const attribute = srcElement?.getAttribute('on-observe')
180
+ if (attribute === 'undefined') return acc
181
+
182
+ const scriptNames = attribute?.split(',')
183
+ scriptNames?.forEach((scriptName) => acc?.set(scriptName, 1))
184
+
185
+ return acc
186
+ }, new Map())?.keys()]
187
+
188
+ uniqueScriptNames?.forEach(async (scriptName) => {
189
+ const observedSrcElements = document.querySelectorAll('[on-observe*="' + scriptName + '"]')
190
+
191
+ const script = await import('/' + scriptName?.trim() + '.js')?.catch((err) => { })
192
+ const listener = getListenerFromScript({ script, event: 'observe' })
193
+ if (!listener) return
194
+
195
+ const observer = new IntersectionObserver((entries) => {
196
+ entries.forEach((entry) => listener({ entry, observer }))
197
+ })
198
+
199
+ observedSrcElements?.forEach((observerSrcElement) => {
200
+ observer.observe(observerSrcElement)
201
+
202
+ const observerAttr = observerSrcElement?.getAttribute('on-observe')
203
+ const updatedObserverAttr = observerAttr?.replaceAll(scriptName + ', ', '')?.replaceAll(', ' + scriptName, '')?.replaceAll(scriptName, '')
204
+
205
+ if (updatedObserverAttr === '') observerSrcElement.removeAttribute('on-observe')
206
+ else observerSrcElement.setAttribute('on-observe', updatedObserverAttr)
207
+ })
208
+ })
209
+ }
210
+
211
+ const getSrcElement = ({ srcElement, event }) => {
212
+ if (!srcElement?.hasAttribute) return srcElement
213
+ const attribute = 'on-' + event
214
+ const hasScriptName = srcElement?.hasAttribute(attribute)
215
+ if (hasScriptName) return srcElement
216
+
217
+ const query = ':is(a, button, li)[' + attribute + ']'
218
+ const closestButton = srcElement?.closest(query)
219
+ if (closestButton) return closestButton
220
+
221
+ return srcElement
222
+ }
223
+
224
+ const fireListeners = () => {
225
+ EVENTS_FIRE_DOCUMENT_BODY_LISTENERS?.forEach((event) => {
226
+ document.body['on' + event] = async (e) => {
227
+ await addScripts()
228
+
229
+ fireLoadListener()
230
+ fireObserverListeners()
231
+ }
232
+ })
233
+
234
+ EVENTS?.forEach((event) => {
235
+ document.body['on' + event] = async (e) => {
236
+ const srcElement = getSrcElement({ srcElement: e?.srcElement, event })
237
+ const listeners = await fetchListeners({ srcElement, event, e })
238
+
239
+ executeListeners({ e, srcElement, listeners })
240
+ addListener({ srcElement, event, listeners })
241
+
242
+ console.log('--- removeAttribute =', srcElement?.removeAttribute)
243
+ if (srcElement?.removeAttribute) srcElement.removeAttribute('on-' + event)
244
+ }
245
+ })
246
+
247
+ // ['mouseover', 'click', 'submit', 'input', 'blur', 'change']?.forEach((event) => {
248
+ // document.body['on' + event] = async (e) => {
249
+ // if (EVENTS_FIRE_DOCUMENT_BODY_LISTENERS.includes(event)) {
250
+ // await addScripts()
251
+
252
+ // fireLoadListener()
253
+ // fireInvalidListener()
254
+ // fireBlurListener()
255
+ // fireFocusListener()
256
+
257
+ // fireObserverListeners()
258
+ // }
259
+
260
+ // const srcElement = getSrcElement({ srcElement: e.srcElement, event })
261
+ // fetchListeners({ srcElement, event, e })
262
+ // }
263
+ // })
264
+ }
265
+
266
+ fireListeners()
267
+
268
+ window.onload = () => {
269
+ setTimeout(() => {
270
+ document?.body?.click()
271
+ }, 2_500)
272
+ }
273
+ })()
274
+ <\/script>
275
+ `])));
276
+ const SW_REGISTER_SCRIPT = html(_b || (_b = __template(["\n <script defer>\n (async () => {\n if (!navigator.serviceWorker) return\n\n navigator.serviceWorker.register('/sw.worker.js', { scope: '/', type: 'module' })\n\n let refreshing\n // check to see if there is a current active service worker\n const oldSw = (await navigator.serviceWorker.getRegistration())?.active?.state\n navigator.serviceWorker.addEventListener('controllerchange', async () => {\n if (refreshing) return\n // when the controllerchange event has fired, we get the new service worker\n const newSw = (await navigator.serviceWorker.getRegistration())?.active?.state\n \n // if there was already an old activated service worker, and a new activating service worker, do notify update\n if (oldSw === 'activated' && newSw === 'activating') {\n refreshing = true\n // notifyUpdate()\n location.reload()\n }\n })\n })()\n <\/script> \n"])));
277
+ export {
278
+ LISTENER_SCRIPT,
279
+ SW_REGISTER_SCRIPT
280
+ };
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const getKV = ({ env, kv }) => env[kv];
4
+ const getKVResponse = async ({ env, kv, key }) => {
5
+ const result = await getFromKV({ env, kv, key });
6
+ if (result == null ? void 0 : result.err) return result;
7
+ const response = new Response(result == null ? void 0 : result.data);
8
+ return { response };
9
+ };
10
+ const getFromKV = async ({ env, kv, key }) => {
11
+ try {
12
+ const data = await getKV({ env, kv }).get(key);
13
+ return { data };
14
+ } catch (err) {
15
+ return { err };
16
+ }
17
+ };
18
+ const putInKV = async ({ env, kv, key, data }) => {
19
+ try {
20
+ const result = await getKV({ env, kv }).put(key, data);
21
+ return result;
22
+ } catch (err) {
23
+ return { err };
24
+ }
25
+ };
26
+ exports.getFromKV = getFromKV;
27
+ exports.getKV = getKV;
28
+ exports.getKVResponse = getKVResponse;
29
+ exports.putInKV = putInKV;
@@ -0,0 +1,29 @@
1
+ const getKV = ({ env, kv }) => env[kv];
2
+ const getKVResponse = async ({ env, kv, key }) => {
3
+ const result = await getFromKV({ env, kv, key });
4
+ if (result == null ? void 0 : result.err) return result;
5
+ const response = new Response(result == null ? void 0 : result.data);
6
+ return { response };
7
+ };
8
+ const getFromKV = async ({ env, kv, key }) => {
9
+ try {
10
+ const data = await getKV({ env, kv }).get(key);
11
+ return { data };
12
+ } catch (err) {
13
+ return { err };
14
+ }
15
+ };
16
+ const putInKV = async ({ env, kv, key, data }) => {
17
+ try {
18
+ const result = await getKV({ env, kv }).put(key, data);
19
+ return result;
20
+ } catch (err) {
21
+ return { err };
22
+ }
23
+ };
24
+ export {
25
+ getFromKV,
26
+ getKV,
27
+ getKVResponse,
28
+ putInKV
29
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const kvAssetHandler = require("@cloudflare/kv-asset-handler");
4
+ const getStaticResponse = async ({ request, waitUntil, manifestJSON, env }) => {
5
+ try {
6
+ const ASSET_MANIFEST = JSON.parse(manifestJSON ?? {});
7
+ const response = await kvAssetHandler.getAssetFromKV({
8
+ request,
9
+ waitUntil
10
+ }, {
11
+ ASSET_NAMESPACE: env.__STATIC_CONTENT,
12
+ ASSET_MANIFEST
13
+ });
14
+ return { response };
15
+ } catch (err) {
16
+ return { err };
17
+ }
18
+ };
19
+ exports.getStaticResponse = getStaticResponse;
@@ -0,0 +1,19 @@
1
+ import { getAssetFromKV } from "@cloudflare/kv-asset-handler";
2
+ const getStaticResponse = async ({ request, waitUntil, manifestJSON, env }) => {
3
+ try {
4
+ const ASSET_MANIFEST = JSON.parse(manifestJSON ?? {});
5
+ const response = await getAssetFromKV({
6
+ request,
7
+ waitUntil
8
+ }, {
9
+ ASSET_NAMESPACE: env.__STATIC_CONTENT,
10
+ ASSET_MANIFEST
11
+ });
12
+ return { response };
13
+ } catch (err) {
14
+ return { err };
15
+ }
16
+ };
17
+ export {
18
+ getStaticResponse
19
+ };
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const setCookie = ({ key, value }) => {
4
+ return cookieStore == null ? void 0 : cookieStore.set(key, value);
5
+ };
6
+ const getCookie = ({ key }) => {
7
+ return cookieStore == null ? void 0 : cookieStore.get(key);
8
+ };
9
+ const getAllCookies = () => {
10
+ return cookieStore == null ? void 0 : cookieStore.getAll();
11
+ };
12
+ const removeCookie = ({ key }) => {
13
+ return cookieStore == null ? void 0 : cookieStore.delete(key);
14
+ };
15
+ exports.getAllCookies = getAllCookies;
16
+ exports.getCookie = getCookie;
17
+ exports.removeCookie = removeCookie;
18
+ exports.setCookie = setCookie;
@@ -0,0 +1,18 @@
1
+ const setCookie = ({ key, value }) => {
2
+ return cookieStore == null ? void 0 : cookieStore.set(key, value);
3
+ };
4
+ const getCookie = ({ key }) => {
5
+ return cookieStore == null ? void 0 : cookieStore.get(key);
6
+ };
7
+ const getAllCookies = () => {
8
+ return cookieStore == null ? void 0 : cookieStore.getAll();
9
+ };
10
+ const removeCookie = ({ key }) => {
11
+ return cookieStore == null ? void 0 : cookieStore.delete(key);
12
+ };
13
+ export {
14
+ getAllCookies,
15
+ getCookie,
16
+ removeCookie,
17
+ setCookie
18
+ };
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __freeze = Object.freeze;
3
+ var __defProp = Object.defineProperty;
4
+ var __template = (cooked, raw) => __freeze(__defProp(cooked, "raw", { value: __freeze(raw || cooked.slice()) }));
5
+ var _a;
6
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
+ const worker = require("./worker.cjs.js");
8
+ const router = require("./router.cjs.js");
9
+ const util = require("./util.cjs.js");
10
+ const html = (s, ...args) => {
11
+ var _a2;
12
+ return (_a2 = s == null ? void 0 : s.map((ss, i) => `${ss}${(args == null ? void 0 : args.at(i)) ?? ""}`)) == null ? void 0 : _a2.join("");
13
+ };
14
+ const stream = ({ head, body, scripts, env, status, args }) => {
15
+ const headers = new Headers();
16
+ headers.append("Content-Type", "text/html;charset=UTF-8");
17
+ const callbacks = [
18
+ () => html`
19
+ <!DOCTYPE html>
20
+ <html lang="${(args == null ? void 0 : args.lang) ?? "en"}">
21
+ <head>
22
+ `,
23
+ head,
24
+ () => html`
25
+ </head>
26
+ <body
27
+ data-scope="${util.getScope({ env })}"
28
+ data-env="${util.getEnv({ env })}"
29
+ ${(args == null ? void 0 : args.isPublic) ?? ""}
30
+ ${(args == null ? void 0 : args.isLoading) ?? ""}
31
+ >
32
+ `,
33
+ body,
34
+ scripts ?? (() => ""),
35
+ () => html`
36
+ </body>
37
+ </html>
38
+ `
39
+ ];
40
+ return worker.stream({ callbacks, headers, status });
41
+ };
42
+ const awaitHtml = async ({ pending, success, error }) => {
43
+ const id = Math.floor(Math.random() * 1e9);
44
+ const pendingId = `pending_${id}`;
45
+ const pendingRoutePathname = `/~/components/${pendingId}`;
46
+ const getPage = async () => {
47
+ const headers = {
48
+ "Content-Type": "text/html;charset=utf-8",
49
+ "Transfer-Encoding": "chunked"
50
+ };
51
+ const streamResult = worker.stream({
52
+ callbacks: [
53
+ async () => html`
54
+ ${await success().then((template) => template).catch((err) => {
55
+ console.error(err == null ? void 0 : err.stack);
56
+ return error ? error({ id, err }) : "";
57
+ })}
58
+ `
59
+ ],
60
+ headers
61
+ });
62
+ router.removeRoute({ pathname: pendingRoutePathname });
63
+ return streamResult;
64
+ };
65
+ router.addRoute({
66
+ pathname: pendingRoutePathname,
67
+ route: { getPage }
68
+ });
69
+ return html(_a || (_a = __template(["\n ", '\n <script\n data-script-to-load="await-html_script-', `"
70
+ type="text/script-to-load"
71
+ >
72
+ (async () => {
73
+ const pendingEl = document?.querySelector('[data-await-pending-template="`, `"]')
74
+ const response = await fetch('`, "')\n const templateString = await response.text()\n pendingEl.outerHTML = templateString\n })()\n <\/script>\n "])), await pending({ id: pendingId }), id, pendingId, pendingRoutePathname);
75
+ };
76
+ exports.awaitHtml = awaitHtml;
77
+ exports.html = html;
78
+ exports.stream = stream;
@@ -0,0 +1,78 @@
1
+ var __freeze = Object.freeze;
2
+ var __defProp = Object.defineProperty;
3
+ var __template = (cooked, raw) => __freeze(__defProp(cooked, "raw", { value: __freeze(raw || cooked.slice()) }));
4
+ var _a;
5
+ import { stream as stream$1 } from "./worker.es.js";
6
+ import { addRoute, removeRoute } from "./router.es.js";
7
+ import { getScope, getEnv } from "./util.es.js";
8
+ const html = (s, ...args) => {
9
+ var _a2;
10
+ return (_a2 = s == null ? void 0 : s.map((ss, i) => `${ss}${(args == null ? void 0 : args.at(i)) ?? ""}`)) == null ? void 0 : _a2.join("");
11
+ };
12
+ const stream = ({ head, body, scripts, env, status, args }) => {
13
+ const headers = new Headers();
14
+ headers.append("Content-Type", "text/html;charset=UTF-8");
15
+ const callbacks = [
16
+ () => html`
17
+ <!DOCTYPE html>
18
+ <html lang="${(args == null ? void 0 : args.lang) ?? "en"}">
19
+ <head>
20
+ `,
21
+ head,
22
+ () => html`
23
+ </head>
24
+ <body
25
+ data-scope="${getScope({ env })}"
26
+ data-env="${getEnv({ env })}"
27
+ ${(args == null ? void 0 : args.isPublic) ?? ""}
28
+ ${(args == null ? void 0 : args.isLoading) ?? ""}
29
+ >
30
+ `,
31
+ body,
32
+ scripts ?? (() => ""),
33
+ () => html`
34
+ </body>
35
+ </html>
36
+ `
37
+ ];
38
+ return stream$1({ callbacks, headers, status });
39
+ };
40
+ const awaitHtml = async ({ pending, success, error }) => {
41
+ const id = Math.floor(Math.random() * 1e9);
42
+ const pendingId = `pending_${id}`;
43
+ const pendingRoutePathname = `/~/components/${pendingId}`;
44
+ const getPage = async () => {
45
+ const headers = {
46
+ "Content-Type": "text/html;charset=utf-8",
47
+ "Transfer-Encoding": "chunked"
48
+ };
49
+ const streamResult = stream$1({
50
+ callbacks: [
51
+ async () => html`
52
+ ${await success().then((template) => template).catch((err) => {
53
+ console.error(err == null ? void 0 : err.stack);
54
+ return error ? error({ id, err }) : "";
55
+ })}
56
+ `
57
+ ],
58
+ headers
59
+ });
60
+ removeRoute({ pathname: pendingRoutePathname });
61
+ return streamResult;
62
+ };
63
+ addRoute({
64
+ pathname: pendingRoutePathname,
65
+ route: { getPage }
66
+ });
67
+ return html(_a || (_a = __template(["\n ", '\n <script\n data-script-to-load="await-html_script-', `"
68
+ type="text/script-to-load"
69
+ >
70
+ (async () => {
71
+ const pendingEl = document?.querySelector('[data-await-pending-template="`, `"]')
72
+ const response = await fetch('`, "')\n const templateString = await response.text()\n pendingEl.outerHTML = templateString\n })()\n <\/script>\n "])), await pending({ id: pendingId }), id, pendingId, pendingRoutePathname);
73
+ };
74
+ export {
75
+ awaitHtml,
76
+ html,
77
+ stream
78
+ };
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const urlpattern = require("./urlpattern.cjs.js");
4
+ const worker = require("./worker.cjs.js");
5
+ const router = /* @__PURE__ */ new Map();
6
+ const getRouter = () => router;
7
+ const getRoute = ({ pathname }) => router.get(pathname);
8
+ const addRoute = ({ pathname, route }) => router.set(pathname, route);
9
+ const removeRoute = ({ pathname }) => router.delete(pathname);
10
+ const findPatternFromUrl = ({ url }) => {
11
+ var _a;
12
+ const patternPathname = [...new Set((_a = getRouter()) == null ? void 0 : _a.keys())].find((patternPathname2) => {
13
+ const pattern = urlpattern.getURLPatern({ pathname: patternPathname2 });
14
+ return pattern.test(url.href);
15
+ });
16
+ return patternPathname ? urlpattern.getURLPatern({ pathname: patternPathname }) : null;
17
+ };
18
+ const getRedirectResponse = ({ origin, pathname, isRedirectableCallback }) => {
19
+ if (origin !== (self == null ? void 0 : self.origin)) return;
20
+ const isRedirectable = isRedirectableCallback({ pathname });
21
+ const response = isRedirectable ? Response.redirect(pathname.slice(0, -1), 301) : null;
22
+ return { response };
23
+ };
24
+ const getNotFoundResponse = async ({ request }) => {
25
+ var _a;
26
+ const status = 404;
27
+ const notFoundRoute = getRoute({ pathname: `/${status}` });
28
+ const response = notFoundRoute ? (_a = await notFoundRoute({ request, status })) == null ? void 0 : _a.response : new Response("404", { status });
29
+ return { response };
30
+ };
31
+ const getForbiddenResponse = ({ origin, request, isForbiddenCallback }) => {
32
+ if (origin !== (self == null ? void 0 : self.origin)) return;
33
+ const isForbidden = isForbiddenCallback({ request });
34
+ if (!isForbidden) return;
35
+ return { response: new Response(`${request == null ? void 0 : request.url} is forbidden`, { status: 503 }) };
36
+ };
37
+ const getServerOnlyResponse = ({ origin, request, isServerOnlyCallback }) => {
38
+ if (origin !== (self == null ? void 0 : self.origin)) return;
39
+ const isServerOnly = isServerOnlyCallback({ request });
40
+ if (!isServerOnly) return;
41
+ return worker.fetch({ request });
42
+ };
43
+ exports.addRoute = addRoute;
44
+ exports.findPatternFromUrl = findPatternFromUrl;
45
+ exports.getForbiddenResponse = getForbiddenResponse;
46
+ exports.getNotFoundResponse = getNotFoundResponse;
47
+ exports.getRedirectResponse = getRedirectResponse;
48
+ exports.getRoute = getRoute;
49
+ exports.getRouter = getRouter;
50
+ exports.getServerOnlyResponse = getServerOnlyResponse;
51
+ exports.removeRoute = removeRoute;
@@ -0,0 +1,51 @@
1
+ import { getURLPatern } from "./urlpattern.es.js";
2
+ import { fetch } from "./worker.es.js";
3
+ const router = /* @__PURE__ */ new Map();
4
+ const getRouter = () => router;
5
+ const getRoute = ({ pathname }) => router.get(pathname);
6
+ const addRoute = ({ pathname, route }) => router.set(pathname, route);
7
+ const removeRoute = ({ pathname }) => router.delete(pathname);
8
+ const findPatternFromUrl = ({ url }) => {
9
+ var _a;
10
+ const patternPathname = [...new Set((_a = getRouter()) == null ? void 0 : _a.keys())].find((patternPathname2) => {
11
+ const pattern = getURLPatern({ pathname: patternPathname2 });
12
+ return pattern.test(url.href);
13
+ });
14
+ return patternPathname ? getURLPatern({ pathname: patternPathname }) : null;
15
+ };
16
+ const getRedirectResponse = ({ origin, pathname, isRedirectableCallback }) => {
17
+ if (origin !== (self == null ? void 0 : self.origin)) return;
18
+ const isRedirectable = isRedirectableCallback({ pathname });
19
+ const response = isRedirectable ? Response.redirect(pathname.slice(0, -1), 301) : null;
20
+ return { response };
21
+ };
22
+ const getNotFoundResponse = async ({ request }) => {
23
+ var _a;
24
+ const status = 404;
25
+ const notFoundRoute = getRoute({ pathname: `/${status}` });
26
+ const response = notFoundRoute ? (_a = await notFoundRoute({ request, status })) == null ? void 0 : _a.response : new Response("404", { status });
27
+ return { response };
28
+ };
29
+ const getForbiddenResponse = ({ origin, request, isForbiddenCallback }) => {
30
+ if (origin !== (self == null ? void 0 : self.origin)) return;
31
+ const isForbidden = isForbiddenCallback({ request });
32
+ if (!isForbidden) return;
33
+ return { response: new Response(`${request == null ? void 0 : request.url} is forbidden`, { status: 503 }) };
34
+ };
35
+ const getServerOnlyResponse = ({ origin, request, isServerOnlyCallback }) => {
36
+ if (origin !== (self == null ? void 0 : self.origin)) return;
37
+ const isServerOnly = isServerOnlyCallback({ request });
38
+ if (!isServerOnly) return;
39
+ return fetch({ request });
40
+ };
41
+ export {
42
+ addRoute,
43
+ findPatternFromUrl,
44
+ getForbiddenResponse,
45
+ getNotFoundResponse,
46
+ getRedirectResponse,
47
+ getRoute,
48
+ getRouter,
49
+ getServerOnlyResponse,
50
+ removeRoute
51
+ };