@absolutejs/absolute 0.19.0-beta.807 → 0.19.0-beta.809
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/dist/angular/browser.js +9801 -57
- package/dist/angular/browser.js.map +246 -4
- package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/angular/index.js +14877 -60
- package/dist/angular/index.js.map +281 -4
- package/dist/angular/server.js +5610 -45
- package/dist/angular/server.js.map +51 -3
- package/dist/build.js +18092 -45
- package/dist/build.js.map +99 -3
- package/dist/cli/index.js +317 -86
- package/dist/client/index.js +1091 -70
- package/dist/client/index.js.map +24 -4
- package/dist/core/streamingSlotRegistrar.js +108 -11
- package/dist/core/streamingSlotRegistrar.js.map +4 -3
- package/dist/core/streamingSlotRegistry.js +169 -7
- package/dist/core/streamingSlotRegistry.js.map +5 -3
- package/dist/index.js +19957 -547
- package/dist/index.js.map +116 -3
- package/dist/islands/browser.js +228 -9
- package/dist/islands/browser.js.map +9 -4
- package/dist/islands/index.js +1908 -17
- package/dist/islands/index.js.map +27 -3
- package/dist/react/browser.js +328 -12
- package/dist/react/browser.js.map +12 -4
- package/dist/react/components/index.js +167 -16
- package/dist/react/components/index.js.map +6 -3
- package/dist/react/hooks/index.js +183 -8
- package/dist/react/hooks/index.js.map +7 -3
- package/dist/react/index.js +3627 -36
- package/dist/react/index.js.map +45 -4
- package/dist/react/jsxDevRuntimeCompat.js +61 -2
- package/dist/react/jsxDevRuntimeCompat.js.map +2 -2
- package/dist/react/server.js +1789 -18
- package/dist/react/server.js.map +21 -3
- package/dist/src/angular/injectorPatch.d.ts +1 -0
- package/dist/src/angular/islands.d.ts +1 -0
- package/dist/src/client/hydrators/react.d.ts +3 -0
- package/dist/src/client/hydrators/svelte.d.ts +2 -0
- package/dist/src/client/hydrators/vue.d.ts +2 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/svelte/browser.js +247 -12
- package/dist/svelte/browser.js.map +10 -3
- package/dist/svelte/index.js +3732 -37
- package/dist/svelte/index.js.map +47 -4
- package/dist/svelte/server.js +2794 -21
- package/dist/svelte/server.js.map +27 -3
- package/dist/vue/browser.js +348 -12
- package/dist/vue/browser.js.map +12 -4
- package/dist/vue/components/Image.js +240 -7
- package/dist/vue/components/Image.js.map +6 -3
- package/dist/vue/components/index.js +544 -11
- package/dist/vue/components/index.js.map +9 -3
- package/dist/vue/index.js +4212 -52
- package/dist/vue/index.js.map +50 -4
- package/dist/vue/server.js +1849 -18
- package/dist/vue/server.js.map +21 -3
- package/package.json +1 -1
- package/dist/chunk-0867j0r0.js +0 -136
- package/dist/chunk-0867j0r0.js.map +0 -10
- package/dist/chunk-102fp7xe.js +0 -63
- package/dist/chunk-102fp7xe.js.map +0 -10
- package/dist/chunk-11zpfqz6.js +0 -19
- package/dist/chunk-11zpfqz6.js.map +0 -10
- package/dist/chunk-1rfh7hw9.js +0 -319
- package/dist/chunk-1rfh7hw9.js.map +0 -11
- package/dist/chunk-1x4fxm57.js +0 -51
- package/dist/chunk-1x4fxm57.js.map +0 -9
- package/dist/chunk-25v9t56f.js +0 -29
- package/dist/chunk-25v9t56f.js.map +0 -11
- package/dist/chunk-2f21eenc.js +0 -21
- package/dist/chunk-2f21eenc.js.map +0 -10
- package/dist/chunk-2ga2znex.js +0 -13
- package/dist/chunk-2ga2znex.js.map +0 -9
- package/dist/chunk-30yrw0f6.js +0 -33
- package/dist/chunk-30yrw0f6.js.map +0 -10
- package/dist/chunk-3g91wb4f.js +0 -358
- package/dist/chunk-3g91wb4f.js.map +0 -10
- package/dist/chunk-3rea1gam.js +0 -4403
- package/dist/chunk-3rea1gam.js.map +0 -28
- package/dist/chunk-3yjzpcne.js +0 -34
- package/dist/chunk-3yjzpcne.js.map +0 -10
- package/dist/chunk-41bf6aqt.js +0 -17
- package/dist/chunk-41bf6aqt.js.map +0 -9
- package/dist/chunk-4d39r92n.js +0 -81
- package/dist/chunk-4d39r92n.js.map +0 -10
- package/dist/chunk-5003emhv.js +0 -17
- package/dist/chunk-5003emhv.js.map +0 -10
- package/dist/chunk-5f67rsed.js +0 -466
- package/dist/chunk-5f67rsed.js.map +0 -10
- package/dist/chunk-5fhp1jap.js +0 -9169
- package/dist/chunk-5fhp1jap.js.map +0 -236
- package/dist/chunk-629x0yh4.js +0 -20
- package/dist/chunk-629x0yh4.js.map +0 -9
- package/dist/chunk-6pdj08z3.js +0 -73
- package/dist/chunk-6pdj08z3.js.map +0 -12
- package/dist/chunk-6qjbrt0k.js +0 -13
- package/dist/chunk-6qjbrt0k.js.map +0 -9
- package/dist/chunk-6sccb4jr.js +0 -14
- package/dist/chunk-6sccb4jr.js.map +0 -9
- package/dist/chunk-798spvzv.js +0 -50
- package/dist/chunk-798spvzv.js.map +0 -10
- package/dist/chunk-7fw6x3js.js +0 -131
- package/dist/chunk-7fw6x3js.js.map +0 -11
- package/dist/chunk-7kjj42xm.js +0 -11
- package/dist/chunk-7kjj42xm.js.map +0 -10
- package/dist/chunk-7mtstdqn.js +0 -90
- package/dist/chunk-7mtstdqn.js.map +0 -10
- package/dist/chunk-851whwc7.js +0 -17
- package/dist/chunk-851whwc7.js.map +0 -10
- package/dist/chunk-85n68sy6.js +0 -103
- package/dist/chunk-85n68sy6.js.map +0 -10
- package/dist/chunk-8kcfffry.js +0 -35
- package/dist/chunk-8kcfffry.js.map +0 -10
- package/dist/chunk-92fsjfpp.js +0 -1731
- package/dist/chunk-92fsjfpp.js.map +0 -11
- package/dist/chunk-93sqk7be.js +0 -139
- package/dist/chunk-93sqk7be.js.map +0 -12
- package/dist/chunk-9c5tj4k3.js +0 -130
- package/dist/chunk-9c5tj4k3.js.map +0 -10
- package/dist/chunk-9j59emg3.js +0 -184
- package/dist/chunk-9j59emg3.js.map +0 -11
- package/dist/chunk-9ve9jq72.js +0 -203
- package/dist/chunk-9ve9jq72.js.map +0 -10
- package/dist/chunk-9xrsjeem.js +0 -12
- package/dist/chunk-9xrsjeem.js.map +0 -9
- package/dist/chunk-a9mvyp04.js +0 -87
- package/dist/chunk-a9mvyp04.js.map +0 -10
- package/dist/chunk-b3gbnrwe.js +0 -21
- package/dist/chunk-b3gbnrwe.js.map +0 -10
- package/dist/chunk-bgb8k1qs.js +0 -672
- package/dist/chunk-bgb8k1qs.js.map +0 -15
- package/dist/chunk-bmgqm774.js +0 -65
- package/dist/chunk-bmgqm774.js.map +0 -9
- package/dist/chunk-bxfghpma.js +0 -69
- package/dist/chunk-bxfghpma.js.map +0 -10
- package/dist/chunk-c1jfjnka.js +0 -74
- package/dist/chunk-c1jfjnka.js.map +0 -10
- package/dist/chunk-cbkrwmvh.js +0 -80
- package/dist/chunk-cbkrwmvh.js.map +0 -10
- package/dist/chunk-cdxd7sy2.js +0 -71
- package/dist/chunk-cdxd7sy2.js.map +0 -10
- package/dist/chunk-cg95827x.js +0 -21
- package/dist/chunk-cg95827x.js.map +0 -10
- package/dist/chunk-cm0g4q6w.js +0 -149
- package/dist/chunk-cm0g4q6w.js.map +0 -10
- package/dist/chunk-d7mwkzry.js +0 -261
- package/dist/chunk-d7mwkzry.js.map +0 -10
- package/dist/chunk-d9c0am65.js +0 -12
- package/dist/chunk-d9c0am65.js.map +0 -10
- package/dist/chunk-daqghmg8.js +0 -12
- package/dist/chunk-daqghmg8.js.map +0 -9
- package/dist/chunk-e3r9fxaa.js +0 -149
- package/dist/chunk-e3r9fxaa.js.map +0 -10
- package/dist/chunk-e8eecyrq.js +0 -244
- package/dist/chunk-e8eecyrq.js.map +0 -10
- package/dist/chunk-ex2hxe0v.js +0 -160
- package/dist/chunk-ex2hxe0v.js.map +0 -11
- package/dist/chunk-fak944et.js +0 -91
- package/dist/chunk-fak944et.js.map +0 -10
- package/dist/chunk-fygx2ymm.js +0 -118
- package/dist/chunk-fygx2ymm.js.map +0 -12
- package/dist/chunk-g15qj669.js +0 -271
- package/dist/chunk-g15qj669.js.map +0 -11
- package/dist/chunk-gd6wmknh.js +0 -121
- package/dist/chunk-gd6wmknh.js.map +0 -11
- package/dist/chunk-gf0ygptk.js +0 -85
- package/dist/chunk-gf0ygptk.js.map +0 -11
- package/dist/chunk-gytkmthr.js +0 -220
- package/dist/chunk-gytkmthr.js.map +0 -10
- package/dist/chunk-h5bbfn3n.js +0 -28
- package/dist/chunk-h5bbfn3n.js.map +0 -11
- package/dist/chunk-h6mye9r3.js +0 -93
- package/dist/chunk-h6mye9r3.js.map +0 -10
- package/dist/chunk-hcsmxw1v.js +0 -85
- package/dist/chunk-hcsmxw1v.js.map +0 -10
- package/dist/chunk-hyjs4bqs.js +0 -8
- package/dist/chunk-hyjs4bqs.js.map +0 -10
- package/dist/chunk-jn91vzkh.js +0 -66
- package/dist/chunk-jn91vzkh.js.map +0 -10
- package/dist/chunk-jpkjdgsk.js +0 -167
- package/dist/chunk-jpkjdgsk.js.map +0 -11
- package/dist/chunk-jwxt8gnp.js +0 -13
- package/dist/chunk-jwxt8gnp.js.map +0 -9
- package/dist/chunk-kk8w9rh5.js +0 -195
- package/dist/chunk-kk8w9rh5.js.map +0 -10
- package/dist/chunk-kwgh8rmg.js +0 -426
- package/dist/chunk-kwgh8rmg.js.map +0 -14
- package/dist/chunk-m97ze5hz.js +0 -46
- package/dist/chunk-m97ze5hz.js.map +0 -10
- package/dist/chunk-mbazhahf.js +0 -60
- package/dist/chunk-mbazhahf.js.map +0 -10
- package/dist/chunk-mgfwq18r.js +0 -15
- package/dist/chunk-mgfwq18r.js.map +0 -9
- package/dist/chunk-mtgf69xn.js +0 -88
- package/dist/chunk-mtgf69xn.js.map +0 -10
- package/dist/chunk-mtxzyxpg.js +0 -102
- package/dist/chunk-mtxzyxpg.js.map +0 -10
- package/dist/chunk-nehhtthw.js +0 -225
- package/dist/chunk-nehhtthw.js.map +0 -10
- package/dist/chunk-p5504p14.js +0 -16
- package/dist/chunk-p5504p14.js.map +0 -10
- package/dist/chunk-p5zgj77m.js +0 -184
- package/dist/chunk-p5zgj77m.js.map +0 -10
- package/dist/chunk-pnscgw95.js +0 -90
- package/dist/chunk-pnscgw95.js.map +0 -10
- package/dist/chunk-pvpp4pvs.js +0 -17
- package/dist/chunk-pvpp4pvs.js.map +0 -10
- package/dist/chunk-qh75agse.js +0 -95
- package/dist/chunk-qh75agse.js.map +0 -10
- package/dist/chunk-qxq2zcty.js +0 -52
- package/dist/chunk-qxq2zcty.js.map +0 -10
- package/dist/chunk-r6e8pytx.js +0 -22
- package/dist/chunk-r6e8pytx.js.map +0 -9
- package/dist/chunk-r7jmgqnw.js +0 -114
- package/dist/chunk-r7jmgqnw.js.map +0 -10
- package/dist/chunk-s6defjk2.js +0 -116
- package/dist/chunk-s6defjk2.js.map +0 -10
- package/dist/chunk-sd39p726.js +0 -619
- package/dist/chunk-sd39p726.js.map +0 -10
- package/dist/chunk-swrnzs4c.js +0 -63
- package/dist/chunk-swrnzs4c.js.map +0 -10
- package/dist/chunk-tfe3sb44.js +0 -33
- package/dist/chunk-tfe3sb44.js.map +0 -10
- package/dist/chunk-tjr0kcev.js +0 -41
- package/dist/chunk-tjr0kcev.js.map +0 -9
- package/dist/chunk-tx9edm1x.js +0 -34
- package/dist/chunk-tx9edm1x.js.map +0 -10
- package/dist/chunk-txhm2vb5.js +0 -18
- package/dist/chunk-txhm2vb5.js.map +0 -9
- package/dist/chunk-v5vmsxmy.js +0 -526
- package/dist/chunk-v5vmsxmy.js.map +0 -12
- package/dist/chunk-vjhxm8n2.js +0 -29
- package/dist/chunk-vjhxm8n2.js.map +0 -9
- package/dist/chunk-vkrpm7kc.js +0 -247
- package/dist/chunk-vkrpm7kc.js.map +0 -12
- package/dist/chunk-w3m4m5we.js +0 -4925
- package/dist/chunk-w3m4m5we.js.map +0 -12
- package/dist/chunk-wrxtn9ve.js +0 -18
- package/dist/chunk-wrxtn9ve.js.map +0 -10
- package/dist/chunk-x09cskqd.js +0 -377
- package/dist/chunk-x09cskqd.js.map +0 -10
- package/dist/chunk-xnt8c6h2.js +0 -576
- package/dist/chunk-xnt8c6h2.js.map +0 -10
- package/dist/chunk-xw0tx842.js +0 -13
- package/dist/chunk-xw0tx842.js.map +0 -9
- package/dist/chunk-xx5b6b9m.js +0 -69
- package/dist/chunk-xx5b6b9m.js.map +0 -10
- package/dist/chunk-xz1kdswj.js +0 -21
- package/dist/chunk-xz1kdswj.js.map +0 -9
- package/dist/chunk-y84qnsd3.js +0 -32
- package/dist/chunk-y84qnsd3.js.map +0 -10
- package/dist/chunk-ywjn0rad.js +0 -14
- package/dist/chunk-ywjn0rad.js.map +0 -9
- package/dist/chunk-z9nvhm6r.js +0 -13
- package/dist/chunk-z9nvhm6r.js.map +0 -9
- package/dist/chunk-zhmvdpk6.js +0 -15
- package/dist/chunk-zhmvdpk6.js.map +0 -9
- package/dist/chunk-zrg9d4zw.js +0 -784
- package/dist/chunk-zrg9d4zw.js.map +0 -10
package/dist/chunk-e3r9fxaa.js
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import {
|
|
3
|
-
captureStreamingSlotWarningCallsite,
|
|
4
|
-
runWithStreamingSlotWarningScope,
|
|
5
|
-
ssrErrorPage
|
|
6
|
-
} from "./chunk-gd6wmknh.js";
|
|
7
|
-
import {
|
|
8
|
-
getCurrentRouteRegistrationCallsite
|
|
9
|
-
} from "./chunk-mtgf69xn.js";
|
|
10
|
-
import {
|
|
11
|
-
derivePageName,
|
|
12
|
-
injectIslandPageContextStream,
|
|
13
|
-
renderConventionError,
|
|
14
|
-
withRegisteredStreamingSlots
|
|
15
|
-
} from "./chunk-v5vmsxmy.js";
|
|
16
|
-
import {
|
|
17
|
-
isSsrCacheDirty
|
|
18
|
-
} from "./chunk-d9c0am65.js";
|
|
19
|
-
import {
|
|
20
|
-
EXCLUDE_LAST_OFFSET
|
|
21
|
-
} from "./chunk-qh75agse.js";
|
|
22
|
-
import {
|
|
23
|
-
__require
|
|
24
|
-
} from "./chunk-bmgqm774.js";
|
|
25
|
-
|
|
26
|
-
// src/vue/pageHandler.ts
|
|
27
|
-
import { readdir } from "fs/promises";
|
|
28
|
-
import { basename, dirname } from "path";
|
|
29
|
-
var isRecord = (value) => typeof value === "object" && value !== null;
|
|
30
|
-
var isGenericVueComponent = (value) => typeof value === "function" || isRecord(value);
|
|
31
|
-
var readHasIslands = (value) => {
|
|
32
|
-
if (!isRecord(value))
|
|
33
|
-
return false;
|
|
34
|
-
const hasIslands = value["__ABSOLUTE_PAGE_HAS_ISLANDS__"];
|
|
35
|
-
return typeof hasIslands === "boolean" ? hasIslands : false;
|
|
36
|
-
};
|
|
37
|
-
var readDefaultExport = (value) => isRecord(value) ? value.default : undefined;
|
|
38
|
-
var resolveCurrentGeneratedVueModulePath = async (pagePath) => {
|
|
39
|
-
const pageDirectory = dirname(pagePath);
|
|
40
|
-
const expectedPrefix = `${basename(pagePath, ".js").split(".")[0]}.`;
|
|
41
|
-
try {
|
|
42
|
-
const pageEntries = await readdir(pageDirectory, {
|
|
43
|
-
withFileTypes: true
|
|
44
|
-
});
|
|
45
|
-
const matchingEntry = pageEntries.find((entry) => entry.isFile() && entry.name.endsWith(".js") && (entry.name === `${expectedPrefix.slice(0, EXCLUDE_LAST_OFFSET)}.js` || entry.name.startsWith(expectedPrefix)));
|
|
46
|
-
if (!matchingEntry) {
|
|
47
|
-
return pagePath;
|
|
48
|
-
}
|
|
49
|
-
return `${pageDirectory}/${matchingEntry.name}`;
|
|
50
|
-
} catch {
|
|
51
|
-
return pagePath;
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
var buildDirtyResponse = (headTag, indexPath, maybeProps) => {
|
|
55
|
-
const propsScript = `window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})};`;
|
|
56
|
-
const dirtyFlag = "window.__SSR_DIRTY__=true;";
|
|
57
|
-
const html = `<!DOCTYPE html><html>${headTag}<body><div id="root"></div>` + `<script>${propsScript}${dirtyFlag}</script>` + `<script type="module" src="${indexPath}"></script>` + `</body></html>`;
|
|
58
|
-
return new Response(html, {
|
|
59
|
-
headers: { "Content-Type": "text/html" }
|
|
60
|
-
});
|
|
61
|
-
};
|
|
62
|
-
var primeVueStream = async (stream) => {
|
|
63
|
-
const reader = stream.getReader();
|
|
64
|
-
const firstChunk = await reader.read();
|
|
65
|
-
return { firstChunk, reader };
|
|
66
|
-
};
|
|
67
|
-
var handleVuePageRequest = async (input) => {
|
|
68
|
-
const passedPageComponent = input.Page;
|
|
69
|
-
const resolvedHeadTag = input.headTag ?? "<head></head>";
|
|
70
|
-
const resolvedIndexPath = input.indexPath;
|
|
71
|
-
const resolvedOptions = input;
|
|
72
|
-
const resolvedPagePath = input.pagePath;
|
|
73
|
-
const maybeProps = input.props;
|
|
74
|
-
if (isSsrCacheDirty("vue")) {
|
|
75
|
-
return buildDirtyResponse(resolvedHeadTag, resolvedIndexPath, maybeProps);
|
|
76
|
-
}
|
|
77
|
-
try {
|
|
78
|
-
const handlerCallsite = resolvedOptions?.collectStreamingSlots === true ? undefined : getCurrentRouteRegistrationCallsite() ?? captureStreamingSlotWarningCallsite();
|
|
79
|
-
const renderPageResponse = async () => {
|
|
80
|
-
const resolvePageComponent = async () => {
|
|
81
|
-
if (isGenericVueComponent(passedPageComponent)) {
|
|
82
|
-
return {
|
|
83
|
-
component: passedPageComponent,
|
|
84
|
-
hasIslands: readHasIslands(passedPageComponent)
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
const generatedPagePath = await resolveCurrentGeneratedVueModulePath(resolvedPagePath);
|
|
88
|
-
const importedPageModule = await import(generatedPagePath);
|
|
89
|
-
const importedPageComponent = readDefaultExport(importedPageModule) ?? importedPageModule;
|
|
90
|
-
if (!isGenericVueComponent(importedPageComponent)) {
|
|
91
|
-
throw new Error(`Invalid Vue page module: ${generatedPagePath}`);
|
|
92
|
-
}
|
|
93
|
-
return {
|
|
94
|
-
component: importedPageComponent,
|
|
95
|
-
hasIslands: readHasIslands(importedPageModule)
|
|
96
|
-
};
|
|
97
|
-
};
|
|
98
|
-
const resolvedPage = await resolvePageComponent();
|
|
99
|
-
const { createSSRApp, h } = await import("vue");
|
|
100
|
-
const { renderToWebStream } = await import("vue/server-renderer");
|
|
101
|
-
const app = createSSRApp({
|
|
102
|
-
render: () => h(resolvedPage.component, maybeProps ?? null)
|
|
103
|
-
});
|
|
104
|
-
const bodyStream = renderToWebStream(app);
|
|
105
|
-
const { firstChunk, reader } = await primeVueStream(bodyStream);
|
|
106
|
-
const head = `<!DOCTYPE html><html>${resolvedHeadTag}<body><div id="root">`;
|
|
107
|
-
const tail = `</div><script>window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})}</script><script type="module" src="${resolvedIndexPath}"></script></body></html>`;
|
|
108
|
-
const stream = new ReadableStream({
|
|
109
|
-
start(controller) {
|
|
110
|
-
controller.enqueue(head);
|
|
111
|
-
if (!firstChunk.done) {
|
|
112
|
-
controller.enqueue(firstChunk.value);
|
|
113
|
-
}
|
|
114
|
-
if (firstChunk.done) {
|
|
115
|
-
controller.enqueue(tail);
|
|
116
|
-
controller.close();
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
const pumpLoop = () => {
|
|
120
|
-
reader.read().then(({ done, value }) => done ? (controller.enqueue(tail), controller.close()) : (controller.enqueue(value), pumpLoop())).catch((err) => controller.error(err));
|
|
121
|
-
};
|
|
122
|
-
pumpLoop();
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
const htmlStream = injectIslandPageContextStream(stream, {
|
|
126
|
-
hasIslands: resolvedPage.hasIslands
|
|
127
|
-
});
|
|
128
|
-
return new Response(htmlStream, {
|
|
129
|
-
headers: { "Content-Type": "text/html" }
|
|
130
|
-
});
|
|
131
|
-
};
|
|
132
|
-
return await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, resolvedOptions) : renderPageResponse(), { handlerCallsite });
|
|
133
|
-
} catch (error) {
|
|
134
|
-
console.error("[SSR] Vue render error:", error);
|
|
135
|
-
const pageName = derivePageName(resolvedPagePath);
|
|
136
|
-
const conventionResponse = await renderConventionError("vue", pageName, error);
|
|
137
|
-
if (conventionResponse)
|
|
138
|
-
return conventionResponse;
|
|
139
|
-
return new Response(ssrErrorPage("vue", error), {
|
|
140
|
-
headers: { "Content-Type": "text/html" },
|
|
141
|
-
status: 500
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
export { handleVuePageRequest };
|
|
147
|
-
|
|
148
|
-
//# debugId=26E5820BE6B0DB1864756E2164756E21
|
|
149
|
-
//# sourceMappingURL=chunk-e3r9fxaa.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/vue/pageHandler.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import type { Component as VueComponent } from 'vue';\nimport { readdir } from 'node:fs/promises';\nimport { basename, dirname } from 'node:path';\nimport type { VuePropsOf } from '../../types/vue';\nimport { EXCLUDE_LAST_OFFSET } from '../constants';\nimport { injectIslandPageContextStream } from '../core/islandPageContext';\nimport { getCurrentRouteRegistrationCallsite } from '../core/devRouteRegistrationCallsite';\nimport {\n\ttype StreamingSlotEnhancerOptions,\n\twithRegisteredStreamingSlots\n} from '../core/responseEnhancers';\nimport {\n\tcaptureStreamingSlotWarningCallsite,\n\trunWithStreamingSlotWarningScope\n} from '../core/streamingSlotWarningScope';\nimport { isSsrCacheDirty, markSsrCacheDirty } from '../core/ssrCache';\nimport { ssrErrorPage } from '../utils/ssrErrorPage';\nimport {\n\tderivePageName,\n\trenderConventionError\n} from '../utils/resolveConvention';\n\ntype VuePageRenderOptions = StreamingSlotEnhancerOptions & {\n\tcollectStreamingSlots?: boolean;\n};\nexport type VuePageRequestInput<Component extends VueComponent> =\n\tVuePageRenderOptions & {\n\t\theadTag?: `<head>${string}</head>`;\n\t\tindexPath: string;\n\t\tpagePath: string;\n\t\tPage?: Component;\n\t} & (keyof VuePropsOf<Component> extends never\n\t\t\t? { props?: NoInfer<VuePropsOf<Component>> }\n\t\t\t: { props: NoInfer<VuePropsOf<Component>> });\ntype GenericVueComponent = VueComponent;\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nconst isGenericVueComponent = (value: unknown): value is GenericVueComponent =>\n\ttypeof value === 'function' || isRecord(value);\n\nconst readHasIslands = (value: unknown) => {\n\tif (!isRecord(value)) return false;\n\tconst hasIslands = value['__ABSOLUTE_PAGE_HAS_ISLANDS__'];\n\n\treturn typeof hasIslands === 'boolean' ? hasIslands : false;\n};\n\nconst readDefaultExport = (value: unknown) =>\n\tisRecord(value) ? value.default : undefined;\n\nconst resolveCurrentGeneratedVueModulePath = async (pagePath: string) => {\n\tconst pageDirectory = dirname(pagePath);\n\tconst expectedPrefix = `${basename(pagePath, '.js').split('.')[0]}.`;\n\n\ttry {\n\t\tconst pageEntries = await readdir(pageDirectory, {\n\t\t\twithFileTypes: true\n\t\t});\n\t\tconst matchingEntry = pageEntries.find(\n\t\t\t(entry) =>\n\t\t\t\tentry.isFile() &&\n\t\t\t\tentry.name.endsWith('.js') &&\n\t\t\t\t(entry.name ===\n\t\t\t\t\t`${expectedPrefix.slice(0, EXCLUDE_LAST_OFFSET)}.js` ||\n\t\t\t\t\tentry.name.startsWith(expectedPrefix))\n\t\t);\n\t\tif (!matchingEntry) {\n\t\t\treturn pagePath;\n\t\t}\n\n\t\treturn `${pageDirectory}/${matchingEntry.name}`;\n\t} catch {\n\t\treturn pagePath;\n\t}\n};\n\nconst buildDirtyResponse = (\n\theadTag: string,\n\tindexPath: string,\n\tmaybeProps: Record<string, unknown> | undefined\n) => {\n\tconst propsScript = `window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})};`;\n\tconst dirtyFlag = 'window.__SSR_DIRTY__=true;';\n\tconst html =\n\t\t`<!DOCTYPE html><html>${headTag}<body><div id=\"root\"></div>` +\n\t\t`<script>${propsScript}${dirtyFlag}</script>` +\n\t\t`<script type=\"module\" src=\"${indexPath}\"></script>` +\n\t\t`</body></html>`;\n\n\treturn new Response(html, {\n\t\theaders: { 'Content-Type': 'text/html' }\n\t});\n};\n\nconst primeVueStream = async (stream: ReadableStream) => {\n\tconst reader = stream.getReader();\n\tconst firstChunk = await reader.read();\n\n\treturn { firstChunk, reader };\n};\n\nexport const handleVuePageRequest = async <Component extends VueComponent>(\n\tinput: VuePageRequestInput<Component>\n) => {\n\tconst passedPageComponent = input.Page;\n\tconst resolvedHeadTag = input.headTag ?? '<head></head>';\n\tconst resolvedIndexPath = input.indexPath;\n\tconst resolvedOptions = input;\n\tconst resolvedPagePath = input.pagePath;\n\tconst maybeProps = input.props;\n\n\tif (isSsrCacheDirty('vue')) {\n\t\treturn buildDirtyResponse(\n\t\t\tresolvedHeadTag,\n\t\t\tresolvedIndexPath,\n\t\t\tmaybeProps\n\t\t);\n\t}\n\n\ttry {\n\t\tconst handlerCallsite =\n\t\t\tresolvedOptions?.collectStreamingSlots === true\n\t\t\t\t? undefined\n\t\t\t\t: (getCurrentRouteRegistrationCallsite() ??\n\t\t\t\t\tcaptureStreamingSlotWarningCallsite());\n\t\tconst renderPageResponse = async () => {\n\t\t\tconst resolvePageComponent = async () => {\n\t\t\t\tif (isGenericVueComponent(passedPageComponent)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponent: passedPageComponent,\n\t\t\t\t\t\thasIslands: readHasIslands(passedPageComponent)\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst generatedPagePath =\n\t\t\t\t\tawait resolveCurrentGeneratedVueModulePath(\n\t\t\t\t\t\tresolvedPagePath\n\t\t\t\t\t);\n\t\t\t\tconst importedPageModule: unknown = await import(\n\t\t\t\t\tgeneratedPagePath\n\t\t\t\t);\n\t\t\t\tconst importedPageComponent =\n\t\t\t\t\treadDefaultExport(importedPageModule) ?? importedPageModule;\n\t\t\t\tif (!isGenericVueComponent(importedPageComponent)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid Vue page module: ${generatedPagePath}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcomponent: importedPageComponent,\n\t\t\t\t\thasIslands: readHasIslands(importedPageModule)\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst resolvedPage = await resolvePageComponent();\n\t\t\tconst { createSSRApp, h } = await import('vue');\n\t\t\tconst { renderToWebStream } = await import('vue/server-renderer');\n\n\t\t\tconst app = createSSRApp({\n\t\t\t\trender: () => h(resolvedPage.component, maybeProps ?? null)\n\t\t\t});\n\n\t\t\tconst bodyStream = renderToWebStream(app);\n\t\t\tconst { firstChunk, reader } = await primeVueStream(bodyStream);\n\n\t\t\tconst head = `<!DOCTYPE html><html>${resolvedHeadTag}<body><div id=\"root\">`;\n\t\t\tconst tail = `</div><script>window.__INITIAL_PROPS__=${JSON.stringify(\n\t\t\t\tmaybeProps ?? {}\n\t\t\t)}</script><script type=\"module\" src=\"${resolvedIndexPath}\"></script></body></html>`;\n\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tstart(controller) {\n\t\t\t\t\tcontroller.enqueue(head);\n\t\t\t\t\tif (!firstChunk.done) {\n\t\t\t\t\t\tcontroller.enqueue(firstChunk.value);\n\t\t\t\t\t}\n\t\t\t\t\tif (firstChunk.done) {\n\t\t\t\t\t\tcontroller.enqueue(tail);\n\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst pumpLoop = () => {\n\t\t\t\t\t\treader\n\t\t\t\t\t\t\t.read()\n\t\t\t\t\t\t\t.then(({ done, value }) =>\n\t\t\t\t\t\t\t\tdone\n\t\t\t\t\t\t\t\t\t? (controller.enqueue(tail),\n\t\t\t\t\t\t\t\t\t\tcontroller.close())\n\t\t\t\t\t\t\t\t\t: (controller.enqueue(value), pumpLoop())\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.catch((err) => controller.error(err));\n\t\t\t\t\t};\n\t\t\t\t\tpumpLoop();\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst htmlStream = injectIslandPageContextStream(stream, {\n\t\t\t\thasIslands: resolvedPage.hasIslands\n\t\t\t});\n\n\t\t\treturn new Response(htmlStream, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' }\n\t\t\t});\n\t\t};\n\n\t\treturn await runWithStreamingSlotWarningScope(\n\t\t\t() =>\n\t\t\t\tresolvedOptions?.collectStreamingSlots === true\n\t\t\t\t\t? withRegisteredStreamingSlots(\n\t\t\t\t\t\t\trenderPageResponse,\n\t\t\t\t\t\t\tresolvedOptions\n\t\t\t\t\t\t)\n\t\t\t\t\t: renderPageResponse(),\n\t\t\t{ handlerCallsite }\n\t\t);\n\t} catch (error) {\n\t\tconsole.error('[SSR] Vue render error:', error);\n\n\t\tconst pageName = derivePageName(resolvedPagePath);\n\t\tconst conventionResponse = await renderConventionError(\n\t\t\t'vue',\n\t\t\tpageName,\n\t\t\terror\n\t\t);\n\t\tif (conventionResponse) return conventionResponse;\n\n\t\treturn new Response(ssrErrorPage('vue', error), {\n\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\tstatus: 500\n\t\t});\n\t}\n};\n\nexport const invalidateVueSsrCache = () => {\n\tmarkSsrCacheDirty('vue');\n};\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "26E5820BE6B0DB1864756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
package/dist/chunk-e8eecyrq.js
DELETED
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import {
|
|
3
|
-
validateSafePath
|
|
4
|
-
} from "./chunk-cg95827x.js";
|
|
5
|
-
import"./chunk-hyjs4bqs.js";
|
|
6
|
-
import {
|
|
7
|
-
DEFAULT_DEVICE_SIZES,
|
|
8
|
-
DEFAULT_IMAGE_SIZES,
|
|
9
|
-
DEFAULT_QUALITY,
|
|
10
|
-
OPTIMIZATION_ENDPOINT,
|
|
11
|
-
formatToMime,
|
|
12
|
-
getCacheDir,
|
|
13
|
-
getCacheKey,
|
|
14
|
-
isCacheStale,
|
|
15
|
-
matchRemotePattern,
|
|
16
|
-
negotiateFormat,
|
|
17
|
-
optimizeImage,
|
|
18
|
-
readFromCache,
|
|
19
|
-
writeToCache
|
|
20
|
-
} from "./chunk-kk8w9rh5.js";
|
|
21
|
-
import"./chunk-qh75agse.js";
|
|
22
|
-
import"./chunk-bmgqm774.js";
|
|
23
|
-
|
|
24
|
-
// src/plugins/imageOptimizer.ts
|
|
25
|
-
import { existsSync } from "fs";
|
|
26
|
-
import { resolve } from "path";
|
|
27
|
-
import { Elysia } from "elysia";
|
|
28
|
-
var DEFAULT_CACHE_TTL_SECONDS = 60;
|
|
29
|
-
var MS_PER_SECOND = 1000;
|
|
30
|
-
var MAX_QUALITY = 100;
|
|
31
|
-
var avifInProgress = new Set;
|
|
32
|
-
var safeResolve = (path, baseDir) => {
|
|
33
|
-
try {
|
|
34
|
-
const resolved = validateSafePath(path, baseDir);
|
|
35
|
-
if (existsSync(resolved))
|
|
36
|
-
return resolved;
|
|
37
|
-
return null;
|
|
38
|
-
} catch {
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
var resolveLocalImage = (url, buildDir) => {
|
|
43
|
-
const cleanPath = url.startsWith("/") ? url.slice(1) : url;
|
|
44
|
-
return safeResolve(cleanPath, buildDir) ?? safeResolve(cleanPath, resolve(process.cwd()));
|
|
45
|
-
};
|
|
46
|
-
var parseQueryParams = (query, allowedSizes, defaultQuality) => {
|
|
47
|
-
const url = typeof query["url"] === "string" ? query["url"] : undefined;
|
|
48
|
-
const wParam = typeof query["w"] === "string" ? query["w"] : undefined;
|
|
49
|
-
const qParam = typeof query["q"] === "string" ? query["q"] : undefined;
|
|
50
|
-
if (!url || !wParam) {
|
|
51
|
-
return {
|
|
52
|
-
error: new Response("Missing required params: url, w", {
|
|
53
|
-
status: 400
|
|
54
|
-
})
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
const width = parseInt(wParam, 10);
|
|
58
|
-
if (isNaN(width) || !allowedSizes.has(width)) {
|
|
59
|
-
return {
|
|
60
|
-
error: new Response(`Invalid width: ${wParam}. Must be one of: ${[...allowedSizes].sort((left, right) => left - right).join(", ")}`, { status: 400 })
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
const quality = qParam ? parseInt(qParam, 10) : defaultQuality;
|
|
64
|
-
if (isNaN(quality) || quality < 1 || quality > MAX_QUALITY) {
|
|
65
|
-
return {
|
|
66
|
-
error: new Response("Invalid quality: must be 1-100", {
|
|
67
|
-
status: 400
|
|
68
|
-
})
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
return { params: { quality, url, width } };
|
|
72
|
-
};
|
|
73
|
-
var validateImageSecurity = (url, remotePatterns, buildDir) => {
|
|
74
|
-
const isRemote = url.startsWith("http://") || url.startsWith("https://");
|
|
75
|
-
if (isRemote) {
|
|
76
|
-
if (remotePatterns.length === 0 || !matchRemotePattern(url, remotePatterns)) {
|
|
77
|
-
return {
|
|
78
|
-
error: new Response("Remote image not allowed. Configure remotePatterns in images config.", { status: 400 }),
|
|
79
|
-
isRemote
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
return { isRemote, resolvedPath: null };
|
|
83
|
-
}
|
|
84
|
-
const resolvedPath = resolveLocalImage(url, buildDir);
|
|
85
|
-
if (!resolvedPath) {
|
|
86
|
-
return {
|
|
87
|
-
error: new Response(`Image not found: ${url}`, { status: 404 }),
|
|
88
|
-
isRemote
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
return { isRemote, resolvedPath };
|
|
92
|
-
};
|
|
93
|
-
var fetchSourceImage = async (url, isRemote, resolvedPath) => {
|
|
94
|
-
if (isRemote) {
|
|
95
|
-
const response = await fetch(url);
|
|
96
|
-
if (!response.ok) {
|
|
97
|
-
return {
|
|
98
|
-
error: new Response(`Failed to fetch remote image: ${response.status}`, { status: 502 })
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
return {
|
|
102
|
-
buffer: Buffer.from(await response.arrayBuffer()),
|
|
103
|
-
upstreamEtag: response.headers.get("ETag") ?? undefined
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
if (!resolvedPath) {
|
|
107
|
-
return {
|
|
108
|
-
error: new Response(`Image not found: ${url}`, { status: 404 })
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
const file = Bun.file(resolvedPath);
|
|
112
|
-
if (!await file.exists()) {
|
|
113
|
-
return {
|
|
114
|
-
error: new Response(`Image not found: ${url}`, { status: 404 })
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
return {
|
|
118
|
-
buffer: Buffer.from(await file.arrayBuffer()),
|
|
119
|
-
upstreamEtag: undefined
|
|
120
|
-
};
|
|
121
|
-
};
|
|
122
|
-
var scheduleAvifPregen = (url, width, quality, sourceBuffer, configuredFormats, format, cacheDir, minimumCacheTTL, upstreamEtag) => {
|
|
123
|
-
if (!configuredFormats.includes("avif") || format === "avif") {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
const avifKey = `${url}|${width}|${quality}`;
|
|
127
|
-
if (avifInProgress.has(avifKey))
|
|
128
|
-
return;
|
|
129
|
-
const avifCacheKey = getCacheKey(url, width, quality, "avif");
|
|
130
|
-
const avifCached = readFromCache(cacheDir, avifCacheKey);
|
|
131
|
-
if (avifCached && !isCacheStale(avifCached.meta))
|
|
132
|
-
return;
|
|
133
|
-
avifInProgress.add(avifKey);
|
|
134
|
-
queueMicrotask(async () => {
|
|
135
|
-
try {
|
|
136
|
-
const avifBuffer = await optimizeImage(sourceBuffer, width, quality, "avif");
|
|
137
|
-
const avifMeta = {
|
|
138
|
-
contentType: "image/avif",
|
|
139
|
-
etag: `"${avifCacheKey}"`,
|
|
140
|
-
expireAt: Date.now() + minimumCacheTTL,
|
|
141
|
-
upstreamEtag
|
|
142
|
-
};
|
|
143
|
-
writeToCache(cacheDir, avifCacheKey, avifBuffer, avifMeta);
|
|
144
|
-
} catch {} finally {
|
|
145
|
-
avifInProgress.delete(avifKey);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
};
|
|
149
|
-
var imageOptimizer = (config, buildDir) => {
|
|
150
|
-
const plugin = new Elysia({ name: "image-optimizer" });
|
|
151
|
-
if (!config && config !== undefined)
|
|
152
|
-
return plugin;
|
|
153
|
-
if (config?.unoptimized)
|
|
154
|
-
return plugin;
|
|
155
|
-
const endpointPath = config?.path ?? OPTIMIZATION_ENDPOINT;
|
|
156
|
-
const allowedSizes = new Set([
|
|
157
|
-
...config?.deviceSizes ?? DEFAULT_DEVICE_SIZES,
|
|
158
|
-
...config?.imageSizes ?? DEFAULT_IMAGE_SIZES
|
|
159
|
-
]);
|
|
160
|
-
const defaultQuality = config?.quality ?? DEFAULT_QUALITY;
|
|
161
|
-
const minimumCacheTTL = (config?.minimumCacheTTL ?? DEFAULT_CACHE_TTL_SECONDS) * MS_PER_SECOND;
|
|
162
|
-
const cacheControlHeader = `public, max-age=${Math.ceil(minimumCacheTTL / MS_PER_SECOND)}, must-revalidate`;
|
|
163
|
-
const configuredFormats = config?.formats ?? ["webp"];
|
|
164
|
-
const remotePatterns = config?.remotePatterns ?? [];
|
|
165
|
-
const cacheDir = getCacheDir(buildDir);
|
|
166
|
-
return plugin.get(endpointPath, async ({ query, request }) => {
|
|
167
|
-
const parsed = parseQueryParams(query, allowedSizes, defaultQuality);
|
|
168
|
-
if ("error" in parsed)
|
|
169
|
-
return parsed.error;
|
|
170
|
-
const { quality, url, width } = parsed.params;
|
|
171
|
-
const security = validateImageSecurity(url, remotePatterns, buildDir);
|
|
172
|
-
if ("error" in security)
|
|
173
|
-
return security.error;
|
|
174
|
-
const { isRemote, resolvedPath } = security;
|
|
175
|
-
const acceptHeader = request.headers.get("Accept") ?? "";
|
|
176
|
-
const format = negotiateFormat(acceptHeader, configuredFormats);
|
|
177
|
-
const mime = formatToMime(format);
|
|
178
|
-
const cacheKey = getCacheKey(url, width, quality, format);
|
|
179
|
-
const cached = readFromCache(cacheDir, cacheKey);
|
|
180
|
-
if (cached && !isCacheStale(cached.meta)) {
|
|
181
|
-
const ifNoneMatch = request.headers.get("If-None-Match");
|
|
182
|
-
if (ifNoneMatch && ifNoneMatch === cached.meta.etag) {
|
|
183
|
-
return new Response(null, {
|
|
184
|
-
headers: {
|
|
185
|
-
"Cache-Control": cacheControlHeader,
|
|
186
|
-
ETag: cached.meta.etag,
|
|
187
|
-
Vary: "Accept"
|
|
188
|
-
},
|
|
189
|
-
status: 304
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
return new Response(new Uint8Array(cached.buffer), {
|
|
193
|
-
headers: {
|
|
194
|
-
"Cache-Control": cacheControlHeader,
|
|
195
|
-
"Content-Type": cached.meta.contentType,
|
|
196
|
-
ETag: cached.meta.etag,
|
|
197
|
-
Vary: "Accept"
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
let sourceBuffer;
|
|
202
|
-
let upstreamEtag;
|
|
203
|
-
try {
|
|
204
|
-
const source = await fetchSourceImage(url, isRemote, resolvedPath ?? null);
|
|
205
|
-
if ("error" in source)
|
|
206
|
-
return source.error;
|
|
207
|
-
sourceBuffer = source.buffer;
|
|
208
|
-
({ upstreamEtag } = source);
|
|
209
|
-
} catch (err) {
|
|
210
|
-
return new Response(`Failed to load image: ${err instanceof Error ? err.message : "unknown error"}`, { status: 500 });
|
|
211
|
-
}
|
|
212
|
-
let optimizedBuffer;
|
|
213
|
-
try {
|
|
214
|
-
optimizedBuffer = await optimizeImage(sourceBuffer, width, quality, format);
|
|
215
|
-
} catch {
|
|
216
|
-
optimizedBuffer = sourceBuffer;
|
|
217
|
-
}
|
|
218
|
-
const etag = `"${cacheKey}"`;
|
|
219
|
-
const meta = {
|
|
220
|
-
contentType: mime,
|
|
221
|
-
etag,
|
|
222
|
-
expireAt: Date.now() + minimumCacheTTL,
|
|
223
|
-
upstreamEtag
|
|
224
|
-
};
|
|
225
|
-
try {
|
|
226
|
-
writeToCache(cacheDir, cacheKey, optimizedBuffer, meta);
|
|
227
|
-
} catch {}
|
|
228
|
-
scheduleAvifPregen(url, width, quality, sourceBuffer, configuredFormats, format, cacheDir, minimumCacheTTL, upstreamEtag);
|
|
229
|
-
return new Response(new Uint8Array(optimizedBuffer), {
|
|
230
|
-
headers: {
|
|
231
|
-
"Cache-Control": cacheControlHeader,
|
|
232
|
-
"Content-Type": mime,
|
|
233
|
-
ETag: etag,
|
|
234
|
-
Vary: "Accept"
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
};
|
|
239
|
-
export {
|
|
240
|
-
imageOptimizer
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
//# debugId=6A88C49F9E6C16C364756E2164756E21
|
|
244
|
-
//# sourceMappingURL=chunk-e8eecyrq.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/plugins/imageOptimizer.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Elysia } from 'elysia';\nimport type { ImageConfig, ImageFormat } from '../../types/image';\nimport {\n\ttype CacheMeta,\n\tDEFAULT_DEVICE_SIZES,\n\tDEFAULT_IMAGE_SIZES,\n\tDEFAULT_QUALITY,\n\tOPTIMIZATION_ENDPOINT,\n\tformatToMime,\n\tgetCacheDir,\n\tgetCacheKey,\n\tisCacheStale,\n\tmatchRemotePattern,\n\tnegotiateFormat,\n\toptimizeImage,\n\treadFromCache,\n\twriteToCache\n} from '../utils/imageProcessing';\nimport { validateSafePath } from '../utils/validateSafePath';\n\n/** Default cache TTL in seconds */\nconst DEFAULT_CACHE_TTL_SECONDS = 60;\n\n/** Milliseconds per second */\nconst MS_PER_SECOND = 1000;\n\n/** Maximum image quality value */\nconst MAX_QUALITY = 100;\n\n/** Set of AVIF cache keys currently being generated to avoid duplicate work */\nconst avifInProgress = new Set<string>();\n\n/** Try to resolve a path safely against a base directory, returning null if the file doesn't exist */\nconst safeResolve = (path: string, baseDir: string) => {\n\ttry {\n\t\tconst resolved = validateSafePath(path, baseDir);\n\n\t\tif (existsSync(resolved)) return resolved;\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n/** Resolve a local image path against build dir and project root */\nconst resolveLocalImage = (url: string, buildDir: string) => {\n\tconst cleanPath = url.startsWith('/') ? url.slice(1) : url;\n\n\treturn (\n\t\tsafeResolve(cleanPath, buildDir) ??\n\t\tsafeResolve(cleanPath, resolve(process.cwd()))\n\t);\n};\n\n/** Parse and validate query parameters, returning an error Response or valid params */\nconst parseQueryParams = (\n\tquery: Record<string, string | undefined>,\n\tallowedSizes: Set<number>,\n\tdefaultQuality: number\n) => {\n\tconst url = typeof query['url'] === 'string' ? query['url'] : undefined;\n\tconst wParam = typeof query['w'] === 'string' ? query['w'] : undefined;\n\tconst qParam = typeof query['q'] === 'string' ? query['q'] : undefined;\n\n\tif (!url || !wParam) {\n\t\treturn {\n\t\t\terror: new Response('Missing required params: url, w', {\n\t\t\t\tstatus: 400\n\t\t\t})\n\t\t};\n\t}\n\n\tconst width = parseInt(wParam, 10);\n\tif (isNaN(width) || !allowedSizes.has(width)) {\n\t\treturn {\n\t\t\terror: new Response(\n\t\t\t\t`Invalid width: ${wParam}. Must be one of: ${[...allowedSizes].sort((left, right) => left - right).join(', ')}`,\n\t\t\t\t{ status: 400 }\n\t\t\t)\n\t\t};\n\t}\n\n\tconst quality = qParam ? parseInt(qParam, 10) : defaultQuality;\n\tif (isNaN(quality) || quality < 1 || quality > MAX_QUALITY) {\n\t\treturn {\n\t\t\terror: new Response('Invalid quality: must be 1-100', {\n\t\t\t\tstatus: 400\n\t\t\t})\n\t\t};\n\t}\n\n\treturn { params: { quality, url, width } };\n};\n\n/** Validate security for the given image URL */\nconst validateImageSecurity = (\n\turl: string,\n\tremotePatterns: ImageConfig['remotePatterns'] & object,\n\tbuildDir: string\n) => {\n\tconst isRemote = url.startsWith('http://') || url.startsWith('https://');\n\n\tif (isRemote) {\n\t\tif (\n\t\t\tremotePatterns.length === 0 ||\n\t\t\t!matchRemotePattern(url, remotePatterns)\n\t\t) {\n\t\t\treturn {\n\t\t\t\terror: new Response(\n\t\t\t\t\t'Remote image not allowed. Configure remotePatterns in images config.',\n\t\t\t\t\t{ status: 400 }\n\t\t\t\t),\n\t\t\t\tisRemote\n\t\t\t};\n\t\t}\n\n\t\treturn { isRemote, resolvedPath: null };\n\t}\n\n\tconst resolvedPath = resolveLocalImage(url, buildDir);\n\tif (!resolvedPath) {\n\t\treturn {\n\t\t\terror: new Response(`Image not found: ${url}`, { status: 404 }),\n\t\t\tisRemote\n\t\t};\n\t}\n\n\treturn { isRemote, resolvedPath };\n};\n\n/** Fetch the source image buffer from remote URL or local file */\nconst fetchSourceImage = async (\n\turl: string,\n\tisRemote: boolean,\n\tresolvedPath: string | null\n) => {\n\tif (isRemote) {\n\t\tconst response = await fetch(url);\n\t\tif (!response.ok) {\n\t\t\treturn {\n\t\t\t\terror: new Response(\n\t\t\t\t\t`Failed to fetch remote image: ${response.status}`,\n\t\t\t\t\t{ status: 502 }\n\t\t\t\t)\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: Buffer.from(await response.arrayBuffer()),\n\t\t\tupstreamEtag: response.headers.get('ETag') ?? undefined\n\t\t};\n\t}\n\n\tif (!resolvedPath) {\n\t\treturn {\n\t\t\terror: new Response(`Image not found: ${url}`, { status: 404 })\n\t\t};\n\t}\n\n\tconst file = Bun.file(resolvedPath);\n\tif (!(await file.exists())) {\n\t\treturn {\n\t\t\terror: new Response(`Image not found: ${url}`, { status: 404 })\n\t\t};\n\t}\n\n\treturn {\n\t\tbuffer: Buffer.from(await file.arrayBuffer()),\n\t\tupstreamEtag: undefined\n\t};\n};\n\n/** Schedule AVIF pre-generation in the background */\nconst scheduleAvifPregen = (\n\turl: string,\n\twidth: number,\n\tquality: number,\n\tsourceBuffer: Buffer,\n\tconfiguredFormats: ImageFormat[],\n\tformat: ImageFormat,\n\tcacheDir: string,\n\tminimumCacheTTL: number,\n\tupstreamEtag: string | undefined\n) => {\n\tif (!configuredFormats.includes('avif') || format === 'avif') {\n\t\treturn;\n\t}\n\n\tconst avifKey = `${url}|${width}|${quality}`;\n\tif (avifInProgress.has(avifKey)) return;\n\n\tconst avifCacheKey = getCacheKey(url, width, quality, 'avif');\n\tconst avifCached = readFromCache(cacheDir, avifCacheKey);\n\tif (avifCached && !isCacheStale(avifCached.meta)) return;\n\n\tavifInProgress.add(avifKey);\n\tqueueMicrotask(async () => {\n\t\ttry {\n\t\t\tconst avifBuffer = await optimizeImage(\n\t\t\t\tsourceBuffer,\n\t\t\t\twidth,\n\t\t\t\tquality,\n\t\t\t\t'avif'\n\t\t\t);\n\t\t\tconst avifMeta: CacheMeta = {\n\t\t\t\tcontentType: 'image/avif',\n\t\t\t\tetag: `\"${avifCacheKey}\"`,\n\t\t\t\texpireAt: Date.now() + minimumCacheTTL,\n\t\t\t\tupstreamEtag\n\t\t\t};\n\t\t\twriteToCache(cacheDir, avifCacheKey, avifBuffer, avifMeta);\n\t\t} catch {\n\t\t\t// AVIF generation failure is non-fatal\n\t\t} finally {\n\t\t\tavifInProgress.delete(avifKey);\n\t\t}\n\t});\n};\n\nexport const imageOptimizer = (\n\tconfig: ImageConfig | undefined,\n\tbuildDir: string\n) => {\n\tconst plugin = new Elysia({ name: 'image-optimizer' });\n\n\t// No-op if disabled or no config\n\tif (!config && config !== undefined) return plugin;\n\tif (config?.unoptimized) return plugin;\n\n\tconst endpointPath = config?.path ?? OPTIMIZATION_ENDPOINT;\n\tconst allowedSizes = new Set([\n\t\t...(config?.deviceSizes ?? DEFAULT_DEVICE_SIZES),\n\t\t...(config?.imageSizes ?? DEFAULT_IMAGE_SIZES)\n\t]);\n\tconst defaultQuality = config?.quality ?? DEFAULT_QUALITY;\n\tconst minimumCacheTTL =\n\t\t(config?.minimumCacheTTL ?? DEFAULT_CACHE_TTL_SECONDS) * MS_PER_SECOND;\n\tconst cacheControlHeader = `public, max-age=${Math.ceil(minimumCacheTTL / MS_PER_SECOND)}, must-revalidate`;\n\tconst configuredFormats: ImageFormat[] = config?.formats ?? ['webp'];\n\tconst remotePatterns = config?.remotePatterns ?? [];\n\tconst cacheDir = getCacheDir(buildDir);\n\n\treturn plugin.get(endpointPath, async ({ query, request }) => {\n\t\t// ── Parse & Validate ────────────────────────────────\n\t\tconst parsed = parseQueryParams(query, allowedSizes, defaultQuality);\n\t\tif ('error' in parsed) return parsed.error;\n\t\tconst { quality, url, width } = parsed.params;\n\n\t\t// ── Security ────────────────────────────────────────\n\t\tconst security = validateImageSecurity(url, remotePatterns, buildDir);\n\t\tif ('error' in security) return security.error;\n\t\tconst { isRemote, resolvedPath } = security;\n\n\t\t// ── Content Negotiation ─────────────────────────────\n\t\tconst acceptHeader = request.headers.get('Accept') ?? '';\n\t\tconst format = negotiateFormat(acceptHeader, configuredFormats);\n\t\tconst mime = formatToMime(format);\n\n\t\t// ── Cache Lookup ────────────────────────────────────\n\t\tconst cacheKey = getCacheKey(url, width, quality, format);\n\t\tconst cached = readFromCache(cacheDir, cacheKey);\n\n\t\tif (cached && !isCacheStale(cached.meta)) {\n\t\t\tconst ifNoneMatch = request.headers.get('If-None-Match');\n\t\t\tif (ifNoneMatch && ifNoneMatch === cached.meta.etag) {\n\t\t\t\treturn new Response(null, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Cache-Control': cacheControlHeader,\n\t\t\t\t\t\tETag: cached.meta.etag,\n\t\t\t\t\t\tVary: 'Accept'\n\t\t\t\t\t},\n\t\t\t\t\tstatus: 304\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn new Response(new Uint8Array(cached.buffer), {\n\t\t\t\theaders: {\n\t\t\t\t\t'Cache-Control': cacheControlHeader,\n\t\t\t\t\t'Content-Type': cached.meta.contentType,\n\t\t\t\t\tETag: cached.meta.etag,\n\t\t\t\t\tVary: 'Accept'\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// ── Fetch Source ────────────────────────────────────\n\t\tlet sourceBuffer: Buffer;\n\t\tlet upstreamEtag: string | undefined;\n\n\t\ttry {\n\t\t\tconst source = await fetchSourceImage(\n\t\t\t\turl,\n\t\t\t\tisRemote,\n\t\t\t\tresolvedPath ?? null\n\t\t\t);\n\t\t\tif ('error' in source) return source.error;\n\t\t\tsourceBuffer = source.buffer;\n\t\t\t({ upstreamEtag } = source);\n\t\t} catch (err) {\n\t\t\treturn new Response(\n\t\t\t\t`Failed to load image: ${err instanceof Error ? err.message : 'unknown error'}`,\n\t\t\t\t{ status: 500 }\n\t\t\t);\n\t\t}\n\n\t\t// ── Optimize ────────────────────────────────────────\n\t\tlet optimizedBuffer: Buffer;\n\t\ttry {\n\t\t\toptimizedBuffer = await optimizeImage(\n\t\t\t\tsourceBuffer,\n\t\t\t\twidth,\n\t\t\t\tquality,\n\t\t\t\tformat\n\t\t\t);\n\t\t} catch {\n\t\t\t// Graceful degradation: serve original\n\t\t\toptimizedBuffer = sourceBuffer;\n\t\t}\n\n\t\t// ── Cache Write ─────────────────────────────────────\n\t\tconst etag = `\"${cacheKey}\"`;\n\t\tconst meta: CacheMeta = {\n\t\t\tcontentType: mime,\n\t\t\tetag,\n\t\t\texpireAt: Date.now() + minimumCacheTTL,\n\t\t\tupstreamEtag\n\t\t};\n\n\t\ttry {\n\t\t\twriteToCache(cacheDir, cacheKey, optimizedBuffer, meta);\n\t\t} catch {\n\t\t\t// Cache write failure is non-fatal\n\t\t}\n\n\t\t// ── AVIF Async Pre-generation ───────────────────────\n\t\tscheduleAvifPregen(\n\t\t\turl,\n\t\t\twidth,\n\t\t\tquality,\n\t\t\tsourceBuffer,\n\t\t\tconfiguredFormats,\n\t\t\tformat,\n\t\t\tcacheDir,\n\t\t\tminimumCacheTTL,\n\t\t\tupstreamEtag\n\t\t);\n\n\t\t// ── Response ────────────────────────────────────────\n\t\treturn new Response(new Uint8Array(optimizedBuffer), {\n\t\t\theaders: {\n\t\t\t\t'Cache-Control': cacheControlHeader,\n\t\t\t\t'Content-Type': mime,\n\t\t\t\tETag: etag,\n\t\t\t\tVary: 'Accept'\n\t\t\t}\n\t\t});\n\t});\n};\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "6A88C49F9E6C16C364756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
package/dist/chunk-ex2hxe0v.js
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import {
|
|
3
|
-
getMimeType,
|
|
4
|
-
handleClientConnect,
|
|
5
|
-
handleClientDisconnect,
|
|
6
|
-
handleHMRMessage,
|
|
7
|
-
lookupAsset
|
|
8
|
-
} from "./chunk-vkrpm7kc.js";
|
|
9
|
-
import"./chunk-h5bbfn3n.js";
|
|
10
|
-
import"./chunk-cbkrwmvh.js";
|
|
11
|
-
import"./chunk-gf0ygptk.js";
|
|
12
|
-
import {
|
|
13
|
-
UNFOUND_INDEX
|
|
14
|
-
} from "./chunk-qh75agse.js";
|
|
15
|
-
import {
|
|
16
|
-
__require
|
|
17
|
-
} from "./chunk-bmgqm774.js";
|
|
18
|
-
|
|
19
|
-
// src/plugins/hmr.ts
|
|
20
|
-
import Elysia from "elysia";
|
|
21
|
-
|
|
22
|
-
// src/react/bridgeInternals.ts
|
|
23
|
-
var INTERNALS_KEYS = [
|
|
24
|
-
"__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE",
|
|
25
|
-
"__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED"
|
|
26
|
-
];
|
|
27
|
-
var isRecord = (val) => typeof val === "object" && val !== null;
|
|
28
|
-
var findInternals = (mod) => {
|
|
29
|
-
for (const key of INTERNALS_KEYS) {
|
|
30
|
-
const val = mod[key];
|
|
31
|
-
if (isRecord(val))
|
|
32
|
-
return val;
|
|
33
|
-
}
|
|
34
|
-
return;
|
|
35
|
-
};
|
|
36
|
-
var bridgeReactInternals = async () => {
|
|
37
|
-
const pinnedRef = globalThis.__reactModuleRef;
|
|
38
|
-
if (!isRecord(pinnedRef))
|
|
39
|
-
return;
|
|
40
|
-
const react = await import("react");
|
|
41
|
-
if (pinnedRef === react)
|
|
42
|
-
return;
|
|
43
|
-
const pinnedInternals = findInternals(pinnedRef);
|
|
44
|
-
const currentInternals = findInternals(react);
|
|
45
|
-
if (!pinnedInternals || !currentInternals || pinnedInternals === currentInternals)
|
|
46
|
-
return;
|
|
47
|
-
for (const prop of Object.keys(pinnedInternals)) {
|
|
48
|
-
Object.defineProperty(currentInternals, prop, {
|
|
49
|
-
configurable: true,
|
|
50
|
-
enumerable: true,
|
|
51
|
-
get() {
|
|
52
|
-
return pinnedInternals[prop];
|
|
53
|
-
},
|
|
54
|
-
set(value) {
|
|
55
|
-
pinnedInternals[prop] = value;
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
// src/plugins/hmr.ts
|
|
62
|
-
var STORE_KEY = "__elysiaStore";
|
|
63
|
-
var getGlobalValue = (key) => Reflect.get(globalThis, key);
|
|
64
|
-
var restoreStore = (store) => {
|
|
65
|
-
const saved = getGlobalValue(STORE_KEY);
|
|
66
|
-
if (saved && typeof saved === "object") {
|
|
67
|
-
restoreSavedStoreValues(store, saved);
|
|
68
|
-
}
|
|
69
|
-
if (store && typeof store === "object") {
|
|
70
|
-
Reflect.set(globalThis, STORE_KEY, store);
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
var restoreSavedStoreValues = (store, saved) => {
|
|
74
|
-
if (!store || typeof store !== "object") {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
Object.entries(saved).forEach(([key, value]) => {
|
|
78
|
-
Reflect.set(store, key, value);
|
|
79
|
-
});
|
|
80
|
-
};
|
|
81
|
-
var resolveModuleResponse = (moduleResponse, ifNoneMatch) => {
|
|
82
|
-
const etag = moduleResponse.headers.get("ETag");
|
|
83
|
-
if (etag && ifNoneMatch === etag) {
|
|
84
|
-
return new Response(null, { headers: { ETag: etag }, status: 304 });
|
|
85
|
-
}
|
|
86
|
-
return moduleResponse;
|
|
87
|
-
};
|
|
88
|
-
var resolveRequestPathname = (request) => {
|
|
89
|
-
const rawUrl = request.url;
|
|
90
|
-
const qIdx = rawUrl.indexOf("?");
|
|
91
|
-
const pathEnd = qIdx === UNFOUND_INDEX ? rawUrl.length : qIdx;
|
|
92
|
-
const pathStart = rawUrl.indexOf("/", rawUrl.indexOf("//") + 2);
|
|
93
|
-
return rawUrl.slice(pathStart, pathEnd);
|
|
94
|
-
};
|
|
95
|
-
var resolveDevAssetResponse = async (request, hmrState, moduleServerHandler) => {
|
|
96
|
-
const pathname = resolveRequestPathname(request);
|
|
97
|
-
if (moduleServerHandler) {
|
|
98
|
-
const moduleResponse = await moduleServerHandler(pathname);
|
|
99
|
-
if (moduleResponse) {
|
|
100
|
-
return resolveModuleResponse(moduleResponse, request.headers.get("If-None-Match"));
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
const bytes = lookupAsset(hmrState.assetStore, pathname);
|
|
104
|
-
if (bytes) {
|
|
105
|
-
return new Response(new Uint8Array(bytes).buffer, {
|
|
106
|
-
headers: {
|
|
107
|
-
"Cache-Control": "no-cache",
|
|
108
|
-
"Content-Type": getMimeType(pathname)
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
const aliasedTarget = resolveHashlessAlias(hmrState, pathname);
|
|
113
|
-
if (aliasedTarget) {
|
|
114
|
-
return new Response(null, {
|
|
115
|
-
headers: {
|
|
116
|
-
"Cache-Control": "no-cache",
|
|
117
|
-
Location: aliasedTarget
|
|
118
|
-
},
|
|
119
|
-
status: 302
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
return;
|
|
123
|
-
};
|
|
124
|
-
var HASHLESS_INDEX_PATH_PATTERN = /^(\/[^/]+)?\/indexes\/([^/.]+)\/?$/;
|
|
125
|
-
var resolveHashlessAlias = (hmrState, pathname) => {
|
|
126
|
-
const match = pathname.match(HASHLESS_INDEX_PATH_PATTERN);
|
|
127
|
-
if (!match)
|
|
128
|
-
return null;
|
|
129
|
-
const prefix = `${match[1] ?? ""}/indexes/${match[2]}.`;
|
|
130
|
-
for (const candidate of hmrState.assetStore.keys()) {
|
|
131
|
-
if (candidate.startsWith(prefix))
|
|
132
|
-
return candidate;
|
|
133
|
-
}
|
|
134
|
-
return null;
|
|
135
|
-
};
|
|
136
|
-
var hmr = (hmrState, manifest, moduleServerHandler) => new Elysia({ name: "absolutejs-hmr" }).onStart(({ store }) => {
|
|
137
|
-
restoreStore(store);
|
|
138
|
-
}).onRequest(async ({ request }) => {
|
|
139
|
-
if (globalThis.__reactModuleRef) {
|
|
140
|
-
await bridgeReactInternals();
|
|
141
|
-
}
|
|
142
|
-
return resolveDevAssetResponse(request, hmrState, moduleServerHandler);
|
|
143
|
-
}).get("/@src/*", ({ request }) => resolveDevAssetResponse(request, hmrState, moduleServerHandler)).get("/@stub/*", ({ request }) => resolveDevAssetResponse(request, hmrState, moduleServerHandler)).get("/@hmr/*", ({ request }) => resolveDevAssetResponse(request, hmrState, moduleServerHandler)).ws("/hmr", {
|
|
144
|
-
close: (ws) => handleClientDisconnect(hmrState, ws),
|
|
145
|
-
message: (ws, msg) => handleHMRMessage(hmrState, ws, msg),
|
|
146
|
-
open: (ws) => handleClientConnect(hmrState, ws, manifest)
|
|
147
|
-
}).get("/hmr-status", () => ({
|
|
148
|
-
connectedClients: hmrState.connectedClients.size,
|
|
149
|
-
isRebuilding: hmrState.isRebuilding,
|
|
150
|
-
manifestKeys: Object.keys(manifest),
|
|
151
|
-
rebuildCount: hmrState.rebuildCount,
|
|
152
|
-
rebuildQueue: Array.from(hmrState.rebuildQueue),
|
|
153
|
-
timestamp: Date.now()
|
|
154
|
-
}));
|
|
155
|
-
export {
|
|
156
|
-
hmr
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
//# debugId=4B480B1E52FA111664756E2164756E21
|
|
160
|
-
//# sourceMappingURL=chunk-ex2hxe0v.js.map
|