@vesk/runtime 0.2.9 → 0.2.11
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.
- package/README.md +69 -2
- package/dist/hmr-client.d.ts +323 -0
- package/dist/hmr-client.d.ts.map +1 -1
- package/dist/hmr-client.js +3869 -197
- package/dist/md.d.ts +7 -3
- package/dist/md.d.ts.map +1 -1
- package/dist/md.js +228 -38
- package/dist/request.d.ts +28 -0
- package/dist/request.d.ts.map +1 -1
- package/dist/request.js +70 -0
- package/dist/resource.d.ts +5 -0
- package/dist/resource.d.ts.map +1 -1
- package/dist/resource.js +71 -3
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +7 -3
- package/package.json +2 -2
package/dist/resource.js
CHANGED
|
@@ -46,7 +46,7 @@ function getRegistry() {
|
|
|
46
46
|
g().__vsk_fetch_registry = map;
|
|
47
47
|
return map;
|
|
48
48
|
}
|
|
49
|
-
function getSsrData(key) {
|
|
49
|
+
export function getSsrData(key) {
|
|
50
50
|
const sink = ssrSink;
|
|
51
51
|
if (sink)
|
|
52
52
|
return sink.get(key);
|
|
@@ -156,10 +156,16 @@ function buildRequestInit(options) {
|
|
|
156
156
|
function resolveFetchUrl(url) {
|
|
157
157
|
if (/^[a-z][a-z0-9+.-]*:/i.test(url) || url.startsWith('//'))
|
|
158
158
|
return url;
|
|
159
|
-
const
|
|
159
|
+
const ctx = g().__vesk_request;
|
|
160
|
+
const resolver = ctx && typeof ctx.resolveUrl === 'function'
|
|
161
|
+
? ctx.resolveUrl
|
|
162
|
+
: null;
|
|
163
|
+
if (resolver)
|
|
164
|
+
return resolver(url);
|
|
165
|
+
const reqUrl = ctx?.url;
|
|
160
166
|
const base = typeof reqUrl === 'string' && /^https?:\/\//i.test(reqUrl)
|
|
161
167
|
? reqUrl
|
|
162
|
-
:
|
|
168
|
+
: globalThis.__vesk_ssr_base_url || '';
|
|
163
169
|
if (base)
|
|
164
170
|
return new URL(url, base).href;
|
|
165
171
|
return url;
|
|
@@ -237,6 +243,43 @@ async function runFetcher(handle, timeout) {
|
|
|
237
243
|
function sleep(ms) {
|
|
238
244
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
239
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Reads a streaming `Response` body chunk by chunk (TextDecoder) and
|
|
248
|
+
* progressively fans the running total into a tracked cell via `into`.
|
|
249
|
+
* Falls back to `res.text()` when the body has no readable stream.
|
|
250
|
+
* Returns the fully consumed string so `settle` records the final value.
|
|
251
|
+
*/
|
|
252
|
+
function streamText(res, into, onChunk) {
|
|
253
|
+
const decoder = new TextDecoder();
|
|
254
|
+
let total = '';
|
|
255
|
+
const emit = (text) => {
|
|
256
|
+
if (!text)
|
|
257
|
+
return;
|
|
258
|
+
total += text;
|
|
259
|
+
if (into)
|
|
260
|
+
setInto(into, total);
|
|
261
|
+
if (onChunk)
|
|
262
|
+
onChunk(text, total);
|
|
263
|
+
};
|
|
264
|
+
const body = res.body;
|
|
265
|
+
if (body && typeof body.getReader === 'function') {
|
|
266
|
+
const reader = body.getReader();
|
|
267
|
+
return (async () => {
|
|
268
|
+
for (;;) {
|
|
269
|
+
const { done, value } = await reader.read();
|
|
270
|
+
if (done)
|
|
271
|
+
break;
|
|
272
|
+
emit(decoder.decode(value, { stream: true }));
|
|
273
|
+
}
|
|
274
|
+
emit(decoder.decode());
|
|
275
|
+
return total;
|
|
276
|
+
})();
|
|
277
|
+
}
|
|
278
|
+
return res.text().then((text) => {
|
|
279
|
+
emit(text);
|
|
280
|
+
return total;
|
|
281
|
+
});
|
|
282
|
+
}
|
|
240
283
|
function settle(handle, data) {
|
|
241
284
|
if (handle.block !== null && is_destroyed(handle.block))
|
|
242
285
|
return;
|
|
@@ -522,6 +565,31 @@ useFetch.arrayBuffer = (url, options) => useFetch(() => doFetch(resolveFetchUrl(
|
|
|
522
565
|
...options,
|
|
523
566
|
key: options?.key ?? url,
|
|
524
567
|
});
|
|
568
|
+
/**
|
|
569
|
+
* Streaming fetch: consumes the response body chunk by chunk and reacts
|
|
570
|
+
* progressively. Each decoded chunk updates the target tracked cell (`into`),
|
|
571
|
+
* so anything subscribed to that cell (e.g. `<Md content={doc} />` or a
|
|
572
|
+
* plain `{doc}` interpolation) re-renders as data arrives. `url` may be a
|
|
573
|
+
* provider function — it is re-evaluated on every fetch (including `refresh`),
|
|
574
|
+
* so switching a tracked path propagates without recreating the resource.
|
|
575
|
+
*/
|
|
576
|
+
useFetch.stream = (urlOrFn, options) => {
|
|
577
|
+
const streamInto = options?.into;
|
|
578
|
+
const streamOnChunk = options?.onChunk;
|
|
579
|
+
const fetcher = (signal) => {
|
|
580
|
+
const url = typeof urlOrFn === 'function' ? urlOrFn() : urlOrFn;
|
|
581
|
+
const init = buildRequestInit(options ?? {});
|
|
582
|
+
return doFetch(resolveFetchUrl(url), signal ? { ...init, signal } : init).then(async (res) => {
|
|
583
|
+
if (!res.ok)
|
|
584
|
+
throw new HttpError(res.status, res.statusText);
|
|
585
|
+
return streamText(res, streamInto, streamOnChunk);
|
|
586
|
+
});
|
|
587
|
+
};
|
|
588
|
+
const key = options?.key ?? (typeof urlOrFn === 'string' ? urlOrFn : undefined);
|
|
589
|
+
const resource = useFetch(fetcher, { ...options, key });
|
|
590
|
+
resource.into = streamInto;
|
|
591
|
+
return resource;
|
|
592
|
+
};
|
|
525
593
|
export async function resolveSsrResources() {
|
|
526
594
|
const sink = ssrSink;
|
|
527
595
|
if (sink)
|
package/dist/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|
package/dist/router.js
CHANGED
|
@@ -734,7 +734,9 @@ function renderMatch(router, match, container, navToken) {
|
|
|
734
734
|
rootDom = runInBlockWindow(() => renderLayoutChain(0));
|
|
735
735
|
}
|
|
736
736
|
catch (error) {
|
|
737
|
-
if (error
|
|
737
|
+
if (error instanceof NotFoundError) {
|
|
738
|
+
if (typeof console !== 'undefined')
|
|
739
|
+
console.error('[vesk-debug] NotFoundError in renderLayoutChain:', error);
|
|
738
740
|
return renderNotFound(router, match, container);
|
|
739
741
|
}
|
|
740
742
|
let errDom;
|
|
@@ -753,7 +755,7 @@ function renderMatch(router, match, container, navToken) {
|
|
|
753
755
|
}
|
|
754
756
|
if (rootDom && typeof rootDom.then === 'function') {
|
|
755
757
|
return rootDom.then((resolved) => { mountDom(resolved); }, (error) => {
|
|
756
|
-
if (error
|
|
758
|
+
if (error instanceof NotFoundError) {
|
|
757
759
|
return renderNotFound(router, match, container);
|
|
758
760
|
}
|
|
759
761
|
return Promise.resolve(renderErrorInLayout(error)).then(mountDom, (e) => { mountStandaloneError(e); });
|
|
@@ -983,7 +985,9 @@ async function hydrateInitial(router, match, container, strategy) {
|
|
|
983
985
|
// Hydration failed — most often the page component throwing on the
|
|
984
986
|
// client after a clean SSR. Re-render through renderMatch so the error
|
|
985
987
|
// component replaces just the page slot and the layout/nav survives.
|
|
986
|
-
if (error
|
|
988
|
+
if (error instanceof NotFoundError) {
|
|
989
|
+
if (typeof console !== 'undefined')
|
|
990
|
+
console.error('[vesk-debug] NotFoundError during hydration:', error);
|
|
987
991
|
await renderNotFound(router, match, container);
|
|
988
992
|
return;
|
|
989
993
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vesk/runtime",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Vesk runtime — reactivity, blocks, DOM operations, hydration",
|
|
6
6
|
"main": "./dist/index-client.js",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"./package.json": "./package.json"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@vesk/compiler": "^0.2.
|
|
29
|
+
"@vesk/compiler": "^0.2.11"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"typecheck": "tsc --noEmit",
|