@vesk/runtime 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.
- package/README.md +23 -0
- package/dist/action.d.ts +43 -0
- package/dist/action.d.ts.map +1 -0
- package/dist/action.js +84 -0
- package/dist/bindings.d.ts +4 -0
- package/dist/bindings.d.ts.map +1 -0
- package/dist/bindings.js +137 -0
- package/dist/context.d.ts +15 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +34 -0
- package/dist/experiment.d.ts +17 -0
- package/dist/experiment.d.ts.map +1 -0
- package/dist/experiment.js +71 -0
- package/dist/form.d.ts +36 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +278 -0
- package/dist/hmr-client.d.ts +1 -0
- package/dist/hmr-client.d.ts.map +1 -0
- package/dist/hmr-client.js +273 -0
- package/dist/hydrate.d.ts +34 -0
- package/dist/hydrate.d.ts.map +1 -0
- package/dist/hydrate.js +248 -0
- package/dist/image.d.ts +19 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +51 -0
- package/dist/index-client.d.ts +16 -0
- package/dist/index-client.d.ts.map +1 -0
- package/dist/index-client.js +15 -0
- package/dist/index-server.d.ts +15 -0
- package/dist/index-server.d.ts.map +1 -0
- package/dist/index-server.js +14 -0
- package/dist/isr.d.ts +27 -0
- package/dist/isr.d.ts.map +1 -0
- package/dist/isr.js +143 -0
- package/dist/md.d.ts +17 -0
- package/dist/md.d.ts.map +1 -0
- package/dist/md.js +507 -0
- package/dist/package.json +23 -0
- package/dist/portal.d.ts +8 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/portal.js +20 -0
- package/dist/reconcile.d.ts +3 -0
- package/dist/reconcile.d.ts.map +1 -0
- package/dist/reconcile.js +66 -0
- package/dist/request.d.ts +188 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +624 -0
- package/dist/resource.d.ts +47 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/resource.js +502 -0
- package/dist/ripple-blocks.d.ts +18 -0
- package/dist/ripple-blocks.d.ts.map +1 -0
- package/dist/ripple-blocks.js +184 -0
- package/dist/ripple-constants.d.ts +42 -0
- package/dist/ripple-constants.d.ts.map +1 -0
- package/dist/ripple-constants.js +41 -0
- package/dist/ripple-runtime.d.ts +125 -0
- package/dist/ripple-runtime.d.ts.map +1 -0
- package/dist/ripple-runtime.js +891 -0
- package/dist/ripple-utils.d.ts +12 -0
- package/dist/ripple-utils.d.ts.map +1 -0
- package/dist/ripple-utils.js +10 -0
- package/dist/router-components.d.ts +83 -0
- package/dist/router-components.d.ts.map +1 -0
- package/dist/router-components.js +320 -0
- package/dist/router-match.d.ts +40 -0
- package/dist/router-match.d.ts.map +1 -0
- package/dist/router-match.js +158 -0
- package/dist/router.d.ts +56 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +1330 -0
- package/dist/seo.d.ts +94 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +138 -0
- package/dist/suspense.d.ts +1 -0
- package/dist/suspense.d.ts.map +1 -0
- package/dist/suspense.js +14 -0
- package/dist/track.d.ts +20 -0
- package/dist/track.d.ts.map +1 -0
- package/dist/track.js +124 -0
- package/package.json +55 -0
package/dist/hydrate.js
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { get } from '@vesk/runtime/src/ripple-runtime';
|
|
2
|
+
export function reactiveProps(props) {
|
|
3
|
+
return new Proxy(props, {
|
|
4
|
+
get(target, key) {
|
|
5
|
+
const val = Reflect.get(target, key);
|
|
6
|
+
if (typeof val === 'object' && val !== null && typeof val.f === 'number') {
|
|
7
|
+
return get(val);
|
|
8
|
+
}
|
|
9
|
+
return val;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
const _SHOW_COMMENT = 128;
|
|
14
|
+
export const _FILTER_ACCEPT = 1;
|
|
15
|
+
export const _FILTER_SKIP = 2;
|
|
16
|
+
export function collectVskMarkers(container) {
|
|
17
|
+
const markers = [];
|
|
18
|
+
const walker = document.createTreeWalker(container, _SHOW_COMMENT, {
|
|
19
|
+
acceptNode: (node) => (node.textContent === 'vsk' ? _FILTER_ACCEPT : _FILTER_SKIP),
|
|
20
|
+
});
|
|
21
|
+
while (walker.nextNode())
|
|
22
|
+
markers.push(walker.currentNode);
|
|
23
|
+
return markers;
|
|
24
|
+
}
|
|
25
|
+
export function createHydrateWalker(container, markerList) {
|
|
26
|
+
const markers = markerList || (container ? collectVskMarkers(container) : []);
|
|
27
|
+
let markerIdx = 0;
|
|
28
|
+
return {
|
|
29
|
+
root: container,
|
|
30
|
+
done() {
|
|
31
|
+
return markerIdx >= markers.length;
|
|
32
|
+
},
|
|
33
|
+
nextElement(tag) {
|
|
34
|
+
while (markerIdx < markers.length) {
|
|
35
|
+
const marker = markers[markerIdx++];
|
|
36
|
+
const el = marker.nextElementSibling;
|
|
37
|
+
marker.remove();
|
|
38
|
+
if (tag && (!el || el.tagName.toLowerCase() !== tag))
|
|
39
|
+
continue;
|
|
40
|
+
if (el) {
|
|
41
|
+
for (let i = el.childNodes.length - 1; i >= 0; i--) {
|
|
42
|
+
if (el.childNodes[i].nodeType === 3) {
|
|
43
|
+
el.childNodes[i].remove();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return el || document.createElement(tag || 'div');
|
|
48
|
+
}
|
|
49
|
+
return document.createElement(tag || 'div');
|
|
50
|
+
},
|
|
51
|
+
subWalker(rootEl) {
|
|
52
|
+
const subMarkers = markers.slice(markerIdx).filter((m) => {
|
|
53
|
+
if (rootEl === m)
|
|
54
|
+
return true;
|
|
55
|
+
if (!rootEl || !m)
|
|
56
|
+
return false;
|
|
57
|
+
if (typeof rootEl.contains === 'function')
|
|
58
|
+
return rootEl.contains(m);
|
|
59
|
+
return false;
|
|
60
|
+
});
|
|
61
|
+
markerIdx += subMarkers.length;
|
|
62
|
+
return createHydrateWalker(rootEl, subMarkers);
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function createHydrateChildWalker(parentEl) {
|
|
67
|
+
let childIdx = 0;
|
|
68
|
+
const children = parentEl ? parentEl.children : [];
|
|
69
|
+
return {
|
|
70
|
+
root: parentEl,
|
|
71
|
+
done() {
|
|
72
|
+
return childIdx >= children.length;
|
|
73
|
+
},
|
|
74
|
+
nextElement(tag) {
|
|
75
|
+
while (childIdx < children.length) {
|
|
76
|
+
const child = children[childIdx++];
|
|
77
|
+
if (!tag || child.tagName.toLowerCase() === tag) {
|
|
78
|
+
for (let i = child.childNodes.length - 1; i >= 0; i--) {
|
|
79
|
+
if (child.childNodes[i].nodeType === 3) {
|
|
80
|
+
child.childNodes[i].remove();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return child;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return document.createElement(tag || 'div');
|
|
87
|
+
},
|
|
88
|
+
subWalker(rootEl) {
|
|
89
|
+
return createHydrateChildWalker(rootEl);
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function hydrate(container, componentFn, props) {
|
|
94
|
+
const walker = createHydrateWalker(container);
|
|
95
|
+
return componentFn(props || {}, new Map(), walker);
|
|
96
|
+
}
|
|
97
|
+
export function hydrateViewport(container, componentFn, props, rootMargin = 500) {
|
|
98
|
+
if (document.readyState !== 'complete') {
|
|
99
|
+
return new Promise((resolve) => {
|
|
100
|
+
const onLoad = () => {
|
|
101
|
+
window.removeEventListener('load', onLoad);
|
|
102
|
+
resolve(hydrateViewport(container, componentFn, props, rootMargin));
|
|
103
|
+
};
|
|
104
|
+
window.addEventListener('load', onLoad);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const allMarkers = collectVskMarkers(container);
|
|
108
|
+
const viewportMarkers = [];
|
|
109
|
+
const deferredMarkers = [];
|
|
110
|
+
for (const marker of allMarkers) {
|
|
111
|
+
const el = marker.nextElementSibling;
|
|
112
|
+
if (!el) {
|
|
113
|
+
deferredMarkers.push(marker);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const rect = el.getBoundingClientRect();
|
|
117
|
+
if (rect.bottom < -rootMargin || rect.top > window.innerHeight + rootMargin) {
|
|
118
|
+
deferredMarkers.push(marker);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
viewportMarkers.push(marker);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
for (const marker of deferredMarkers) {
|
|
125
|
+
marker.textContent = 'vsk-hold';
|
|
126
|
+
}
|
|
127
|
+
const viewportWalker = createHydrateWalker(container, viewportMarkers);
|
|
128
|
+
componentFn(props || {}, new Map(), viewportWalker);
|
|
129
|
+
if (deferredMarkers.length > 0) {
|
|
130
|
+
return new Promise((resolve) => {
|
|
131
|
+
const observer = new IntersectionObserver((entries) => {
|
|
132
|
+
const toHydrate = [];
|
|
133
|
+
for (const entry of entries) {
|
|
134
|
+
if (entry.isIntersecting) {
|
|
135
|
+
const el = entry.target;
|
|
136
|
+
const siblings = el.parentNode ? Array.from(el.parentNode.childNodes) : [];
|
|
137
|
+
const heldMarker = siblings.find((n) => n.nodeType === 8 && n.textContent === 'vsk-hold' && n.nextElementSibling === el);
|
|
138
|
+
if (heldMarker) {
|
|
139
|
+
heldMarker.textContent = 'vsk';
|
|
140
|
+
toHydrate.push(heldMarker);
|
|
141
|
+
}
|
|
142
|
+
observer.unobserve(el);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (toHydrate.length > 0) {
|
|
146
|
+
const w = createHydrateWalker(container, toHydrate);
|
|
147
|
+
componentFn(props || {}, new Map(), w);
|
|
148
|
+
}
|
|
149
|
+
if (observer._observed === 0) {
|
|
150
|
+
observer.disconnect();
|
|
151
|
+
resolve();
|
|
152
|
+
}
|
|
153
|
+
}, { rootMargin: `${rootMargin}px` });
|
|
154
|
+
observer._observed = deferredMarkers.length;
|
|
155
|
+
for (const marker of deferredMarkers) {
|
|
156
|
+
const el = marker.nextElementSibling;
|
|
157
|
+
if (el)
|
|
158
|
+
observer.observe(el);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
return Promise.resolve();
|
|
163
|
+
}
|
|
164
|
+
export function hydrateIdle(container, componentFn, props, options = {}) {
|
|
165
|
+
const allMarkers = collectVskMarkers(container);
|
|
166
|
+
const chunkSize = options.chunkSize || 10;
|
|
167
|
+
const timeout = options.timeout || 3000;
|
|
168
|
+
let idx = 0;
|
|
169
|
+
const rIC = window.requestIdleCallback || ((cb) => setTimeout(cb, 50));
|
|
170
|
+
const cIC = window.cancelIdleCallback || clearTimeout;
|
|
171
|
+
let rafId = null;
|
|
172
|
+
let cancelled = false;
|
|
173
|
+
function processChunk(deadline) {
|
|
174
|
+
if (cancelled)
|
|
175
|
+
return;
|
|
176
|
+
const end = Math.min(idx + chunkSize, allMarkers.length);
|
|
177
|
+
const chunk = allMarkers.slice(idx, end);
|
|
178
|
+
idx = end;
|
|
179
|
+
if (chunk.length > 0) {
|
|
180
|
+
const walker = createHydrateWalker(container, chunk);
|
|
181
|
+
componentFn(props || {}, new Map(), walker);
|
|
182
|
+
}
|
|
183
|
+
if (idx < allMarkers.length && (!deadline || deadline.timeRemaining() > 0 || deadline.didTimeout)) {
|
|
184
|
+
rafId = rIC(processChunk, { timeout });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
rafId = rIC(processChunk, { timeout });
|
|
188
|
+
return {
|
|
189
|
+
cancel() {
|
|
190
|
+
cancelled = true;
|
|
191
|
+
if (rafId !== null) {
|
|
192
|
+
cIC(rafId);
|
|
193
|
+
rafId = null;
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
export function needsHydration(container) {
|
|
199
|
+
const walker = document.createTreeWalker(container, _SHOW_COMMENT, {
|
|
200
|
+
acceptNode: (node) => (node.textContent === 'vsk' ? _FILTER_ACCEPT : _FILTER_SKIP),
|
|
201
|
+
});
|
|
202
|
+
return walker.nextNode() !== null;
|
|
203
|
+
}
|
|
204
|
+
export function hydrateOnInteraction(container, componentFn, props, options = {}) {
|
|
205
|
+
const events = options.events || ['click', 'touchstart', 'focus', 'mouseenter'];
|
|
206
|
+
let hydrated = false;
|
|
207
|
+
function trigger(_eventType) {
|
|
208
|
+
if (hydrated)
|
|
209
|
+
return;
|
|
210
|
+
hydrated = true;
|
|
211
|
+
for (const ev of events) {
|
|
212
|
+
container.removeEventListener(ev, handler);
|
|
213
|
+
}
|
|
214
|
+
const markers = collectVskMarkers(container);
|
|
215
|
+
if (markers.length > 0) {
|
|
216
|
+
const walker = createHydrateWalker(container, markers);
|
|
217
|
+
componentFn(props || {}, new Map(), walker);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const handler = (e) => trigger(e.type);
|
|
221
|
+
for (const ev of events) {
|
|
222
|
+
container.addEventListener(ev, handler, { once: true });
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
cancel() { hydrated = true; for (const ev of events)
|
|
226
|
+
container.removeEventListener(ev, handler); },
|
|
227
|
+
hydrateNow() { trigger('manual'); },
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
export function hydrationCount(container) {
|
|
231
|
+
let count = 0;
|
|
232
|
+
const walker = document.createTreeWalker(container, _SHOW_COMMENT, {
|
|
233
|
+
acceptNode: (node) => {
|
|
234
|
+
if (node.textContent === 'vsk') {
|
|
235
|
+
count++;
|
|
236
|
+
return _FILTER_ACCEPT;
|
|
237
|
+
}
|
|
238
|
+
return _FILTER_SKIP;
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
while (walker.nextNode())
|
|
242
|
+
;
|
|
243
|
+
return count;
|
|
244
|
+
}
|
|
245
|
+
export function hydrateInitial(container, componentFn, props) {
|
|
246
|
+
const walker = createHydrateWalker(container);
|
|
247
|
+
componentFn(props || {}, new Map(), walker);
|
|
248
|
+
}
|
package/dist/image.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface ImageProps {
|
|
2
|
+
src: string;
|
|
3
|
+
alt?: string;
|
|
4
|
+
width?: number | string;
|
|
5
|
+
height?: number | string;
|
|
6
|
+
priority?: boolean;
|
|
7
|
+
loading?: 'lazy' | 'eager';
|
|
8
|
+
decoding?: 'sync' | 'async';
|
|
9
|
+
fetchpriority?: 'high' | 'low' | 'auto';
|
|
10
|
+
sizes?: string;
|
|
11
|
+
widths?: number[];
|
|
12
|
+
class?: string;
|
|
13
|
+
style?: string;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
[k: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export declare function Image(props: ImageProps): Node | string;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAAA,UAAU,UAAU;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrB;AASD,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CA0DtD"}
|
package/dist/image.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
function generateSrcset(src, widths) {
|
|
2
|
+
if (!src || widths.length === 0)
|
|
3
|
+
return '';
|
|
4
|
+
const ext = src.lastIndexOf('.') > src.lastIndexOf('/') ? src.slice(src.lastIndexOf('.')) : '';
|
|
5
|
+
const base = ext ? src.slice(0, -ext.length) : src;
|
|
6
|
+
return widths.map(w => `${base}-${w}w${ext} ${w}w`).join(', ');
|
|
7
|
+
}
|
|
8
|
+
export function Image(props) {
|
|
9
|
+
const { src, alt = '', width, height, priority = false, loading = priority ? 'eager' : 'lazy', decoding = priority ? 'sync' : 'async', fetchpriority = priority ? 'high' : 'auto', sizes = '100vw', widths = [640, 768, 1024, 1280, 1536], class: className = '', style = '', placeholder, ...rest } = props;
|
|
10
|
+
const srcset = generateSrcset(src, widths);
|
|
11
|
+
const attrs = {
|
|
12
|
+
src,
|
|
13
|
+
alt,
|
|
14
|
+
loading,
|
|
15
|
+
decoding,
|
|
16
|
+
fetchpriority,
|
|
17
|
+
sizes,
|
|
18
|
+
width: width ? String(width) : undefined,
|
|
19
|
+
height: height ? String(height) : undefined,
|
|
20
|
+
class: className || undefined,
|
|
21
|
+
style: style || undefined,
|
|
22
|
+
...rest,
|
|
23
|
+
};
|
|
24
|
+
if (srcset)
|
|
25
|
+
attrs.srcset = srcset;
|
|
26
|
+
if (typeof document === 'undefined') {
|
|
27
|
+
const attrStr = Object.entries(attrs)
|
|
28
|
+
.filter(([, v]) => v != null && v !== false)
|
|
29
|
+
.map(([k, v]) => v === true ? k : `${k}="${String(v).replace(/"/g, '"')}"`)
|
|
30
|
+
.join(' ');
|
|
31
|
+
const phStyle = placeholder ? `background:${placeholder};background-size:cover;` : '';
|
|
32
|
+
const wrapperStyle = width && height ? `display:inline-block;width:${typeof width === 'number' ? width + 'px' : width};height:${typeof height === 'number' ? height + 'px' : height};overflow:hidden;${phStyle}` : phStyle;
|
|
33
|
+
return `<span style="${wrapperStyle}"><img ${attrStr} /></span>`;
|
|
34
|
+
}
|
|
35
|
+
const el = document.createElement('span');
|
|
36
|
+
const img = document.createElement('img');
|
|
37
|
+
for (const [k, v] of Object.entries(attrs)) {
|
|
38
|
+
if (v != null && v !== false)
|
|
39
|
+
img.setAttribute(k, v === true ? '' : String(v));
|
|
40
|
+
}
|
|
41
|
+
if (placeholder)
|
|
42
|
+
el.style.background = placeholder;
|
|
43
|
+
if (width && height) {
|
|
44
|
+
el.style.display = 'inline-block';
|
|
45
|
+
el.style.width = typeof width === 'number' ? width + 'px' : width;
|
|
46
|
+
el.style.height = typeof height === 'number' ? height + 'px' : height;
|
|
47
|
+
el.style.overflow = 'hidden';
|
|
48
|
+
}
|
|
49
|
+
el.appendChild(img);
|
|
50
|
+
return el;
|
|
51
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { track, get, set, untrack, peek_tracked as peek, derived, flush_sync as flushSync, tick, schedule_update, queue_microtask, active_block, set_active_block, set_active_component, is_mutating_allowed, tracking, teardown, run_block, run_teardown, create_component_ctx, push_component, pop_component, with_block, with_scope, scope, safe_scope, set_tracking, set_active_reaction, is_block_dirty, destroy_non_branch_children, disable_scoped_flush, on_destroy } from '@vesk/runtime/src/ripple-runtime';
|
|
2
|
+
export { effect, user_effect, block, branch, root, render, pre_effect, destroy_block, destroy_block_children, pause_block, resume_block, is_destroyed, unlink_block, create_try_block, boundary_fn_running_block } from '@vesk/runtime/src/ripple-blocks';
|
|
3
|
+
export { hydrate, hydrateViewport, hydrateIdle, hydrateOnInteraction, needsHydration, hydrationCount, createHydrateWalker, collectVskMarkers, reactiveProps, hydrateInitial } from '@vesk/runtime/src/hydrate';
|
|
4
|
+
export { createRouter, createFileRouter, Outlet, Link, NavLink, useNavigate, useParams, usePathname, useSearchParams, useRouter, buildRouteTree, defineRoute, Redirect, redirect, permanentRedirect, notFound, NotFoundError, ensureChunk, matchRoute } from '@vesk/runtime/src/router';
|
|
5
|
+
export { bindValue, bindChecked, bindGroup } from '@vesk/runtime/src/bindings';
|
|
6
|
+
export { createContext, Context, getActiveComponent, setActiveComponent } from '@vesk/runtime/src/context';
|
|
7
|
+
export { createResource, setSsrData, clearSsrData, resolveSsrResources, useFetch } from '@vesk/runtime/src/resource';
|
|
8
|
+
export { Portal } from '@vesk/runtime/src/portal';
|
|
9
|
+
export { reconcile } from '@vesk/runtime/src/reconcile';
|
|
10
|
+
export { JsonLd, ArticleSchema, ProductSchema, FAQPageSchema, BreadcrumbListSchema, OrganizationSchema, LocalBusinessSchema, VideoSchema } from '@vesk/runtime/src/seo';
|
|
11
|
+
export { Image } from '@vesk/runtime/src/image';
|
|
12
|
+
export { Experiment } from '@vesk/runtime/src/experiment';
|
|
13
|
+
export { Form, Field, required, email, minLength, maxLength, pattern, custom } from '@vesk/runtime/src/form';
|
|
14
|
+
export { Md } from '@vesk/runtime/src/md';
|
|
15
|
+
export { defineAction, getAction, clearActions, validateActionInput, issuesToFieldMap, isFormAction } from '@vesk/runtime/src/action';
|
|
16
|
+
//# sourceMappingURL=index-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-client.d.ts","sourceRoot":"","sources":["../src/index-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,IAAI,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACtf,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,sBAAsB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC1P,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC/M,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACxR,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC3G,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACrH,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACxK,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC7G,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { track, get, set, untrack, peek_tracked as peek, derived, flush_sync as flushSync, tick, schedule_update, queue_microtask, active_block, set_active_block, set_active_component, is_mutating_allowed, tracking, teardown, run_block, run_teardown, create_component_ctx, push_component, pop_component, with_block, with_scope, scope, safe_scope, set_tracking, set_active_reaction, is_block_dirty, destroy_non_branch_children, disable_scoped_flush, on_destroy } from '@vesk/runtime/src/ripple-runtime';
|
|
2
|
+
export { effect, user_effect, block, branch, root, render, pre_effect, destroy_block, destroy_block_children, pause_block, resume_block, is_destroyed, unlink_block, create_try_block, boundary_fn_running_block } from '@vesk/runtime/src/ripple-blocks';
|
|
3
|
+
export { hydrate, hydrateViewport, hydrateIdle, hydrateOnInteraction, needsHydration, hydrationCount, createHydrateWalker, collectVskMarkers, reactiveProps, hydrateInitial } from '@vesk/runtime/src/hydrate';
|
|
4
|
+
export { createRouter, createFileRouter, Outlet, Link, NavLink, useNavigate, useParams, usePathname, useSearchParams, useRouter, buildRouteTree, defineRoute, Redirect, redirect, permanentRedirect, notFound, NotFoundError, ensureChunk, matchRoute } from '@vesk/runtime/src/router';
|
|
5
|
+
export { bindValue, bindChecked, bindGroup } from '@vesk/runtime/src/bindings';
|
|
6
|
+
export { createContext, Context, getActiveComponent, setActiveComponent } from '@vesk/runtime/src/context';
|
|
7
|
+
export { createResource, setSsrData, clearSsrData, resolveSsrResources, useFetch } from '@vesk/runtime/src/resource';
|
|
8
|
+
export { Portal } from '@vesk/runtime/src/portal';
|
|
9
|
+
export { reconcile } from '@vesk/runtime/src/reconcile';
|
|
10
|
+
export { JsonLd, ArticleSchema, ProductSchema, FAQPageSchema, BreadcrumbListSchema, OrganizationSchema, LocalBusinessSchema, VideoSchema } from '@vesk/runtime/src/seo';
|
|
11
|
+
export { Image } from '@vesk/runtime/src/image';
|
|
12
|
+
export { Experiment } from '@vesk/runtime/src/experiment';
|
|
13
|
+
export { Form, Field, required, email, minLength, maxLength, pattern, custom } from '@vesk/runtime/src/form';
|
|
14
|
+
export { Md } from '@vesk/runtime/src/md';
|
|
15
|
+
export { defineAction, getAction, clearActions, validateActionInput, issuesToFieldMap, isFormAction } from '@vesk/runtime/src/action';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { track, get, set, untrack, peek_tracked as peek, derived, flush_sync as flushSync, tick, active_block, set_active_block, set_active_component, create_component_ctx, push_component, pop_component, with_block, with_scope, scope, safe_scope, on_destroy } from '@vesk/runtime/src/ripple-runtime';
|
|
2
|
+
export { effect, user_effect, block, branch, root, render, pre_effect, destroy_block, destroy_block_children, pause_block, resume_block, is_destroyed, unlink_block, create_try_block, boundary_fn_running_block } from '@vesk/runtime/src/ripple-blocks';
|
|
3
|
+
export { createContext, Context, getActiveComponent, setActiveComponent } from '@vesk/runtime/src/context';
|
|
4
|
+
export { createResource, setSsrData, clearSsrData, setSsrSink, resolveSsrResources, useFetch, type SsrDataSink } from '@vesk/runtime/src/resource';
|
|
5
|
+
export { Portal } from '@vesk/runtime/src/portal';
|
|
6
|
+
export { createRouter, createFileRouter, Outlet, Link, NavLink, useNavigate, useParams as routerParams, usePathname, useSearchParams, useRouter, buildRouteTree, defineRoute, Redirect, redirect, permanentRedirect, notFound, NotFoundError } from '@vesk/runtime/src/router';
|
|
7
|
+
export { cookies, headers, locals, ServerResponse, ServerRequest, VeskRequest, VeskResponse, withValidation, useBody, useParams, useRequest, cors, defineHook, removeHook, runHooks, webhook, signCookie, unsignCookie, setSignedCookie, readSignedCookie, applyRequestSecurity } from '@vesk/runtime/src/request';
|
|
8
|
+
export { isr, revalidatePath, revalidateTag, clearIsrCache, pageIsr, componentIsr, revalidateComponent, isrConfigToRevalidate } from '@vesk/runtime/src/isr';
|
|
9
|
+
export { JsonLd, ArticleSchema, ProductSchema, FAQPageSchema, BreadcrumbListSchema, OrganizationSchema, LocalBusinessSchema, VideoSchema } from '@vesk/runtime/src/seo';
|
|
10
|
+
export { Image } from '@vesk/runtime/src/image';
|
|
11
|
+
export { Experiment } from '@vesk/runtime/src/experiment';
|
|
12
|
+
export { Form, Field, required, email, minLength, maxLength, pattern, custom } from '@vesk/runtime/src/form';
|
|
13
|
+
export { Md } from '@vesk/runtime/src/md';
|
|
14
|
+
export { defineAction, getAction, clearActions, validateActionInput, issuesToFieldMap, isFormAction } from '@vesk/runtime/src/action';
|
|
15
|
+
//# sourceMappingURL=index-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-server.d.ts","sourceRoot":"","sources":["../src/index-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,IAAI,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC5S,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,sBAAsB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC1P,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC3G,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACnJ,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,IAAI,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC/Q,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACnT,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC7J,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACxK,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC7G,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { track, get, set, untrack, peek_tracked as peek, derived, flush_sync as flushSync, tick, active_block, set_active_block, set_active_component, create_component_ctx, push_component, pop_component, with_block, with_scope, scope, safe_scope, on_destroy } from '@vesk/runtime/src/ripple-runtime';
|
|
2
|
+
export { effect, user_effect, block, branch, root, render, pre_effect, destroy_block, destroy_block_children, pause_block, resume_block, is_destroyed, unlink_block, create_try_block, boundary_fn_running_block } from '@vesk/runtime/src/ripple-blocks';
|
|
3
|
+
export { createContext, Context, getActiveComponent, setActiveComponent } from '@vesk/runtime/src/context';
|
|
4
|
+
export { createResource, setSsrData, clearSsrData, setSsrSink, resolveSsrResources, useFetch } from '@vesk/runtime/src/resource';
|
|
5
|
+
export { Portal } from '@vesk/runtime/src/portal';
|
|
6
|
+
export { createRouter, createFileRouter, Outlet, Link, NavLink, useNavigate, useParams as routerParams, usePathname, useSearchParams, useRouter, buildRouteTree, defineRoute, Redirect, redirect, permanentRedirect, notFound, NotFoundError } from '@vesk/runtime/src/router';
|
|
7
|
+
export { cookies, headers, locals, ServerResponse, ServerRequest, VeskRequest, VeskResponse, withValidation, useBody, useParams, useRequest, cors, defineHook, removeHook, runHooks, webhook, signCookie, unsignCookie, setSignedCookie, readSignedCookie, applyRequestSecurity } from '@vesk/runtime/src/request';
|
|
8
|
+
export { isr, revalidatePath, revalidateTag, clearIsrCache, pageIsr, componentIsr, revalidateComponent, isrConfigToRevalidate } from '@vesk/runtime/src/isr';
|
|
9
|
+
export { JsonLd, ArticleSchema, ProductSchema, FAQPageSchema, BreadcrumbListSchema, OrganizationSchema, LocalBusinessSchema, VideoSchema } from '@vesk/runtime/src/seo';
|
|
10
|
+
export { Image } from '@vesk/runtime/src/image';
|
|
11
|
+
export { Experiment } from '@vesk/runtime/src/experiment';
|
|
12
|
+
export { Form, Field, required, email, minLength, maxLength, pattern, custom } from '@vesk/runtime/src/form';
|
|
13
|
+
export { Md } from '@vesk/runtime/src/md';
|
|
14
|
+
export { defineAction, getAction, clearActions, validateActionInput, issuesToFieldMap, isFormAction } from '@vesk/runtime/src/action';
|
package/dist/isr.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface IsrResult {
|
|
2
|
+
data: unknown;
|
|
3
|
+
stale: boolean;
|
|
4
|
+
}
|
|
5
|
+
interface IsrOptions {
|
|
6
|
+
tags?: string[];
|
|
7
|
+
revalidate?: number;
|
|
8
|
+
}
|
|
9
|
+
interface PageIsrResult {
|
|
10
|
+
html: string;
|
|
11
|
+
headers: Record<string, string>;
|
|
12
|
+
stale: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface PageRenderResult {
|
|
15
|
+
html: string;
|
|
16
|
+
headers?: Record<string, string>;
|
|
17
|
+
}
|
|
18
|
+
export declare function isr(key: string, fetcher: () => Promise<unknown>, opts?: IsrOptions): Promise<IsrResult>;
|
|
19
|
+
export declare function revalidatePath(path: string): Promise<void>;
|
|
20
|
+
export declare function revalidateTag(tag: string): Promise<void>;
|
|
21
|
+
export declare function clearIsrCache(): void;
|
|
22
|
+
export declare function revalidateComponent(key: string): void;
|
|
23
|
+
export declare function pageIsr(path: string, renderFn: () => Promise<PageRenderResult>, opts?: IsrOptions): Promise<PageIsrResult>;
|
|
24
|
+
export declare function componentIsr(key: string, renderFn: () => string | Promise<string>, opts?: IsrOptions): Promise<string>;
|
|
25
|
+
export declare function isrConfigToRevalidate(config: unknown): number;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=isr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isr.d.ts","sourceRoot":"","sources":["../src/isr.ts"],"names":[],"mappings":"AAMA,UAAU,SAAS;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CACf;AAED,UAAU,UAAU;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,UAAU,aAAa;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC;CACf;AAED,UAAU,gBAAgB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAKD,wBAAsB,GAAG,CACxB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC/B,IAAI,GAAE,UAAe,GACnB,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAoBD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9D;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErD;AAID,wBAAsB,OAAO,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,EACzC,IAAI,GAAE,UAAe,GACnB,OAAO,CAAC,aAAa,CAAC,CAwBxB;AA2BD,wBAAsB,YAAY,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,EACxC,IAAI,GAAE,UAAe,GACnB,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAQD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAK7D"}
|
package/dist/isr.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
const cache = new Map();
|
|
2
|
+
const tagIndex = new Map();
|
|
3
|
+
export async function isr(key, fetcher, opts = {}) {
|
|
4
|
+
const { tags = [], revalidate = 0 } = opts;
|
|
5
|
+
if (revalidate <= 0) {
|
|
6
|
+
return { data: await fetcher(), stale: false };
|
|
7
|
+
}
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
const entry = cache.get(key);
|
|
10
|
+
if (entry && entry.expiresAt > now) {
|
|
11
|
+
return { data: entry.data, stale: false };
|
|
12
|
+
}
|
|
13
|
+
if (entry && entry.expiresAt <= now) {
|
|
14
|
+
revalidateEntry(key, fetcher, tags, revalidate);
|
|
15
|
+
return { data: entry.data, stale: true };
|
|
16
|
+
}
|
|
17
|
+
const data = await fetcher();
|
|
18
|
+
setCacheEntry(key, data, tags, revalidate);
|
|
19
|
+
return { data, stale: false };
|
|
20
|
+
}
|
|
21
|
+
function setCacheEntry(key, data, tags, revalidate) {
|
|
22
|
+
const entry = { data, expiresAt: Date.now() + revalidate * 1000, tags };
|
|
23
|
+
cache.set(key, entry);
|
|
24
|
+
for (const tag of tags) {
|
|
25
|
+
if (!tagIndex.has(tag))
|
|
26
|
+
tagIndex.set(tag, new Set());
|
|
27
|
+
tagIndex.get(tag).add(key);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function revalidateEntry(key, fetcher, tags, revalidate) {
|
|
31
|
+
try {
|
|
32
|
+
const data = await fetcher();
|
|
33
|
+
setCacheEntry(key, data, tags, revalidate);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Revalidation failed — stale entry remains
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function revalidatePath(path) {
|
|
40
|
+
const normalized = path.replace(/\/+$/, '') || '/';
|
|
41
|
+
if (cache.has(normalized)) {
|
|
42
|
+
cache.delete(normalized);
|
|
43
|
+
}
|
|
44
|
+
for (const key of cache.keys()) {
|
|
45
|
+
if (key.startsWith(normalized)) {
|
|
46
|
+
cache.delete(key);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function revalidateTag(tag) {
|
|
51
|
+
const keys = tagIndex.get(tag);
|
|
52
|
+
if (!keys)
|
|
53
|
+
return;
|
|
54
|
+
for (const key of keys) {
|
|
55
|
+
cache.delete(key);
|
|
56
|
+
}
|
|
57
|
+
tagIndex.delete(tag);
|
|
58
|
+
}
|
|
59
|
+
export function clearIsrCache() {
|
|
60
|
+
cache.clear();
|
|
61
|
+
tagIndex.clear();
|
|
62
|
+
pageCache.clear();
|
|
63
|
+
componentCache.clear();
|
|
64
|
+
}
|
|
65
|
+
export function revalidateComponent(key) {
|
|
66
|
+
componentCache.delete(key);
|
|
67
|
+
}
|
|
68
|
+
const pageCache = new Map();
|
|
69
|
+
export async function pageIsr(path, renderFn, opts = {}) {
|
|
70
|
+
const { tags = [], revalidate = 0 } = opts;
|
|
71
|
+
const key = path.replace(/\/+$/, '') || '/';
|
|
72
|
+
if (revalidate <= 0) {
|
|
73
|
+
const result = await renderFn();
|
|
74
|
+
return { html: result.html, headers: result.headers || {}, stale: false };
|
|
75
|
+
}
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
const entry = pageCache.get(key);
|
|
78
|
+
if (entry && entry.expiresAt > now) {
|
|
79
|
+
return { html: entry.html, headers: entry.headers, stale: false };
|
|
80
|
+
}
|
|
81
|
+
if (entry && entry.expiresAt <= now) {
|
|
82
|
+
revalidatePage(key, renderFn, tags, revalidate);
|
|
83
|
+
return { html: entry.html, headers: entry.headers, stale: true };
|
|
84
|
+
}
|
|
85
|
+
const result = await renderFn();
|
|
86
|
+
setPageCache(key, result.html, result.headers || {}, tags, revalidate);
|
|
87
|
+
return { html: result.html, headers: result.headers || {}, stale: false };
|
|
88
|
+
}
|
|
89
|
+
function setPageCache(key, html, headers, tags, revalidate) {
|
|
90
|
+
pageCache.set(key, { html, headers, expiresAt: Date.now() + revalidate * 1000, tags });
|
|
91
|
+
for (const tag of tags) {
|
|
92
|
+
if (!tagIndex.has(tag))
|
|
93
|
+
tagIndex.set(tag, new Set());
|
|
94
|
+
tagIndex.get(tag).add(key);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function revalidatePage(key, renderFn, tags, revalidate) {
|
|
98
|
+
try {
|
|
99
|
+
const result = await renderFn();
|
|
100
|
+
setPageCache(key, result.html, result.headers || {}, tags, revalidate);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Revalidation failed — stale entry remains
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const componentCache = new Map();
|
|
107
|
+
export async function componentIsr(key, renderFn, opts = {}) {
|
|
108
|
+
const { tags = [], revalidate = 0 } = opts;
|
|
109
|
+
if (revalidate <= 0) {
|
|
110
|
+
return await renderFn();
|
|
111
|
+
}
|
|
112
|
+
const now = Date.now();
|
|
113
|
+
const entry = componentCache.get(key);
|
|
114
|
+
if (entry && entry.expiresAt > now) {
|
|
115
|
+
return entry.html;
|
|
116
|
+
}
|
|
117
|
+
if (entry && entry.expiresAt <= now) {
|
|
118
|
+
revalidateComponentEntry(key, renderFn, tags, revalidate);
|
|
119
|
+
return entry.html;
|
|
120
|
+
}
|
|
121
|
+
const html = await renderFn();
|
|
122
|
+
componentCache.set(key, { html, expiresAt: now + revalidate * 1000, tags });
|
|
123
|
+
for (const tag of tags) {
|
|
124
|
+
if (!tagIndex.has(tag))
|
|
125
|
+
tagIndex.set(tag, new Set());
|
|
126
|
+
tagIndex.get(tag).add(`comp:${key}`);
|
|
127
|
+
}
|
|
128
|
+
return html;
|
|
129
|
+
}
|
|
130
|
+
function revalidateComponentEntry(key, renderFn, tags, revalidate) {
|
|
131
|
+
Promise.resolve(renderFn()).then(html => {
|
|
132
|
+
componentCache.set(key, { html, expiresAt: Date.now() + revalidate * 1000, tags });
|
|
133
|
+
}).catch(() => { });
|
|
134
|
+
}
|
|
135
|
+
export function isrConfigToRevalidate(config) {
|
|
136
|
+
if (!config)
|
|
137
|
+
return 0;
|
|
138
|
+
if (typeof config === 'number')
|
|
139
|
+
return config;
|
|
140
|
+
if (config.revalidate)
|
|
141
|
+
return config.revalidate;
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
package/dist/md.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HydrateWalker } from '@vesk/runtime/src/hydrate';
|
|
2
|
+
export declare function escapeHtml(s: string): string;
|
|
3
|
+
export declare function renderMarkdown(md: string): string;
|
|
4
|
+
export interface MdProps {
|
|
5
|
+
content?: string;
|
|
6
|
+
class?: string;
|
|
7
|
+
className?: string;
|
|
8
|
+
style?: string;
|
|
9
|
+
[k: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Renders markdown as HTML. On the server it returns an HTML string; on the
|
|
13
|
+
* client it claims the SSR-rendered subtree during hydration (or builds a
|
|
14
|
+
* fresh wrapper element for SPA navigation).
|
|
15
|
+
*/
|
|
16
|
+
export declare function Md(props: MdProps, _registry?: Map<string, unknown>, hydrate?: HydrateWalker): Node | string;
|
|
17
|
+
//# sourceMappingURL=md.d.ts.map
|
package/dist/md.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md.d.ts","sourceRoot":"","sources":["../src/md.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAU/D,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAW5C;AA2cD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,MAAM,WAAW,OAAO;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrB;AAMD;;;;GAIG;AACH,wBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CA6B3G"}
|