vite-plugin-fastly 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/plugin.js +37 -49
- package/dist/plugin.js.map +1 -1
- package/package.json +3 -3
package/dist/plugin.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { createProxy } from "http-proxy-3";
|
|
3
3
|
import fs from "fs";
|
|
4
4
|
import { execSync, spawn } from "child_process";
|
|
5
|
-
import
|
|
5
|
+
import { launchAndTest } from "kill-em-all";
|
|
6
6
|
|
|
7
7
|
// src/plugin/expose-environment.ts
|
|
8
8
|
function exposeEnvironment() {
|
|
@@ -184,7 +184,7 @@ function fastly(options = {}) {
|
|
|
184
184
|
);
|
|
185
185
|
}
|
|
186
186
|
fastlyProcessKilled = true;
|
|
187
|
-
await
|
|
187
|
+
await doKillProcesses(this, uniqueName);
|
|
188
188
|
const wasmFile = buildDevRunnerIfNecessary(
|
|
189
189
|
this,
|
|
190
190
|
uniqueName,
|
|
@@ -196,38 +196,12 @@ function fastly(options = {}) {
|
|
|
196
196
|
);
|
|
197
197
|
this.info(`[${uniqueName}] Launching Fastly Dev Server with command:`);
|
|
198
198
|
this.info(`[${uniqueName}] ${launchCommand}`);
|
|
199
|
-
const fastlyDevServerProcess =
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const checkInterval = 500;
|
|
206
|
-
const maxAttempts = 60;
|
|
207
|
-
let attempts = 0;
|
|
208
|
-
const interval = setInterval(async () => {
|
|
209
|
-
attempts++;
|
|
210
|
-
if (attempts > maxAttempts) {
|
|
211
|
-
clearInterval(interval);
|
|
212
|
-
reject(
|
|
213
|
-
new Error(
|
|
214
|
-
`[${uniqueName}] Fastly Dev Server did not become ready in time.`
|
|
215
|
-
)
|
|
216
|
-
);
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
try {
|
|
220
|
-
const response = await fetch(
|
|
221
|
-
`http://${fastlyDevServerAddress}/@vite-plugin-fastly/ready`
|
|
222
|
-
);
|
|
223
|
-
if (response.ok) {
|
|
224
|
-
clearInterval(interval);
|
|
225
|
-
resolve();
|
|
226
|
-
}
|
|
227
|
-
} catch {
|
|
228
|
-
}
|
|
229
|
-
}, checkInterval);
|
|
230
|
-
});
|
|
199
|
+
const fastlyDevServerProcess = await spawnCommand(launchCommand);
|
|
200
|
+
const kill = await launchAndTest(
|
|
201
|
+
fastlyDevServerProcess,
|
|
202
|
+
`http://${fastlyDevServerAddress}/@vite-plugin-fastly/ready`
|
|
203
|
+
);
|
|
204
|
+
fastlyProcesses.set(uniqueName, kill);
|
|
231
205
|
this.info(
|
|
232
206
|
`[${uniqueName}] Fastly Dev Server is running at http://${fastlyDevServerAddress}`
|
|
233
207
|
);
|
|
@@ -257,7 +231,7 @@ function fastly(options = {}) {
|
|
|
257
231
|
async buildEnd() {
|
|
258
232
|
if (command === "build" || fastlyProcessKilled) return;
|
|
259
233
|
fastlyProcessKilled = true;
|
|
260
|
-
await
|
|
234
|
+
await doKillProcesses(this, uniqueName);
|
|
261
235
|
},
|
|
262
236
|
configureServer(server) {
|
|
263
237
|
const environment = server.environments[viteEnvironmentName];
|
|
@@ -390,18 +364,29 @@ function statOrNull(path) {
|
|
|
390
364
|
return null;
|
|
391
365
|
}
|
|
392
366
|
}
|
|
393
|
-
async function
|
|
394
|
-
const
|
|
395
|
-
if (!
|
|
367
|
+
async function doKillProcesses(ctx, name) {
|
|
368
|
+
const kill = fastlyProcesses.get(name);
|
|
369
|
+
if (!kill) return;
|
|
396
370
|
fastlyProcesses.delete(name);
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
ctx.info(`
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
371
|
+
ctx.info(`[${name}] Shutting down Fastly dev server`);
|
|
372
|
+
await kill();
|
|
373
|
+
ctx.info(`[${name}] Fastly dev server shut down`);
|
|
374
|
+
}
|
|
375
|
+
async function spawnCommand(command) {
|
|
376
|
+
const child = spawn(command, {
|
|
377
|
+
shell: true,
|
|
378
|
+
stdio: "inherit"
|
|
379
|
+
});
|
|
380
|
+
return await new Promise((resolve, reject) => {
|
|
381
|
+
child.on("spawn", () => {
|
|
382
|
+
if (!child.pid) {
|
|
383
|
+
return reject(new Error("Failed to spawn process"));
|
|
384
|
+
}
|
|
385
|
+
resolve(child);
|
|
386
|
+
});
|
|
387
|
+
child.on("error", (err) => {
|
|
388
|
+
reject(err);
|
|
389
|
+
});
|
|
405
390
|
});
|
|
406
391
|
}
|
|
407
392
|
var killAllInProgress = false;
|
|
@@ -410,7 +395,7 @@ async function killAll() {
|
|
|
410
395
|
const promises = [];
|
|
411
396
|
for (const name of fastlyProcesses.keys()) {
|
|
412
397
|
promises.push(
|
|
413
|
-
|
|
398
|
+
doKillProcesses(
|
|
414
399
|
{
|
|
415
400
|
info: (msg) => {
|
|
416
401
|
process.stdout.write(msg + "\n");
|
|
@@ -422,13 +407,16 @@ async function killAll() {
|
|
|
422
407
|
}
|
|
423
408
|
await Promise.all(promises);
|
|
424
409
|
}
|
|
425
|
-
|
|
410
|
+
function cleanupOnExit() {
|
|
426
411
|
if (!killAllInProgress) {
|
|
427
412
|
void killAll().finally(() => {
|
|
428
413
|
process.exit(0);
|
|
429
414
|
});
|
|
430
415
|
}
|
|
431
|
-
}
|
|
416
|
+
}
|
|
417
|
+
process.on("SIGINT", cleanupOnExit);
|
|
418
|
+
process.on("SIGTERM", cleanupOnExit);
|
|
419
|
+
process.on("exit", cleanupOnExit);
|
|
432
420
|
export {
|
|
433
421
|
fastly
|
|
434
422
|
};
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin/plugin.ts","../src/plugin/expose-environment.ts"],"sourcesContent":["import type { ConfigPluginContext, Connect, HttpServer, Plugin } from \"vite\";\nimport { createProxy, type ServerOptions } from \"http-proxy-3\";\nimport type { IncomingMessage } from \"node:http\";\nimport fs from \"node:fs\";\nimport { ChildProcess, execSync, spawn } from \"node:child_process\";\nimport treeKill from \"tree-kill-promise\";\nimport exposeEnvironment from \"./expose-environment\";\n\nexport interface FastlyPluginOptions {\n\t/**\n\t * A unique key to identify the plugin instance. This is required if you\n\t * have multiple Fastly plugin instances in the same Vite configuration.\n\t *\n\t * @default \"vite-plugin-fastly\"\n\t */\n\tuniqueName?: string;\n\n\t/**\n\t * Vite environment name that the Fastly plugin should configure.\n\t *\n\t * @default \"ssr\"\n\t */\n\tviteEnvironmentName?: string;\n\n\t/**\n\t * Function that returns the command to build the Fastly Module Runner.\n\t * The callback receives the input and output file paths.\n\t *\n\t * @default (input, output) => `js-compute-runtime ${input} ${output}`\n\t */\n\tgetRunnerBuildCommand?: (input: string, output: string) => string;\n\n\t/**\n\t * IPv4 address of the Fastly Dev Server to proxy requests to during development.\n\t * If you have multiple Fastly plugin instances, make sure each instance uses\n\t * a unique address.\n\t *\n\t * @default \"127.0.0.1:7676\"\n\t */\n\tfastlyDevServerAddress?: string;\n\n\t/**\n\t * Function that returns the command to launch the Fastly Dev Server.\n\t * The callback receives the compiled wasm file path and the address to bind to.\n\t *\n\t * @default (wasmFile, address) => `fastly compute serve --file=${wasmFile} --addr=${address}`\n\t */\n\tgetLaunchDevServerCommand?: (wasmFile: string, address: string) => string;\n\n\t/**\n\t * Options to pass to the HTTP proxy server.\n\t *\n\t * @default {}\n\t */\n\tproxyOptions?: ServerOptions;\n}\n\n// Map of uniqueName to Fastly Dev Server child processes\nconst fastlyProcesses = new Map<string, ChildProcess>();\n\nexport function fastly(options: FastlyPluginOptions = {}): Plugin[] {\n\tconst {\n\t\tuniqueName = \"vite-plugin-fastly\",\n\t\tviteEnvironmentName = \"ssr\",\n\t\tfastlyDevServerAddress = \"127.0.0.1:7676\",\n\t\tgetRunnerBuildCommand = (input: string, output: string) =>\n\t\t\t`js-compute-runtime ${input} ${output}`,\n\t\tgetLaunchDevServerCommand = (wasmFile, address) =>\n\t\t\t`fastly compute serve --file=${wasmFile} --addr=${address}`,\n\t\tproxyOptions = {},\n\t} = options;\n\n\tlet command: \"serve\" | \"build\";\n\tlet handlerEntry: string | undefined;\n\tlet fastlyProcessKilled = false;\n\tlet clientConfigured = false;\n\tlet buildCommand: string | undefined;\n\n\treturn [\n\t\texposeEnvironment(),\n\t\t{\n\t\t\tname: uniqueName,\n\n\t\t\tconfig(_, env) {\n\t\t\t\treturn {\n\t\t\t\t\tenvironments: {\n\t\t\t\t\t\t[viteEnvironmentName]: {\n\t\t\t\t\t\t\toptimizeDeps: {\n\t\t\t\t\t\t\t\tnoDiscovery: false,\n\t\t\t\t\t\t\t\texclude: [\n\t\t\t\t\t\t\t\t\t\"fastly:acl\",\n\t\t\t\t\t\t\t\t\t\"fastly:backend\",\n\t\t\t\t\t\t\t\t\t\"fastly:cache\",\n\t\t\t\t\t\t\t\t\t\"fastly:cache-override\",\n\t\t\t\t\t\t\t\t\t\"fastly:compute\",\n\t\t\t\t\t\t\t\t\t\"fastly:config-store\",\n\t\t\t\t\t\t\t\t\t\"fastly:device\",\n\t\t\t\t\t\t\t\t\t\"fastly:dictionary\",\n\t\t\t\t\t\t\t\t\t\"fastly:edge-rate-limiter\",\n\t\t\t\t\t\t\t\t\t\"fastly:env\",\n\t\t\t\t\t\t\t\t\t\"fastly:experimental\",\n\t\t\t\t\t\t\t\t\t\"fastly:fanout\",\n\t\t\t\t\t\t\t\t\t\"fastly:geolocation\",\n\t\t\t\t\t\t\t\t\t\"fastly:html-rewriter\",\n\t\t\t\t\t\t\t\t\t\"fastly:image-optimizer\",\n\t\t\t\t\t\t\t\t\t\"fastly:kv-store\",\n\t\t\t\t\t\t\t\t\t\"fastly:logger\",\n\t\t\t\t\t\t\t\t\t\"fastly:secret-store\",\n\t\t\t\t\t\t\t\t\t\"fastly:websocket\",\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tesbuildOptions: {\n\t\t\t\t\t\t\t\t\tplatform: \"neutral\",\n\t\t\t\t\t\t\t\t\tminify: true,\n\t\t\t\t\t\t\t\t\tdefine: {\n\t\t\t\t\t\t\t\t\t\t\"process.env.NODE_ENV\": JSON.stringify(env.mode),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tresolve: {\n\t\t\t\t\t\t\t\tbuiltins: [/^fastly:/],\n\t\t\t\t\t\t\t\tnoExternal: true,\n\t\t\t\t\t\t\t\tconditions: [\"fastly\", \"workerd\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuild: {\n\t\t\t\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\t\t\t\tinlineDynamicImports: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdev: {},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tapi: {\n\t\t\t\tfastly: {\n\t\t\t\t\taddress: fastlyDevServerAddress,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\tconfigResolved(config) {\n\t\t\t\tcommand = config.command;\n\t\t\t\tif (command !== \"serve\") return;\n\n\t\t\t\t// Scan plugins for multiple instances with the same uniqueName\n\t\t\t\tlet sameNameInstanceCount = 0;\n\t\t\t\tlet sameAddressInstanceCount = 0;\n\t\t\t\tfor (const plugin of config.plugins) {\n\t\t\t\t\tif (plugin.name === uniqueName) {\n\t\t\t\t\t\tsameNameInstanceCount++;\n\t\t\t\t\t}\n\t\t\t\t\tif (plugin.api?.fastly?.address === fastlyDevServerAddress) {\n\t\t\t\t\t\tsameAddressInstanceCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (sameNameInstanceCount > 1) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`[vite-plugin-fastly] Multiple Fastly plugin instances with the same uniqueName \"${uniqueName}\" detected.`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`[vite-plugin-fastly] If you really need multiple instances, give each instance a unique \"uniqueName\".`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (sameAddressInstanceCount > 1) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`[vite-plugin-fastly] Multiple Fastly plugin instances configured to use the same Fastly Dev Server address \"${fastlyDevServerAddress}\".`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`[vite-plugin-fastly] If you really need multiple instances, give each instance a unique \"fastlyDevServerAddress\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (sameNameInstanceCount > 1 || sameAddressInstanceCount > 1) {\n\t\t\t\t\t// This is a fatal error, we cannot continue\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tconst clientInput =\n\t\t\t\t\tconfig.environments.client?.build.rollupOptions.input;\n\t\t\t\tif (typeof clientInput === \"string\") {\n\t\t\t\t\tclientConfigured = true;\n\t\t\t\t} else if (Array.isArray(clientInput) && clientInput.length > 0) {\n\t\t\t\t\tclientConfigured = true;\n\t\t\t\t} else if (\n\t\t\t\t\ttypeof clientInput === \"object\" &&\n\t\t\t\t\tclientInput !== null &&\n\t\t\t\t\tObject.keys(clientInput).length > 0\n\t\t\t\t) {\n\t\t\t\t\tclientConfigured = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tasync configEnvironment(name, config, env) {\n\t\t\t\tif (name !== viteEnvironmentName || env.command !== \"serve\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst input = config.build?.rollupOptions?.input;\n\t\t\t\tif (typeof input === \"string\") {\n\t\t\t\t\thandlerEntry = input;\n\t\t\t\t} else if (Array.isArray(input)) {\n\t\t\t\t\thandlerEntry = input[0];\n\t\t\t\t} else if (typeof input === \"object\" && input !== null) {\n\t\t\t\t\tconst values = Object.values(input);\n\t\t\t\t\thandlerEntry = values[0];\n\t\t\t\t}\n\n\t\t\t\tif (!handlerEntry) {\n\t\t\t\t\treturn this.error(\n\t\t\t\t\t\t`[${uniqueName}] No entry point found in Rollup options. Please specify an input in environments.${viteEnvironmentName}.build.rollupOptions.input.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Kill previous Fastly Dev Server process if any\n\t\t\t\tfastlyProcessKilled = true;\n\t\t\t\tawait killProcessAndChildren(this, uniqueName);\n\n\t\t\t\tconst wasmFile = buildDevRunnerIfNecessary(\n\t\t\t\t\tthis,\n\t\t\t\t\tuniqueName,\n\t\t\t\t\tgetRunnerBuildCommand,\n\t\t\t\t);\n\n\t\t\t\tconst launchCommand = getLaunchDevServerCommand(\n\t\t\t\t\twasmFile,\n\t\t\t\t\tfastlyDevServerAddress,\n\t\t\t\t);\n\n\t\t\t\tthis.info(`[${uniqueName}] Launching Fastly Dev Server with command:`);\n\t\t\t\tthis.info(`[${uniqueName}] ${launchCommand}`);\n\t\t\t\tconst fastlyDevServerProcess = spawn(launchCommand, {\n\t\t\t\t\tshell: true,\n\t\t\t\t\tstdio: \"inherit\",\n\t\t\t\t});\n\n\t\t\t\tfastlyProcesses.set(uniqueName, fastlyDevServerProcess);\n\n\t\t\t\t// Wait until server is ready\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tconst checkInterval = 500;\n\t\t\t\t\tconst maxAttempts = 60; // 30 seconds\n\t\t\t\t\tlet attempts = 0;\n\n\t\t\t\t\tconst interval = setInterval(async () => {\n\t\t\t\t\t\tattempts++;\n\t\t\t\t\t\tif (attempts > maxAttempts) {\n\t\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t\t`[${uniqueName}] Fastly Dev Server did not become ready in time.`,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst response = await fetch(\n\t\t\t\t\t\t\t\t`http://${fastlyDevServerAddress}/@vite-plugin-fastly/ready`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Ignore errors, server is not ready yet\n\t\t\t\t\t\t}\n\t\t\t\t\t}, checkInterval);\n\t\t\t\t});\n\n\t\t\t\tthis.info(\n\t\t\t\t\t`[${uniqueName}] Fastly Dev Server is running at http://${fastlyDevServerAddress}`,\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tasync writeBundle(outputOptions, bundle) {\n\t\t\t\tif (\n\t\t\t\t\tcommand !== \"build\" ||\n\t\t\t\t\tthis.environment.name !== viteEnvironmentName\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst jsFile = Object.values(bundle).find(\n\t\t\t\t\t(file) => file.type === \"chunk\" && file.isEntry,\n\t\t\t\t);\n\t\t\t\tif (!jsFile) {\n\t\t\t\t\tthrow new Error(`[${uniqueName}] No JS entry chunk found in bundle.`);\n\t\t\t\t}\n\n\t\t\t\tconst input = outputOptions.dir + \"/\" + jsFile.fileName;\n\t\t\t\tconst output = outputOptions.dir + \"/app.wasm\";\n\n\t\t\t\tbuildCommand = `js-compute-runtime ${input} ${output}`;\n\t\t\t},\n\n\t\t\tasync closeBundle(error) {\n\t\t\t\tif (\n\t\t\t\t\terror ||\n\t\t\t\t\tcommand !== \"build\" ||\n\t\t\t\t\tthis.environment.name !== viteEnvironmentName\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.info(`Building Fastly WASM module with command:`);\n\t\t\t\tthis.info(buildCommand!);\n\t\t\t\texecSync(buildCommand!, { stdio: \"inherit\" });\n\t\t\t},\n\n\t\t\tasync buildEnd() {\n\t\t\t\tif (command === \"build\" || fastlyProcessKilled) return;\n\t\t\t\tfastlyProcessKilled = true;\n\t\t\t\tawait killProcessAndChildren(this, uniqueName);\n\t\t\t},\n\n\t\t\tconfigureServer(server) {\n\t\t\t\tconst environment = server.environments[viteEnvironmentName]!;\n\t\t\t\tlet address: string | null = null;\n\n\t\t\t\tserver.httpServer?.on(\"listening\", () => {\n\t\t\t\t\taddress = getServerAddress(server.httpServer);\n\t\t\t\t});\n\n\t\t\t\tserver.httpServer?.on(\"close\", () => {\n\t\t\t\t\taddress = null;\n\t\t\t\t});\n\n\t\t\t\t// Transport endpoint for the runner\n\t\t\t\tserver.middlewares.use((req, res, next) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\treq.method !== \"POST\" ||\n\t\t\t\t\t\treq.url !== \"/@vite-plugin-fastly/transport\"\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn next();\n\t\t\t\t\t}\n\n\t\t\t\t\tvoid (async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Read the body\n\t\t\t\t\t\t\tconst body = await readyBody(req);\n\t\t\t\t\t\t\tconst data = JSON.parse(body);\n\n\t\t\t\t\t\t\tconst result = await environment.hot.handleInvoke(data);\n\n\t\t\t\t\t\t\tres.setHeader(\"Content-Type\", \"application/json\");\n\t\t\t\t\t\t\tres.end(JSON.stringify(result));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treturn next(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t});\n\n\t\t\t\tconst proxy = createProxy(proxyOptions);\n\n\t\t\t\tconst proxyMiddleware: Connect.NextHandleFunction = (\n\t\t\t\t\treq,\n\t\t\t\t\tres,\n\t\t\t\t\tnext,\n\t\t\t\t) => {\n\t\t\t\t\tif (!address) {\n\t\t\t\t\t\treturn next(\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t`[${uniqueName}] Vite server address is not available for proxying`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tproxy.web(\n\t\t\t\t\t\t\treq,\n\t\t\t\t\t\t\tres,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttarget: `http://${fastlyDevServerAddress}`,\n\t\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t\t\"Vite-Plugin-Fastly-Vite-Server-Address\": address,\n\t\t\t\t\t\t\t\t\t\"Vite-Plugin-Fastly-Handler-Entry\": handlerEntry,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(error) => {\n\t\t\t\t\t\t\t\tnext(error);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tnext(error);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// If a client build is configured, add the proxy middleware after Vite's own middlewares.\n\t\t\t\t// Otherwise, assume a pure server-side setup and add the proxy as the first middleware.\n\t\t\t\tif (clientConfigured) {\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tserver.middlewares.use(proxyMiddleware);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tserver.middlewares.use(proxyMiddleware);\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t];\n}\n\nasync function readyBody(req: IncomingMessage): Promise<string> {\n\treturn new Promise<string>((resolve, reject) => {\n\t\tlet body = \"\";\n\t\treq.on(\"data\", (chunk) => {\n\t\t\tbody += chunk;\n\t\t});\n\n\t\treq.on(\"end\", () => {\n\t\t\tresolve(body);\n\t\t});\n\n\t\treq.on(\"error\", (err) => {\n\t\t\treject(err);\n\t\t});\n\t});\n}\n\nfunction getServerAddress(server: HttpServer | null): string | null {\n\tconst address = server?.address();\n\tif (!address) {\n\t\treturn null;\n\t}\n\n\tlet host: string;\n\n\tif (typeof address === \"string\") {\n\t\thost = address;\n\t} else {\n\t\tswitch (address.address) {\n\t\t\tcase \"127.0.0.1\":\n\t\t\tcase \"::\":\n\t\t\tcase \"::1\":\n\t\t\tcase \"0000:0000:0000:0000:0000:0000:0000:0001\":\n\t\t\t\thost = \"localhost\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thost = address.address;\n\t\t}\n\n\t\thost = `http://${host}:${address.port}`;\n\t}\n\n\treturn host;\n}\n\nfunction buildDevRunnerIfNecessary(\n\tctx: ConfigPluginContext,\n\tuniqueName: string,\n\tgetCommand: (input: string, output: string) => string,\n): string {\n\tconst jsComputeRuntimeVersion = getJsComputeRuntimeVersion(uniqueName);\n\tconst input = \"node_modules/vite-plugin-fastly/dist/runner.js\";\n\tconst output = `node_modules/.vite-plugin-fastly/runner.${jsComputeRuntimeVersion}.wasm`;\n\n\tconst inputStat = fs.statSync(input);\n\tconst outputStat = statOrNull(output);\n\n\tif (\n\t\toutputStat &&\n\t\toutputStat.isFile() &&\n\t\toutputStat.mtimeMs >= inputStat.mtimeMs\n\t) {\n\t\t// Up to date\n\t\treturn output;\n\t}\n\n\tctx.info(`[${uniqueName}] Building Fastly Module Runner for dev server...`);\n\n\texecSync(getCommand(input, output), { stdio: \"inherit\" });\n\n\treturn output;\n}\n\nfunction getJsComputeRuntimeVersion(uniqueName: string): string {\n\tconst output = execSync(\"js-compute-runtime --version\").toString();\n\n\t// Parse version from something like \"js-compute-runtime-cli.js 3.38.2\\n\"\n\tconst lastSpaceIndex = output.lastIndexOf(\" \");\n\tif (lastSpaceIndex === -1) {\n\t\tthrow new Error(\n\t\t\t`[${uniqueName}] Unexpected js-compute-runtime version output: ${output}`,\n\t\t);\n\t}\n\n\treturn output.slice(lastSpaceIndex + 1).trim();\n}\n\nfunction statOrNull(path: string): fs.Stats | null {\n\ttry {\n\t\treturn fs.statSync(path);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function killProcessAndChildren(\n\tctx: {\n\t\tinfo: (msg: string) => void;\n\t},\n\tname: string,\n) {\n\tconst proc = fastlyProcesses.get(name);\n\tif (!proc) return;\n\n\tfastlyProcesses.delete(name);\n\n\tconst pid = proc.pid;\n\tif (!pid || proc.exitCode) return;\n\n\tctx.info(`\\n[${name}] Shutting down Fastly dev server`);\n\n\tawait treeKill(pid, \"SIGINT\");\n\n\tawait new Promise<void>((resolve) => {\n\t\tproc.on(\"exit\", () => resolve());\n\t\tproc.on(\"error\", () => resolve());\n\t});\n}\n\nlet killAllInProgress = false;\n\nasync function killAll() {\n\tkillAllInProgress = true;\n\tconst promises: Promise<void>[] = [];\n\tfor (const name of fastlyProcesses.keys()) {\n\t\tpromises.push(\n\t\t\tkillProcessAndChildren(\n\t\t\t\t{\n\t\t\t\t\tinfo: (msg: string) => {\n\t\t\t\t\t\tprocess.stdout.write(msg + \"\\n\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tname,\n\t\t\t),\n\t\t);\n\t}\n\tawait Promise.all(promises);\n}\n\nprocess.on(\"SIGINT\", async () => {\n\tif (!killAllInProgress) {\n\t\tvoid killAll().finally(() => {\n\t\t\tprocess.exit(0);\n\t\t});\n\t}\n});\n","import type { Plugin } from \"vite\";\n\nexport default function exposeEnvironment(): Plugin {\n\tlet devServerUrl: string | undefined;\n\tlet command: \"serve\" | \"build\";\n\n\tfunction getModuleContents(environmentName: string) {\n\t\tconst url = devServerUrl ? JSON.stringify(devServerUrl) : \"undefined\";\n\n\t\treturn (\n\t\t\t`export const name = ${JSON.stringify(environmentName)}\\n` +\n\t\t\t`export const command = ${JSON.stringify(command)}\\n` +\n\t\t\t`export const devServerUrl = ${url}`\n\t\t);\n\t}\n\n\treturn {\n\t\tname: \"vite-plugin-fastly/expose-environment\",\n\n\t\tenforce: \"pre\",\n\n\t\tresolveId: {\n\t\t\tfilter: {\n\t\t\t\tid: /^vite-plugin-fastly:environment$/,\n\t\t\t},\n\t\t\thandler(source) {\n\t\t\t\tif (source === \"vite-plugin-fastly:environment\") {\n\t\t\t\t\treturn \"\\0virtual:vite-plugin-fastly:environment\";\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\tload: {\n\t\t\tfilter: {\n\t\t\t\tid: /^\\0virtual:vite-plugin-fastly:environment$/,\n\t\t\t},\n\t\t\thandler(id) {\n\t\t\t\tif (id !== \"\\0virtual:vite-plugin-fastly:environment\") return;\n\t\t\t\treturn getModuleContents(this.environment.name);\n\t\t\t},\n\t\t},\n\n\t\tconfigResolved(config) {\n\t\t\tcommand = config.command;\n\t\t},\n\n\t\tconfigureServer(server) {\n\t\t\tserver.httpServer?.once(\"listening\", () => {\n\t\t\t\tdevServerUrl = server.resolvedUrls?.local[0];\n\t\t\t});\n\t\t},\n\t} satisfies Plugin;\n}\n"],"mappings":";AACA,SAAS,mBAAuC;AAEhD,OAAO,QAAQ;AACf,SAAuB,UAAU,aAAa;AAC9C,OAAO,cAAc;;;ACHN,SAAR,oBAA6C;AACnD,MAAI;AACJ,MAAI;AAEJ,WAAS,kBAAkB,iBAAyB;AACnD,UAAM,MAAM,eAAe,KAAK,UAAU,YAAY,IAAI;AAE1D,WACC,uBAAuB,KAAK,UAAU,eAAe,CAAC;AAAA,yBAC5B,KAAK,UAAU,OAAO,CAAC;AAAA,8BAClB,GAAG;AAAA,EAEpC;AAEA,SAAO;AAAA,IACN,MAAM;AAAA,IAEN,SAAS;AAAA,IAET,WAAW;AAAA,MACV,QAAQ;AAAA,QACP,IAAI;AAAA,MACL;AAAA,MACA,QAAQ,QAAQ;AACf,YAAI,WAAW,kCAAkC;AAChD,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAAA,IAEA,MAAM;AAAA,MACL,QAAQ;AAAA,QACP,IAAI;AAAA,MACL;AAAA,MACA,QAAQ,IAAI;AACX,YAAI,OAAO,2CAA4C;AACvD,eAAO,kBAAkB,KAAK,YAAY,IAAI;AAAA,MAC/C;AAAA,IACD;AAAA,IAEA,eAAe,QAAQ;AACtB,gBAAU,OAAO;AAAA,IAClB;AAAA,IAEA,gBAAgB,QAAQ;AACvB,aAAO,YAAY,KAAK,aAAa,MAAM;AAC1C,uBAAe,OAAO,cAAc,MAAM,CAAC;AAAA,MAC5C,CAAC;AAAA,IACF;AAAA,EACD;AACD;;;ADMA,IAAM,kBAAkB,oBAAI,IAA0B;AAE/C,SAAS,OAAO,UAA+B,CAAC,GAAa;AACnE,QAAM;AAAA,IACL,aAAa;AAAA,IACb,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,wBAAwB,CAAC,OAAe,WACvC,sBAAsB,KAAK,IAAI,MAAM;AAAA,IACtC,4BAA4B,CAAC,UAAU,YACtC,+BAA+B,QAAQ,WAAW,OAAO;AAAA,IAC1D,eAAe,CAAC;AAAA,EACjB,IAAI;AAEJ,MAAI;AACJ,MAAI;AACJ,MAAI,sBAAsB;AAC1B,MAAI,mBAAmB;AACvB,MAAI;AAEJ,SAAO;AAAA,IACN,kBAAkB;AAAA,IAClB;AAAA,MACC,MAAM;AAAA,MAEN,OAAO,GAAG,KAAK;AACd,eAAO;AAAA,UACN,cAAc;AAAA,YACb,CAAC,mBAAmB,GAAG;AAAA,cACtB,cAAc;AAAA,gBACb,aAAa;AAAA,gBACb,SAAS;AAAA,kBACR;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBACD;AAAA,gBACA,gBAAgB;AAAA,kBACf,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,QAAQ;AAAA,oBACP,wBAAwB,KAAK,UAAU,IAAI,IAAI;AAAA,kBAChD;AAAA,gBACD;AAAA,cACD;AAAA,cACA,SAAS;AAAA,gBACR,UAAU,CAAC,UAAU;AAAA,gBACrB,YAAY;AAAA,gBACZ,YAAY,CAAC,UAAU,SAAS;AAAA,cACjC;AAAA,cACA,OAAO;AAAA,gBACN,eAAe;AAAA,kBACd,QAAQ;AAAA,oBACP,sBAAsB;AAAA,kBACvB;AAAA,gBACD;AAAA,cACD;AAAA,cACA,KAAK,CAAC;AAAA,YACP;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,MAEA,KAAK;AAAA,QACJ,QAAQ;AAAA,UACP,SAAS;AAAA,QACV;AAAA,MACD;AAAA,MAEA,eAAe,QAAQ;AACtB,kBAAU,OAAO;AACjB,YAAI,YAAY,QAAS;AAGzB,YAAI,wBAAwB;AAC5B,YAAI,2BAA2B;AAC/B,mBAAW,UAAU,OAAO,SAAS;AACpC,cAAI,OAAO,SAAS,YAAY;AAC/B;AAAA,UACD;AACA,cAAI,OAAO,KAAK,QAAQ,YAAY,wBAAwB;AAC3D;AAAA,UACD;AAAA,QACD;AAEA,YAAI,wBAAwB,GAAG;AAC9B,kBAAQ;AAAA,YACP,mFAAmF,UAAU;AAAA,UAC9F;AACA,kBAAQ;AAAA,YACP;AAAA,UACD;AAAA,QACD;AAEA,YAAI,2BAA2B,GAAG;AACjC,kBAAQ;AAAA,YACP,+GAA+G,sBAAsB;AAAA,UACtI;AACA,kBAAQ;AAAA,YACP;AAAA,UACD;AAAA,QACD;AAEA,YAAI,wBAAwB,KAAK,2BAA2B,GAAG;AAE9D,kBAAQ,KAAK,CAAC;AAAA,QACf;AAEA,cAAM,cACL,OAAO,aAAa,QAAQ,MAAM,cAAc;AACjD,YAAI,OAAO,gBAAgB,UAAU;AACpC,6BAAmB;AAAA,QACpB,WAAW,MAAM,QAAQ,WAAW,KAAK,YAAY,SAAS,GAAG;AAChE,6BAAmB;AAAA,QACpB,WACC,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,OAAO,KAAK,WAAW,EAAE,SAAS,GACjC;AACD,6BAAmB;AAAA,QACpB;AAAA,MACD;AAAA,MAEA,MAAM,kBAAkB,MAAM,QAAQ,KAAK;AAC1C,YAAI,SAAS,uBAAuB,IAAI,YAAY,SAAS;AAC5D;AAAA,QACD;AAEA,cAAM,QAAQ,OAAO,OAAO,eAAe;AAC3C,YAAI,OAAO,UAAU,UAAU;AAC9B,yBAAe;AAAA,QAChB,WAAW,MAAM,QAAQ,KAAK,GAAG;AAChC,yBAAe,MAAM,CAAC;AAAA,QACvB,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACvD,gBAAM,SAAS,OAAO,OAAO,KAAK;AAClC,yBAAe,OAAO,CAAC;AAAA,QACxB;AAEA,YAAI,CAAC,cAAc;AAClB,iBAAO,KAAK;AAAA,YACX,IAAI,UAAU,qFAAqF,mBAAmB;AAAA,UACvH;AAAA,QACD;AAGA,8BAAsB;AACtB,cAAM,uBAAuB,MAAM,UAAU;AAE7C,cAAM,WAAW;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAEA,cAAM,gBAAgB;AAAA,UACrB;AAAA,UACA;AAAA,QACD;AAEA,aAAK,KAAK,IAAI,UAAU,6CAA6C;AACrE,aAAK,KAAK,IAAI,UAAU,KAAK,aAAa,EAAE;AAC5C,cAAM,yBAAyB,MAAM,eAAe;AAAA,UACnD,OAAO;AAAA,UACP,OAAO;AAAA,QACR,CAAC;AAED,wBAAgB,IAAI,YAAY,sBAAsB;AAGtD,cAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,gBAAM,gBAAgB;AACtB,gBAAM,cAAc;AACpB,cAAI,WAAW;AAEf,gBAAM,WAAW,YAAY,YAAY;AACxC;AACA,gBAAI,WAAW,aAAa;AAC3B,4BAAc,QAAQ;AACtB;AAAA,gBACC,IAAI;AAAA,kBACH,IAAI,UAAU;AAAA,gBACf;AAAA,cACD;AACA;AAAA,YACD;AAEA,gBAAI;AACH,oBAAM,WAAW,MAAM;AAAA,gBACtB,UAAU,sBAAsB;AAAA,cACjC;AACA,kBAAI,SAAS,IAAI;AAChB,8BAAc,QAAQ;AACtB,wBAAQ;AAAA,cACT;AAAA,YACD,QAAQ;AAAA,YAER;AAAA,UACD,GAAG,aAAa;AAAA,QACjB,CAAC;AAED,aAAK;AAAA,UACJ,IAAI,UAAU,4CAA4C,sBAAsB;AAAA,QACjF;AAAA,MACD;AAAA,MAEA,MAAM,YAAY,eAAe,QAAQ;AACxC,YACC,YAAY,WACZ,KAAK,YAAY,SAAS,qBACzB;AACD;AAAA,QACD;AAEA,cAAM,SAAS,OAAO,OAAO,MAAM,EAAE;AAAA,UACpC,CAAC,SAAS,KAAK,SAAS,WAAW,KAAK;AAAA,QACzC;AACA,YAAI,CAAC,QAAQ;AACZ,gBAAM,IAAI,MAAM,IAAI,UAAU,sCAAsC;AAAA,QACrE;AAEA,cAAM,QAAQ,cAAc,MAAM,MAAM,OAAO;AAC/C,cAAM,SAAS,cAAc,MAAM;AAEnC,uBAAe,sBAAsB,KAAK,IAAI,MAAM;AAAA,MACrD;AAAA,MAEA,MAAM,YAAY,OAAO;AACxB,YACC,SACA,YAAY,WACZ,KAAK,YAAY,SAAS,qBACzB;AACD;AAAA,QACD;AAEA,aAAK,KAAK,2CAA2C;AACrD,aAAK,KAAK,YAAa;AACvB,iBAAS,cAAe,EAAE,OAAO,UAAU,CAAC;AAAA,MAC7C;AAAA,MAEA,MAAM,WAAW;AAChB,YAAI,YAAY,WAAW,oBAAqB;AAChD,8BAAsB;AACtB,cAAM,uBAAuB,MAAM,UAAU;AAAA,MAC9C;AAAA,MAEA,gBAAgB,QAAQ;AACvB,cAAM,cAAc,OAAO,aAAa,mBAAmB;AAC3D,YAAI,UAAyB;AAE7B,eAAO,YAAY,GAAG,aAAa,MAAM;AACxC,oBAAU,iBAAiB,OAAO,UAAU;AAAA,QAC7C,CAAC;AAED,eAAO,YAAY,GAAG,SAAS,MAAM;AACpC,oBAAU;AAAA,QACX,CAAC;AAGD,eAAO,YAAY,IAAI,CAAC,KAAK,KAAK,SAAS;AAC1C,cACC,IAAI,WAAW,UACf,IAAI,QAAQ,kCACX;AACD,mBAAO,KAAK;AAAA,UACb;AAEA,gBAAM,YAAY;AACjB,gBAAI;AAEH,oBAAM,OAAO,MAAM,UAAU,GAAG;AAChC,oBAAM,OAAO,KAAK,MAAM,IAAI;AAE5B,oBAAM,SAAS,MAAM,YAAY,IAAI,aAAa,IAAI;AAEtD,kBAAI,UAAU,gBAAgB,kBAAkB;AAChD,kBAAI,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,YAC/B,SAAS,OAAO;AACf,qBAAO,KAAK,KAAK;AAAA,YAClB;AAAA,UACD,GAAG;AAAA,QACJ,CAAC;AAED,cAAM,QAAQ,YAAY,YAAY;AAEtC,cAAM,kBAA8C,CACnD,KACA,KACA,SACI;AACJ,cAAI,CAAC,SAAS;AACb,mBAAO;AAAA,cACN,IAAI;AAAA,gBACH,IAAI,UAAU;AAAA,cACf;AAAA,YACD;AAAA,UACD;AAEA,cAAI;AACH,kBAAM;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,gBACC,QAAQ,UAAU,sBAAsB;AAAA,gBACxC,SAAS;AAAA,kBACR,0CAA0C;AAAA,kBAC1C,oCAAoC;AAAA,gBACrC;AAAA,cACD;AAAA,cACA,CAAC,UAAU;AACV,qBAAK,KAAK;AAAA,cACX;AAAA,YACD;AAAA,UACD,SAAS,OAAO;AACf,iBAAK,KAAK;AAAA,UACX;AAAA,QACD;AAIA,YAAI,kBAAkB;AACrB,iBAAO,MAAM;AACZ,mBAAO,YAAY,IAAI,eAAe;AAAA,UACvC;AAAA,QACD,OAAO;AACN,iBAAO,YAAY,IAAI,eAAe;AAAA,QACvC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;AAEA,eAAe,UAAU,KAAuC;AAC/D,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC/C,QAAI,OAAO;AACX,QAAI,GAAG,QAAQ,CAAC,UAAU;AACzB,cAAQ;AAAA,IACT,CAAC;AAED,QAAI,GAAG,OAAO,MAAM;AACnB,cAAQ,IAAI;AAAA,IACb,CAAC;AAED,QAAI,GAAG,SAAS,CAAC,QAAQ;AACxB,aAAO,GAAG;AAAA,IACX,CAAC;AAAA,EACF,CAAC;AACF;AAEA,SAAS,iBAAiB,QAA0C;AACnE,QAAM,UAAU,QAAQ,QAAQ;AAChC,MAAI,CAAC,SAAS;AACb,WAAO;AAAA,EACR;AAEA,MAAI;AAEJ,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO;AAAA,EACR,OAAO;AACN,YAAQ,QAAQ,SAAS;AAAA,MACxB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACJ,eAAO;AACP;AAAA,MACD;AACC,eAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,UAAU,IAAI,IAAI,QAAQ,IAAI;AAAA,EACtC;AAEA,SAAO;AACR;AAEA,SAAS,0BACR,KACA,YACA,YACS;AACT,QAAM,0BAA0B,2BAA2B,UAAU;AACrE,QAAM,QAAQ;AACd,QAAM,SAAS,2CAA2C,uBAAuB;AAEjF,QAAM,YAAY,GAAG,SAAS,KAAK;AACnC,QAAM,aAAa,WAAW,MAAM;AAEpC,MACC,cACA,WAAW,OAAO,KAClB,WAAW,WAAW,UAAU,SAC/B;AAED,WAAO;AAAA,EACR;AAEA,MAAI,KAAK,IAAI,UAAU,mDAAmD;AAE1E,WAAS,WAAW,OAAO,MAAM,GAAG,EAAE,OAAO,UAAU,CAAC;AAExD,SAAO;AACR;AAEA,SAAS,2BAA2B,YAA4B;AAC/D,QAAM,SAAS,SAAS,8BAA8B,EAAE,SAAS;AAGjE,QAAM,iBAAiB,OAAO,YAAY,GAAG;AAC7C,MAAI,mBAAmB,IAAI;AAC1B,UAAM,IAAI;AAAA,MACT,IAAI,UAAU,mDAAmD,MAAM;AAAA,IACxE;AAAA,EACD;AAEA,SAAO,OAAO,MAAM,iBAAiB,CAAC,EAAE,KAAK;AAC9C;AAEA,SAAS,WAAW,MAA+B;AAClD,MAAI;AACH,WAAO,GAAG,SAAS,IAAI;AAAA,EACxB,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,eAAe,uBACd,KAGA,MACC;AACD,QAAM,OAAO,gBAAgB,IAAI,IAAI;AACrC,MAAI,CAAC,KAAM;AAEX,kBAAgB,OAAO,IAAI;AAE3B,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,OAAO,KAAK,SAAU;AAE3B,MAAI,KAAK;AAAA,GAAM,IAAI,mCAAmC;AAEtD,QAAM,SAAS,KAAK,QAAQ;AAE5B,QAAM,IAAI,QAAc,CAAC,YAAY;AACpC,SAAK,GAAG,QAAQ,MAAM,QAAQ,CAAC;AAC/B,SAAK,GAAG,SAAS,MAAM,QAAQ,CAAC;AAAA,EACjC,CAAC;AACF;AAEA,IAAI,oBAAoB;AAExB,eAAe,UAAU;AACxB,sBAAoB;AACpB,QAAM,WAA4B,CAAC;AACnC,aAAW,QAAQ,gBAAgB,KAAK,GAAG;AAC1C,aAAS;AAAA,MACR;AAAA,QACC;AAAA,UACC,MAAM,CAAC,QAAgB;AACtB,oBAAQ,OAAO,MAAM,MAAM,IAAI;AAAA,UAChC;AAAA,QACD;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,QAAM,QAAQ,IAAI,QAAQ;AAC3B;AAEA,QAAQ,GAAG,UAAU,YAAY;AAChC,MAAI,CAAC,mBAAmB;AACvB,SAAK,QAAQ,EAAE,QAAQ,MAAM;AAC5B,cAAQ,KAAK,CAAC;AAAA,IACf,CAAC;AAAA,EACF;AACD,CAAC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/plugin/plugin.ts","../src/plugin/expose-environment.ts"],"sourcesContent":["import type { ConfigPluginContext, Connect, HttpServer, Plugin } from \"vite\";\nimport { createProxy, type ServerOptions } from \"http-proxy-3\";\nimport type { IncomingMessage } from \"node:http\";\nimport fs from \"node:fs\";\nimport { ChildProcess, execSync, spawn } from \"node:child_process\";\nimport { launchAndTest, type LaunchAndTestCleanupFunction } from \"kill-em-all\";\nimport exposeEnvironment from \"./expose-environment\";\n\nexport interface FastlyPluginOptions {\n\t/**\n\t * A unique key to identify the plugin instance. This is required if you\n\t * have multiple Fastly plugin instances in the same Vite configuration.\n\t *\n\t * @default \"vite-plugin-fastly\"\n\t */\n\tuniqueName?: string;\n\n\t/**\n\t * Vite environment name that the Fastly plugin should configure.\n\t *\n\t * @default \"ssr\"\n\t */\n\tviteEnvironmentName?: string;\n\n\t/**\n\t * Function that returns the command to build the Fastly Module Runner.\n\t * The callback receives the input and output file paths.\n\t *\n\t * @default (input, output) => `js-compute-runtime ${input} ${output}`\n\t */\n\tgetRunnerBuildCommand?: (input: string, output: string) => string;\n\n\t/**\n\t * IPv4 address of the Fastly Dev Server to proxy requests to during development.\n\t * If you have multiple Fastly plugin instances, make sure each instance uses\n\t * a unique address.\n\t *\n\t * @default \"127.0.0.1:7676\"\n\t */\n\tfastlyDevServerAddress?: string;\n\n\t/**\n\t * Function that returns the command to launch the Fastly Dev Server.\n\t * The callback receives the compiled wasm file path and the address to bind to.\n\t *\n\t * @default (wasmFile, address) => `fastly compute serve --file=${wasmFile} --addr=${address}`\n\t */\n\tgetLaunchDevServerCommand?: (wasmFile: string, address: string) => string;\n\n\t/**\n\t * Options to pass to the HTTP proxy server.\n\t *\n\t * @default {}\n\t */\n\tproxyOptions?: ServerOptions;\n}\n\n// Map of uniqueName to Fastly Dev Server child processes\nconst fastlyProcesses = new Map<string, LaunchAndTestCleanupFunction>();\n\nexport function fastly(options: FastlyPluginOptions = {}): Plugin[] {\n\tconst {\n\t\tuniqueName = \"vite-plugin-fastly\",\n\t\tviteEnvironmentName = \"ssr\",\n\t\tfastlyDevServerAddress = \"127.0.0.1:7676\",\n\t\tgetRunnerBuildCommand = (input: string, output: string) =>\n\t\t\t`js-compute-runtime ${input} ${output}`,\n\t\tgetLaunchDevServerCommand = (wasmFile, address) =>\n\t\t\t`fastly compute serve --file=${wasmFile} --addr=${address}`,\n\t\tproxyOptions = {},\n\t} = options;\n\n\tlet command: \"serve\" | \"build\";\n\tlet handlerEntry: string | undefined;\n\tlet fastlyProcessKilled = false;\n\tlet clientConfigured = false;\n\tlet buildCommand: string | undefined;\n\n\treturn [\n\t\texposeEnvironment(),\n\t\t{\n\t\t\tname: uniqueName,\n\n\t\t\tconfig(_, env) {\n\t\t\t\treturn {\n\t\t\t\t\tenvironments: {\n\t\t\t\t\t\t[viteEnvironmentName]: {\n\t\t\t\t\t\t\toptimizeDeps: {\n\t\t\t\t\t\t\t\tnoDiscovery: false,\n\t\t\t\t\t\t\t\texclude: [\n\t\t\t\t\t\t\t\t\t\"fastly:acl\",\n\t\t\t\t\t\t\t\t\t\"fastly:backend\",\n\t\t\t\t\t\t\t\t\t\"fastly:cache\",\n\t\t\t\t\t\t\t\t\t\"fastly:cache-override\",\n\t\t\t\t\t\t\t\t\t\"fastly:compute\",\n\t\t\t\t\t\t\t\t\t\"fastly:config-store\",\n\t\t\t\t\t\t\t\t\t\"fastly:device\",\n\t\t\t\t\t\t\t\t\t\"fastly:dictionary\",\n\t\t\t\t\t\t\t\t\t\"fastly:edge-rate-limiter\",\n\t\t\t\t\t\t\t\t\t\"fastly:env\",\n\t\t\t\t\t\t\t\t\t\"fastly:experimental\",\n\t\t\t\t\t\t\t\t\t\"fastly:fanout\",\n\t\t\t\t\t\t\t\t\t\"fastly:geolocation\",\n\t\t\t\t\t\t\t\t\t\"fastly:html-rewriter\",\n\t\t\t\t\t\t\t\t\t\"fastly:image-optimizer\",\n\t\t\t\t\t\t\t\t\t\"fastly:kv-store\",\n\t\t\t\t\t\t\t\t\t\"fastly:logger\",\n\t\t\t\t\t\t\t\t\t\"fastly:secret-store\",\n\t\t\t\t\t\t\t\t\t\"fastly:websocket\",\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tesbuildOptions: {\n\t\t\t\t\t\t\t\t\tplatform: \"neutral\",\n\t\t\t\t\t\t\t\t\tminify: true,\n\t\t\t\t\t\t\t\t\tdefine: {\n\t\t\t\t\t\t\t\t\t\t\"process.env.NODE_ENV\": JSON.stringify(env.mode),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tresolve: {\n\t\t\t\t\t\t\t\tbuiltins: [/^fastly:/],\n\t\t\t\t\t\t\t\tnoExternal: true,\n\t\t\t\t\t\t\t\tconditions: [\"fastly\", \"workerd\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuild: {\n\t\t\t\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\t\t\t\tinlineDynamicImports: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdev: {},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tapi: {\n\t\t\t\tfastly: {\n\t\t\t\t\taddress: fastlyDevServerAddress,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\tconfigResolved(config) {\n\t\t\t\tcommand = config.command;\n\t\t\t\tif (command !== \"serve\") return;\n\n\t\t\t\t// Scan plugins for multiple instances with the same uniqueName\n\t\t\t\tlet sameNameInstanceCount = 0;\n\t\t\t\tlet sameAddressInstanceCount = 0;\n\t\t\t\tfor (const plugin of config.plugins) {\n\t\t\t\t\tif (plugin.name === uniqueName) {\n\t\t\t\t\t\tsameNameInstanceCount++;\n\t\t\t\t\t}\n\t\t\t\t\tif (plugin.api?.fastly?.address === fastlyDevServerAddress) {\n\t\t\t\t\t\tsameAddressInstanceCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (sameNameInstanceCount > 1) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`[vite-plugin-fastly] Multiple Fastly plugin instances with the same uniqueName \"${uniqueName}\" detected.`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`[vite-plugin-fastly] If you really need multiple instances, give each instance a unique \"uniqueName\".`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (sameAddressInstanceCount > 1) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`[vite-plugin-fastly] Multiple Fastly plugin instances configured to use the same Fastly Dev Server address \"${fastlyDevServerAddress}\".`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`[vite-plugin-fastly] If you really need multiple instances, give each instance a unique \"fastlyDevServerAddress\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (sameNameInstanceCount > 1 || sameAddressInstanceCount > 1) {\n\t\t\t\t\t// This is a fatal error, we cannot continue\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tconst clientInput =\n\t\t\t\t\tconfig.environments.client?.build.rollupOptions.input;\n\t\t\t\tif (typeof clientInput === \"string\") {\n\t\t\t\t\tclientConfigured = true;\n\t\t\t\t} else if (Array.isArray(clientInput) && clientInput.length > 0) {\n\t\t\t\t\tclientConfigured = true;\n\t\t\t\t} else if (\n\t\t\t\t\ttypeof clientInput === \"object\" &&\n\t\t\t\t\tclientInput !== null &&\n\t\t\t\t\tObject.keys(clientInput).length > 0\n\t\t\t\t) {\n\t\t\t\t\tclientConfigured = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tasync configEnvironment(name, config, env) {\n\t\t\t\tif (name !== viteEnvironmentName || env.command !== \"serve\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst input = config.build?.rollupOptions?.input;\n\t\t\t\tif (typeof input === \"string\") {\n\t\t\t\t\thandlerEntry = input;\n\t\t\t\t} else if (Array.isArray(input)) {\n\t\t\t\t\thandlerEntry = input[0];\n\t\t\t\t} else if (typeof input === \"object\" && input !== null) {\n\t\t\t\t\tconst values = Object.values(input);\n\t\t\t\t\thandlerEntry = values[0];\n\t\t\t\t}\n\n\t\t\t\tif (!handlerEntry) {\n\t\t\t\t\treturn this.error(\n\t\t\t\t\t\t`[${uniqueName}] No entry point found in Rollup options. Please specify an input in environments.${viteEnvironmentName}.build.rollupOptions.input.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Kill previous Fastly Dev Server process if any\n\t\t\t\tfastlyProcessKilled = true;\n\t\t\t\tawait doKillProcesses(this, uniqueName);\n\n\t\t\t\tconst wasmFile = buildDevRunnerIfNecessary(\n\t\t\t\t\tthis,\n\t\t\t\t\tuniqueName,\n\t\t\t\t\tgetRunnerBuildCommand,\n\t\t\t\t);\n\n\t\t\t\tconst launchCommand = getLaunchDevServerCommand(\n\t\t\t\t\twasmFile,\n\t\t\t\t\tfastlyDevServerAddress,\n\t\t\t\t);\n\n\t\t\t\tthis.info(`[${uniqueName}] Launching Fastly Dev Server with command:`);\n\t\t\t\tthis.info(`[${uniqueName}] ${launchCommand}`);\n\t\t\t\tconst fastlyDevServerProcess = await spawnCommand(launchCommand);\n\n\t\t\t\tconst kill = await launchAndTest(\n\t\t\t\t\tfastlyDevServerProcess,\n\t\t\t\t\t`http://${fastlyDevServerAddress}/@vite-plugin-fastly/ready`,\n\t\t\t\t);\n\n\t\t\t\tfastlyProcesses.set(uniqueName, kill);\n\n\t\t\t\tthis.info(\n\t\t\t\t\t`[${uniqueName}] Fastly Dev Server is running at http://${fastlyDevServerAddress}`,\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tasync writeBundle(outputOptions, bundle) {\n\t\t\t\tif (\n\t\t\t\t\tcommand !== \"build\" ||\n\t\t\t\t\tthis.environment.name !== viteEnvironmentName\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst jsFile = Object.values(bundle).find(\n\t\t\t\t\t(file) => file.type === \"chunk\" && file.isEntry,\n\t\t\t\t);\n\t\t\t\tif (!jsFile) {\n\t\t\t\t\tthrow new Error(`[${uniqueName}] No JS entry chunk found in bundle.`);\n\t\t\t\t}\n\n\t\t\t\tconst input = outputOptions.dir + \"/\" + jsFile.fileName;\n\t\t\t\tconst output = outputOptions.dir + \"/app.wasm\";\n\n\t\t\t\tbuildCommand = `js-compute-runtime ${input} ${output}`;\n\t\t\t},\n\n\t\t\tasync closeBundle(error) {\n\t\t\t\tif (\n\t\t\t\t\terror ||\n\t\t\t\t\tcommand !== \"build\" ||\n\t\t\t\t\tthis.environment.name !== viteEnvironmentName\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.info(`Building Fastly WASM module with command:`);\n\t\t\t\tthis.info(buildCommand!);\n\t\t\t\texecSync(buildCommand!, { stdio: \"inherit\" });\n\t\t\t},\n\n\t\t\tasync buildEnd() {\n\t\t\t\tif (command === \"build\" || fastlyProcessKilled) return;\n\t\t\t\tfastlyProcessKilled = true;\n\t\t\t\tawait doKillProcesses(this, uniqueName);\n\t\t\t},\n\n\t\t\tconfigureServer(server) {\n\t\t\t\tconst environment = server.environments[viteEnvironmentName]!;\n\t\t\t\tlet address: string | null = null;\n\n\t\t\t\tserver.httpServer?.on(\"listening\", () => {\n\t\t\t\t\taddress = getServerAddress(server.httpServer);\n\t\t\t\t});\n\n\t\t\t\tserver.httpServer?.on(\"close\", () => {\n\t\t\t\t\taddress = null;\n\t\t\t\t});\n\n\t\t\t\t// Transport endpoint for the runner\n\t\t\t\tserver.middlewares.use((req, res, next) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\treq.method !== \"POST\" ||\n\t\t\t\t\t\treq.url !== \"/@vite-plugin-fastly/transport\"\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn next();\n\t\t\t\t\t}\n\n\t\t\t\t\tvoid (async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Read the body\n\t\t\t\t\t\t\tconst body = await readyBody(req);\n\t\t\t\t\t\t\tconst data = JSON.parse(body);\n\n\t\t\t\t\t\t\tconst result = await environment.hot.handleInvoke(data);\n\n\t\t\t\t\t\t\tres.setHeader(\"Content-Type\", \"application/json\");\n\t\t\t\t\t\t\tres.end(JSON.stringify(result));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treturn next(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t});\n\n\t\t\t\tconst proxy = createProxy(proxyOptions);\n\n\t\t\t\tconst proxyMiddleware: Connect.NextHandleFunction = (\n\t\t\t\t\treq,\n\t\t\t\t\tres,\n\t\t\t\t\tnext,\n\t\t\t\t) => {\n\t\t\t\t\tif (!address) {\n\t\t\t\t\t\treturn next(\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t`[${uniqueName}] Vite server address is not available for proxying`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tproxy.web(\n\t\t\t\t\t\t\treq,\n\t\t\t\t\t\t\tres,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttarget: `http://${fastlyDevServerAddress}`,\n\t\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t\t\"Vite-Plugin-Fastly-Vite-Server-Address\": address,\n\t\t\t\t\t\t\t\t\t\"Vite-Plugin-Fastly-Handler-Entry\": handlerEntry,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(error) => {\n\t\t\t\t\t\t\t\tnext(error);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tnext(error);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// If a client build is configured, add the proxy middleware after Vite's own middlewares.\n\t\t\t\t// Otherwise, assume a pure server-side setup and add the proxy as the first middleware.\n\t\t\t\tif (clientConfigured) {\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tserver.middlewares.use(proxyMiddleware);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tserver.middlewares.use(proxyMiddleware);\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t];\n}\n\nasync function readyBody(req: IncomingMessage): Promise<string> {\n\treturn new Promise<string>((resolve, reject) => {\n\t\tlet body = \"\";\n\t\treq.on(\"data\", (chunk) => {\n\t\t\tbody += chunk;\n\t\t});\n\n\t\treq.on(\"end\", () => {\n\t\t\tresolve(body);\n\t\t});\n\n\t\treq.on(\"error\", (err) => {\n\t\t\treject(err);\n\t\t});\n\t});\n}\n\nfunction getServerAddress(server: HttpServer | null): string | null {\n\tconst address = server?.address();\n\tif (!address) {\n\t\treturn null;\n\t}\n\n\tlet host: string;\n\n\tif (typeof address === \"string\") {\n\t\thost = address;\n\t} else {\n\t\tswitch (address.address) {\n\t\t\tcase \"127.0.0.1\":\n\t\t\tcase \"::\":\n\t\t\tcase \"::1\":\n\t\t\tcase \"0000:0000:0000:0000:0000:0000:0000:0001\":\n\t\t\t\thost = \"localhost\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thost = address.address;\n\t\t}\n\n\t\thost = `http://${host}:${address.port}`;\n\t}\n\n\treturn host;\n}\n\nfunction buildDevRunnerIfNecessary(\n\tctx: ConfigPluginContext,\n\tuniqueName: string,\n\tgetCommand: (input: string, output: string) => string,\n): string {\n\tconst jsComputeRuntimeVersion = getJsComputeRuntimeVersion(uniqueName);\n\tconst input = \"node_modules/vite-plugin-fastly/dist/runner.js\";\n\tconst output = `node_modules/.vite-plugin-fastly/runner.${jsComputeRuntimeVersion}.wasm`;\n\n\tconst inputStat = fs.statSync(input);\n\tconst outputStat = statOrNull(output);\n\n\tif (\n\t\toutputStat &&\n\t\toutputStat.isFile() &&\n\t\toutputStat.mtimeMs >= inputStat.mtimeMs\n\t) {\n\t\t// Up to date\n\t\treturn output;\n\t}\n\n\tctx.info(`[${uniqueName}] Building Fastly Module Runner for dev server...`);\n\n\texecSync(getCommand(input, output), { stdio: \"inherit\" });\n\n\treturn output;\n}\n\nfunction getJsComputeRuntimeVersion(uniqueName: string): string {\n\tconst output = execSync(\"js-compute-runtime --version\").toString();\n\n\t// Parse version from something like \"js-compute-runtime-cli.js 3.38.2\\n\"\n\tconst lastSpaceIndex = output.lastIndexOf(\" \");\n\tif (lastSpaceIndex === -1) {\n\t\tthrow new Error(\n\t\t\t`[${uniqueName}] Unexpected js-compute-runtime version output: ${output}`,\n\t\t);\n\t}\n\n\treturn output.slice(lastSpaceIndex + 1).trim();\n}\n\nfunction statOrNull(path: string): fs.Stats | null {\n\ttry {\n\t\treturn fs.statSync(path);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function doKillProcesses(\n\tctx: {\n\t\tinfo: (msg: string) => void;\n\t},\n\tname: string,\n) {\n\tconst kill = fastlyProcesses.get(name);\n\tif (!kill) return;\n\n\tfastlyProcesses.delete(name);\n\n\tctx.info(`[${name}] Shutting down Fastly dev server`);\n\tawait kill();\n\tctx.info(`[${name}] Fastly dev server shut down`);\n}\n\nasync function spawnCommand(command: string): Promise<ChildProcess> {\n\tconst child = spawn(command, {\n\t\tshell: true,\n\t\tstdio: \"inherit\",\n\t});\n\n\treturn await new Promise((resolve, reject) => {\n\t\tchild.on(\"spawn\", () => {\n\t\t\tif (!child.pid) {\n\t\t\t\treturn reject(new Error(\"Failed to spawn process\"));\n\t\t\t}\n\n\t\t\tresolve(child);\n\t\t});\n\n\t\tchild.on(\"error\", (err) => {\n\t\t\treject(err);\n\t\t});\n\t});\n}\n\nlet killAllInProgress = false;\n\nasync function killAll() {\n\tkillAllInProgress = true;\n\tconst promises: Promise<void>[] = [];\n\tfor (const name of fastlyProcesses.keys()) {\n\t\tpromises.push(\n\t\t\tdoKillProcesses(\n\t\t\t\t{\n\t\t\t\t\tinfo: (msg: string) => {\n\t\t\t\t\t\tprocess.stdout.write(msg + \"\\n\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tname,\n\t\t\t),\n\t\t);\n\t}\n\tawait Promise.all(promises);\n}\n\nfunction cleanupOnExit() {\n\tif (!killAllInProgress) {\n\t\tvoid killAll().finally(() => {\n\t\t\tprocess.exit(0);\n\t\t});\n\t}\n}\n\nprocess.on(\"SIGINT\", cleanupOnExit);\nprocess.on(\"SIGTERM\", cleanupOnExit);\nprocess.on(\"exit\", cleanupOnExit);\n","import type { Plugin } from \"vite\";\n\nexport default function exposeEnvironment(): Plugin {\n\tlet devServerUrl: string | undefined;\n\tlet command: \"serve\" | \"build\";\n\n\tfunction getModuleContents(environmentName: string) {\n\t\tconst url = devServerUrl ? JSON.stringify(devServerUrl) : \"undefined\";\n\n\t\treturn (\n\t\t\t`export const name = ${JSON.stringify(environmentName)}\\n` +\n\t\t\t`export const command = ${JSON.stringify(command)}\\n` +\n\t\t\t`export const devServerUrl = ${url}`\n\t\t);\n\t}\n\n\treturn {\n\t\tname: \"vite-plugin-fastly/expose-environment\",\n\n\t\tenforce: \"pre\",\n\n\t\tresolveId: {\n\t\t\tfilter: {\n\t\t\t\tid: /^vite-plugin-fastly:environment$/,\n\t\t\t},\n\t\t\thandler(source) {\n\t\t\t\tif (source === \"vite-plugin-fastly:environment\") {\n\t\t\t\t\treturn \"\\0virtual:vite-plugin-fastly:environment\";\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\tload: {\n\t\t\tfilter: {\n\t\t\t\tid: /^\\0virtual:vite-plugin-fastly:environment$/,\n\t\t\t},\n\t\t\thandler(id) {\n\t\t\t\tif (id !== \"\\0virtual:vite-plugin-fastly:environment\") return;\n\t\t\t\treturn getModuleContents(this.environment.name);\n\t\t\t},\n\t\t},\n\n\t\tconfigResolved(config) {\n\t\t\tcommand = config.command;\n\t\t},\n\n\t\tconfigureServer(server) {\n\t\t\tserver.httpServer?.once(\"listening\", () => {\n\t\t\t\tdevServerUrl = server.resolvedUrls?.local[0];\n\t\t\t});\n\t\t},\n\t} satisfies Plugin;\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vite-plugin-fastly",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -44,11 +44,11 @@
|
|
|
44
44
|
"publint": "^0.3.16",
|
|
45
45
|
"tsup": "^8.5.1",
|
|
46
46
|
"typescript": "^5.9.3",
|
|
47
|
-
"vite": "
|
|
47
|
+
"vite": "7.3.1"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"http-proxy-3": "^1.23.2",
|
|
51
|
-
"
|
|
51
|
+
"kill-em-all": "0.0.3"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "tsup --clean",
|