@cloudflare/vite-plugin 0.0.0-a783c2d27 → 0.0.0-aa3675bf7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -34
- package/dist/asset-workers/asset-worker.js +726 -671
- package/dist/asset-workers/router-worker.js +278 -268
- package/dist/index.d.ts +8 -1
- package/dist/index.js +391 -224
- package/dist/runner-worker/index.js +15 -3
- package/package.json +9 -9
package/dist/index.js
CHANGED
|
@@ -3,16 +3,6 @@ import assert7 from "node:assert";
|
|
|
3
3
|
import * as fs4 from "node:fs";
|
|
4
4
|
import * as path6 from "node:path";
|
|
5
5
|
import { createMiddleware } from "@hattip/adapter-node";
|
|
6
|
-
import { Miniflare } from "miniflare";
|
|
7
|
-
import "vite";
|
|
8
|
-
|
|
9
|
-
// src/cloudflare-environment.ts
|
|
10
|
-
import assert from "node:assert";
|
|
11
|
-
import { builtinModules } from "node:module";
|
|
12
|
-
import * as vite2 from "vite";
|
|
13
|
-
|
|
14
|
-
// src/node-js-compat.ts
|
|
15
|
-
import { createRequire } from "node:module";
|
|
16
6
|
|
|
17
7
|
// ../../node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
|
|
18
8
|
var comma = ",".charCodeAt(0);
|
|
@@ -1078,7 +1068,17 @@ var MagicString = class _MagicString {
|
|
|
1078
1068
|
}
|
|
1079
1069
|
};
|
|
1080
1070
|
|
|
1071
|
+
// src/index.ts
|
|
1072
|
+
import { Miniflare } from "miniflare";
|
|
1073
|
+
import * as vite6 from "vite";
|
|
1074
|
+
|
|
1075
|
+
// src/cloudflare-environment.ts
|
|
1076
|
+
import assert from "node:assert";
|
|
1077
|
+
import { builtinModules } from "node:module";
|
|
1078
|
+
import * as vite2 from "vite";
|
|
1079
|
+
|
|
1081
1080
|
// src/node-js-compat.ts
|
|
1081
|
+
import { createRequire } from "node:module";
|
|
1082
1082
|
import { getNodeCompat } from "miniflare";
|
|
1083
1083
|
import * as unenv from "unenv";
|
|
1084
1084
|
var require2 = createRequire(import.meta.url);
|
|
@@ -1169,9 +1169,16 @@ function resolveNodeAliases(source, workerConfig) {
|
|
|
1169
1169
|
return alias;
|
|
1170
1170
|
}
|
|
1171
1171
|
|
|
1172
|
+
// src/constants.ts
|
|
1173
|
+
var ROUTER_WORKER_NAME = "__router-worker__";
|
|
1174
|
+
var ASSET_WORKER_NAME = "__asset-worker__";
|
|
1175
|
+
var ASSET_WORKERS_COMPATIBILITY_DATE = "2024-10-04";
|
|
1176
|
+
var MODULE_TYPES = ["CompiledWasm"];
|
|
1177
|
+
|
|
1172
1178
|
// src/shared.ts
|
|
1173
1179
|
var UNKNOWN_HOST = "http://localhost";
|
|
1174
1180
|
var INIT_PATH = "/__vite_plugin_cloudflare_init__";
|
|
1181
|
+
var MODULE_PATTERN = `__CLOUDFLARE_MODULE__(${MODULE_TYPES.join("|")})__(.*?)__`;
|
|
1175
1182
|
|
|
1176
1183
|
// src/utils.ts
|
|
1177
1184
|
import * as path from "node:path";
|
|
@@ -1268,7 +1275,10 @@ var CloudflareDevEnvironment = class extends vite2.DevEnvironment {
|
|
|
1268
1275
|
}
|
|
1269
1276
|
}
|
|
1270
1277
|
);
|
|
1271
|
-
assert(
|
|
1278
|
+
assert(
|
|
1279
|
+
response.ok,
|
|
1280
|
+
`Failed to initialize module runner, error: ${await response.text()}`
|
|
1281
|
+
);
|
|
1272
1282
|
const webSocket = response.webSocket;
|
|
1273
1283
|
assert(webSocket, "Failed to establish WebSocket");
|
|
1274
1284
|
webSocket.accept();
|
|
@@ -1281,6 +1291,7 @@ var cloudflareBuiltInModules = [
|
|
|
1281
1291
|
"cloudflare:workers",
|
|
1282
1292
|
"cloudflare:workflows"
|
|
1283
1293
|
];
|
|
1294
|
+
var defaultConditions = ["workerd", "module", "browser"];
|
|
1284
1295
|
function createCloudflareEnvironmentOptions(workerConfig, userConfig, environmentName) {
|
|
1285
1296
|
return {
|
|
1286
1297
|
resolve: {
|
|
@@ -1288,7 +1299,7 @@ function createCloudflareEnvironmentOptions(workerConfig, userConfig, environmen
|
|
|
1288
1299
|
// dependencies as not external
|
|
1289
1300
|
noExternal: true,
|
|
1290
1301
|
// We want to use `workerd` package exports if available (e.g. for postgres).
|
|
1291
|
-
conditions: [
|
|
1302
|
+
conditions: [...defaultConditions, "development|production"]
|
|
1292
1303
|
},
|
|
1293
1304
|
dev: {
|
|
1294
1305
|
createEnvironment(name2, config) {
|
|
@@ -1299,7 +1310,11 @@ function createCloudflareEnvironmentOptions(workerConfig, userConfig, environmen
|
|
|
1299
1310
|
createEnvironment(name2, config) {
|
|
1300
1311
|
return new vite2.BuildEnvironment(name2, config);
|
|
1301
1312
|
},
|
|
1313
|
+
target: "es2022",
|
|
1314
|
+
// We need to enable `emitAssets` in order to support additional modules defined by `rules`
|
|
1315
|
+
emitAssets: true,
|
|
1302
1316
|
outDir: getOutputDirectory(userConfig, environmentName),
|
|
1317
|
+
copyPublicDir: false,
|
|
1303
1318
|
ssr: true,
|
|
1304
1319
|
rollupOptions: {
|
|
1305
1320
|
// Note: vite starts dev pre-bundling crawling from either optimizeDeps.entries or rollupOptions.input
|
|
@@ -1320,6 +1335,7 @@ function createCloudflareEnvironmentOptions(workerConfig, userConfig, environmen
|
|
|
1320
1335
|
],
|
|
1321
1336
|
esbuildOptions: {
|
|
1322
1337
|
platform: "neutral",
|
|
1338
|
+
conditions: [...defaultConditions, "development"],
|
|
1323
1339
|
resolveExtensions: [
|
|
1324
1340
|
".mjs",
|
|
1325
1341
|
".js",
|
|
@@ -1430,13 +1446,6 @@ function writeDeployConfig(resolvedPluginConfig, resolvedViteConfig) {
|
|
|
1430
1446
|
|
|
1431
1447
|
// src/dev.ts
|
|
1432
1448
|
import assert3 from "node:assert";
|
|
1433
|
-
|
|
1434
|
-
// src/constants.ts
|
|
1435
|
-
var ROUTER_WORKER_NAME = "__router-worker__";
|
|
1436
|
-
var ASSET_WORKER_NAME = "__asset-worker__";
|
|
1437
|
-
var ASSET_WORKERS_COMPATIBILITY_DATE = "2024-10-04";
|
|
1438
|
-
|
|
1439
|
-
// src/dev.ts
|
|
1440
1449
|
function getDevEntryWorker(resolvedPluginConfig, miniflare) {
|
|
1441
1450
|
const entryWorkerConfig = resolvedPluginConfig.type === "assets-only" ? resolvedPluginConfig.config : resolvedPluginConfig.workers[resolvedPluginConfig.entryWorkerEnvironmentName];
|
|
1442
1451
|
assert3(entryWorkerConfig, "Unexpected error: No entry worker configuration");
|
|
@@ -1634,10 +1643,13 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer) {
|
|
|
1634
1643
|
];
|
|
1635
1644
|
const userWorkers = resolvedPluginConfig.type === "workers" ? Object.entries(resolvedPluginConfig.workers).map(
|
|
1636
1645
|
([environmentName, workerConfig]) => {
|
|
1637
|
-
const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1646
|
+
const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(
|
|
1647
|
+
{
|
|
1648
|
+
...workerConfig,
|
|
1649
|
+
assets: void 0
|
|
1650
|
+
},
|
|
1651
|
+
resolvedPluginConfig.cloudflareEnv
|
|
1652
|
+
);
|
|
1641
1653
|
const { ratelimits, ...workerOptions } = miniflareWorkerOptions.workerOptions;
|
|
1642
1654
|
return {
|
|
1643
1655
|
...workerOptions,
|
|
@@ -1663,16 +1675,24 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer) {
|
|
|
1663
1675
|
`Invalid invoke event: ${invokePayloadData.name}`
|
|
1664
1676
|
);
|
|
1665
1677
|
const [moduleId] = invokePayloadData.data;
|
|
1678
|
+
const moduleRE = new RegExp(MODULE_PATTERN);
|
|
1679
|
+
if (moduleRE.test(moduleId)) {
|
|
1680
|
+
const result2 = {
|
|
1681
|
+
externalize: moduleId,
|
|
1682
|
+
type: "module"
|
|
1683
|
+
};
|
|
1684
|
+
return MiniflareResponse.json({ result: result2 });
|
|
1685
|
+
}
|
|
1666
1686
|
if (moduleId.startsWith("cloudflare:")) {
|
|
1667
1687
|
const result2 = {
|
|
1668
1688
|
externalize: moduleId,
|
|
1669
1689
|
type: "builtin"
|
|
1670
1690
|
};
|
|
1671
|
-
return
|
|
1691
|
+
return MiniflareResponse.json({ result: result2 });
|
|
1672
1692
|
}
|
|
1673
1693
|
const devEnvironment = viteDevServer.environments[environmentName];
|
|
1674
1694
|
const result = await devEnvironment.hot.handleInvoke(payload);
|
|
1675
|
-
return
|
|
1695
|
+
return MiniflareResponse.json(result);
|
|
1676
1696
|
}
|
|
1677
1697
|
}
|
|
1678
1698
|
};
|
|
@@ -1751,10 +1771,37 @@ function getDevMiniflareOptions(resolvedPluginConfig, viteDevServer) {
|
|
|
1751
1771
|
fileURLToPath(new URL(RUNNER_PATH, import.meta.url))
|
|
1752
1772
|
)
|
|
1753
1773
|
}
|
|
1754
|
-
]
|
|
1774
|
+
],
|
|
1775
|
+
unsafeUseModuleFallbackService: true
|
|
1755
1776
|
};
|
|
1756
1777
|
})
|
|
1757
|
-
]
|
|
1778
|
+
],
|
|
1779
|
+
unsafeModuleFallbackService(request) {
|
|
1780
|
+
const url = new URL(request.url);
|
|
1781
|
+
const rawSpecifier = url.searchParams.get("rawSpecifier");
|
|
1782
|
+
assert4(
|
|
1783
|
+
rawSpecifier,
|
|
1784
|
+
`Unexpected error: no specifier in request to module fallback service.`
|
|
1785
|
+
);
|
|
1786
|
+
const moduleRE = new RegExp(MODULE_PATTERN);
|
|
1787
|
+
const match = moduleRE.exec(rawSpecifier);
|
|
1788
|
+
assert4(match, `Unexpected error: no match for module ${rawSpecifier}.`);
|
|
1789
|
+
const [full, moduleType, modulePath] = match;
|
|
1790
|
+
assert4(
|
|
1791
|
+
modulePath,
|
|
1792
|
+
`Unexpected error: module path not found in reference ${full}.`
|
|
1793
|
+
);
|
|
1794
|
+
let source;
|
|
1795
|
+
try {
|
|
1796
|
+
source = fs2.readFileSync(modulePath);
|
|
1797
|
+
} catch (error) {
|
|
1798
|
+
throw new Error(`Import ${modulePath} not found. Does the file exist?`);
|
|
1799
|
+
}
|
|
1800
|
+
return MiniflareResponse.json({
|
|
1801
|
+
// Cap'n Proto expects byte arrays for `:Data` typed fields from JSON
|
|
1802
|
+
wasm: Array.from(source)
|
|
1803
|
+
});
|
|
1804
|
+
}
|
|
1758
1805
|
};
|
|
1759
1806
|
}
|
|
1760
1807
|
function getPreviewMiniflareOptions(vitePreviewServer, persistState) {
|
|
@@ -2061,20 +2108,21 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
|
|
|
2061
2108
|
const configPaths = /* @__PURE__ */ new Set();
|
|
2062
2109
|
const persistState = pluginConfig.persistState ?? true;
|
|
2063
2110
|
const root = userConfig.root ? path5.resolve(userConfig.root) : process.cwd();
|
|
2064
|
-
const { CLOUDFLARE_ENV } = vite5.loadEnv(
|
|
2111
|
+
const { CLOUDFLARE_ENV: cloudflareEnv } = vite5.loadEnv(
|
|
2112
|
+
viteEnv.mode,
|
|
2113
|
+
root,
|
|
2114
|
+
/* prefixes */
|
|
2115
|
+
""
|
|
2116
|
+
);
|
|
2065
2117
|
const configPath = pluginConfig.configPath ? path5.resolve(root, pluginConfig.configPath) : findWranglerConfig(root);
|
|
2066
2118
|
assert6(
|
|
2067
2119
|
configPath,
|
|
2068
2120
|
`Config not found. Have you created a wrangler.json(c) or wrangler.toml file?`
|
|
2069
2121
|
);
|
|
2070
|
-
const entryWorkerResolvedConfig = getWorkerConfig(
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
visitedConfigPaths: configPaths,
|
|
2075
|
-
isEntryWorker: true
|
|
2076
|
-
}
|
|
2077
|
-
);
|
|
2122
|
+
const entryWorkerResolvedConfig = getWorkerConfig(configPath, cloudflareEnv, {
|
|
2123
|
+
visitedConfigPaths: configPaths,
|
|
2124
|
+
isEntryWorker: true
|
|
2125
|
+
});
|
|
2078
2126
|
if (entryWorkerResolvedConfig.type === "assets-only") {
|
|
2079
2127
|
return {
|
|
2080
2128
|
type: "assets-only",
|
|
@@ -2083,7 +2131,8 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
|
|
|
2083
2131
|
persistState,
|
|
2084
2132
|
rawConfigs: {
|
|
2085
2133
|
entryWorker: entryWorkerResolvedConfig
|
|
2086
|
-
}
|
|
2134
|
+
},
|
|
2135
|
+
cloudflareEnv
|
|
2087
2136
|
};
|
|
2088
2137
|
}
|
|
2089
2138
|
const entryWorkerConfig = entryWorkerResolvedConfig.config;
|
|
@@ -2095,7 +2144,7 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
|
|
|
2095
2144
|
for (const auxiliaryWorker of pluginConfig.auxiliaryWorkers ?? []) {
|
|
2096
2145
|
const workerResolvedConfig = getWorkerConfig(
|
|
2097
2146
|
path5.resolve(root, auxiliaryWorker.configPath),
|
|
2098
|
-
|
|
2147
|
+
cloudflareEnv,
|
|
2099
2148
|
{
|
|
2100
2149
|
visitedConfigPaths: configPaths
|
|
2101
2150
|
}
|
|
@@ -2123,7 +2172,8 @@ function resolvePluginConfig(pluginConfig, userConfig, viteEnv) {
|
|
|
2123
2172
|
rawConfigs: {
|
|
2124
2173
|
entryWorker: entryWorkerResolvedConfig,
|
|
2125
2174
|
auxiliaryWorkers: auxiliaryWorkersResolvedConfigs
|
|
2126
|
-
}
|
|
2175
|
+
},
|
|
2176
|
+
cloudflareEnv
|
|
2127
2177
|
};
|
|
2128
2178
|
}
|
|
2129
2179
|
|
|
@@ -2167,8 +2217,10 @@ ${event.error?.stack || event.error?.message}`,
|
|
|
2167
2217
|
workerWebSocket.addEventListener("close", () => {
|
|
2168
2218
|
clientWebSocket.close();
|
|
2169
2219
|
});
|
|
2170
|
-
clientWebSocket.on("message", (
|
|
2171
|
-
workerWebSocket.send(
|
|
2220
|
+
clientWebSocket.on("message", (data, isBinary) => {
|
|
2221
|
+
workerWebSocket.send(
|
|
2222
|
+
isBinary ? Array.isArray(data) ? Buffer.concat(data) : data : data.toString()
|
|
2223
|
+
);
|
|
2172
2224
|
});
|
|
2173
2225
|
clientWebSocket.on("error", (error) => {
|
|
2174
2226
|
logger.error(`WebSocket error:
|
|
@@ -2192,211 +2244,326 @@ function cloudflare2(pluginConfig = {}) {
|
|
|
2192
2244
|
let resolvedViteConfig;
|
|
2193
2245
|
let miniflare;
|
|
2194
2246
|
let workersConfigsWarningShown = false;
|
|
2195
|
-
return
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2247
|
+
return [
|
|
2248
|
+
{
|
|
2249
|
+
name: "vite-plugin-cloudflare",
|
|
2250
|
+
config(userConfig, env2) {
|
|
2251
|
+
if (env2.isPreview) {
|
|
2252
|
+
return { appType: "custom" };
|
|
2253
|
+
}
|
|
2254
|
+
resolvedPluginConfig = resolvePluginConfig(
|
|
2255
|
+
pluginConfig,
|
|
2256
|
+
userConfig,
|
|
2257
|
+
env2
|
|
2206
2258
|
);
|
|
2207
|
-
if (
|
|
2208
|
-
|
|
2259
|
+
if (!workersConfigsWarningShown) {
|
|
2260
|
+
workersConfigsWarningShown = true;
|
|
2261
|
+
const workersConfigsWarning = getWarningForWorkersConfigs(
|
|
2262
|
+
resolvedPluginConfig.rawConfigs
|
|
2263
|
+
);
|
|
2264
|
+
if (workersConfigsWarning) {
|
|
2265
|
+
console.warn(workersConfigsWarning);
|
|
2266
|
+
}
|
|
2209
2267
|
}
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2268
|
+
return {
|
|
2269
|
+
appType: "custom",
|
|
2270
|
+
resolve: {
|
|
2271
|
+
alias: getNodeCompatAliases()
|
|
2272
|
+
},
|
|
2273
|
+
environments: resolvedPluginConfig.type === "workers" ? {
|
|
2274
|
+
...Object.fromEntries(
|
|
2275
|
+
Object.entries(resolvedPluginConfig.workers).map(
|
|
2276
|
+
([environmentName, workerConfig]) => {
|
|
2277
|
+
return [
|
|
2278
|
+
environmentName,
|
|
2279
|
+
createCloudflareEnvironmentOptions(
|
|
2280
|
+
workerConfig,
|
|
2281
|
+
userConfig,
|
|
2282
|
+
environmentName
|
|
2283
|
+
)
|
|
2284
|
+
];
|
|
2285
|
+
}
|
|
2286
|
+
)
|
|
2287
|
+
),
|
|
2288
|
+
client: {
|
|
2289
|
+
build: {
|
|
2290
|
+
outDir: getOutputDirectory(userConfig, "client")
|
|
2291
|
+
}
|
|
2292
|
+
}
|
|
2293
|
+
} : void 0,
|
|
2294
|
+
builder: {
|
|
2295
|
+
async buildApp(builder) {
|
|
2296
|
+
const clientEnvironment = builder.environments.client;
|
|
2297
|
+
const defaultHtmlPath = path6.resolve(
|
|
2298
|
+
builder.config.root,
|
|
2299
|
+
"index.html"
|
|
2300
|
+
);
|
|
2301
|
+
if (clientEnvironment && (clientEnvironment.config.build.rollupOptions.input || fs4.existsSync(defaultHtmlPath))) {
|
|
2302
|
+
await builder.build(clientEnvironment);
|
|
2303
|
+
}
|
|
2304
|
+
if (resolvedPluginConfig.type === "workers") {
|
|
2305
|
+
const workerEnvironments = Object.keys(
|
|
2306
|
+
resolvedPluginConfig.workers
|
|
2307
|
+
).map((environmentName) => {
|
|
2308
|
+
const environment = builder.environments[environmentName];
|
|
2309
|
+
assert7(
|
|
2310
|
+
environment,
|
|
2311
|
+
`${environmentName} environment not found`
|
|
2312
|
+
);
|
|
2313
|
+
return environment;
|
|
2314
|
+
});
|
|
2315
|
+
await Promise.all(
|
|
2316
|
+
workerEnvironments.map(
|
|
2317
|
+
(environment) => builder.build(environment)
|
|
2226
2318
|
)
|
|
2227
|
-
|
|
2319
|
+
);
|
|
2228
2320
|
}
|
|
2229
|
-
|
|
2230
|
-
),
|
|
2231
|
-
client: {
|
|
2232
|
-
build: {
|
|
2233
|
-
outDir: getOutputDirectory(userConfig, "client")
|
|
2321
|
+
writeDeployConfig(resolvedPluginConfig, resolvedViteConfig);
|
|
2234
2322
|
}
|
|
2235
2323
|
}
|
|
2236
|
-
}
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2324
|
+
};
|
|
2325
|
+
},
|
|
2326
|
+
configResolved(config) {
|
|
2327
|
+
resolvedViteConfig = config;
|
|
2328
|
+
},
|
|
2329
|
+
async resolveId(source) {
|
|
2330
|
+
if (resolvedPluginConfig.type === "assets-only") {
|
|
2331
|
+
return;
|
|
2332
|
+
}
|
|
2333
|
+
const workerConfig = resolvedPluginConfig.workers[this.environment.name];
|
|
2334
|
+
if (!workerConfig) {
|
|
2335
|
+
return;
|
|
2336
|
+
}
|
|
2337
|
+
return resolveNodeCompatId(this.environment, workerConfig, source);
|
|
2338
|
+
},
|
|
2339
|
+
async transform(code, id) {
|
|
2340
|
+
if (resolvedPluginConfig.type === "assets-only") {
|
|
2341
|
+
return;
|
|
2342
|
+
}
|
|
2343
|
+
const workerConfig = resolvedPluginConfig.workers[this.environment.name];
|
|
2344
|
+
if (!workerConfig) {
|
|
2345
|
+
return;
|
|
2346
|
+
}
|
|
2347
|
+
const resolvedId = await this.resolve(workerConfig.main);
|
|
2348
|
+
if (id === resolvedId?.id) {
|
|
2349
|
+
return injectGlobalCode(id, code, workerConfig);
|
|
2350
|
+
}
|
|
2351
|
+
},
|
|
2352
|
+
generateBundle(_, bundle) {
|
|
2353
|
+
let config;
|
|
2354
|
+
if (resolvedPluginConfig.type === "workers") {
|
|
2355
|
+
const workerConfig = resolvedPluginConfig.workers[this.environment.name];
|
|
2356
|
+
const entryChunk = Object.entries(bundle).find(
|
|
2357
|
+
([_2, chunk]) => chunk.type === "chunk" && chunk.isEntry
|
|
2358
|
+
);
|
|
2359
|
+
if (!workerConfig || !entryChunk) {
|
|
2360
|
+
return;
|
|
2361
|
+
}
|
|
2362
|
+
workerConfig.main = entryChunk[0];
|
|
2363
|
+
const isEntryWorker = this.environment.name === resolvedPluginConfig.entryWorkerEnvironmentName;
|
|
2364
|
+
if (isEntryWorker && workerConfig.assets) {
|
|
2365
|
+
const workerOutputDirectory = this.environment.config.build.outDir;
|
|
2366
|
+
const clientOutputDirectory = resolvedViteConfig.environments.client?.build.outDir;
|
|
2367
|
+
assert7(
|
|
2368
|
+
clientOutputDirectory,
|
|
2369
|
+
"Unexpected error: client output directory is undefined"
|
|
2243
2370
|
);
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2371
|
+
workerConfig.assets.directory = path6.relative(
|
|
2372
|
+
path6.resolve(resolvedViteConfig.root, workerOutputDirectory),
|
|
2373
|
+
path6.resolve(resolvedViteConfig.root, clientOutputDirectory)
|
|
2374
|
+
);
|
|
2375
|
+
}
|
|
2376
|
+
config = workerConfig;
|
|
2377
|
+
if (workerConfig.configPath) {
|
|
2378
|
+
const dotDevDotVarsContent = getDotDevDotVarsContent(
|
|
2379
|
+
workerConfig.configPath,
|
|
2380
|
+
resolvedPluginConfig.cloudflareEnv
|
|
2381
|
+
);
|
|
2382
|
+
if (dotDevDotVarsContent) {
|
|
2383
|
+
this.emitFile({
|
|
2384
|
+
type: "asset",
|
|
2385
|
+
fileName: ".dev.vars",
|
|
2386
|
+
source: dotDevDotVarsContent
|
|
2254
2387
|
});
|
|
2255
|
-
await Promise.all(
|
|
2256
|
-
workerEnvironments.map(
|
|
2257
|
-
(environment) => builder.build(environment)
|
|
2258
|
-
)
|
|
2259
|
-
);
|
|
2260
2388
|
}
|
|
2261
|
-
writeDeployConfig(resolvedPluginConfig, resolvedViteConfig);
|
|
2262
2389
|
}
|
|
2390
|
+
} else if (this.environment.name === "client") {
|
|
2391
|
+
const assetsOnlyConfig = resolvedPluginConfig.config;
|
|
2392
|
+
assetsOnlyConfig.assets.directory = ".";
|
|
2393
|
+
const filesToAssetsIgnore = ["wrangler.json", ".dev.vars"];
|
|
2394
|
+
this.emitFile({
|
|
2395
|
+
type: "asset",
|
|
2396
|
+
fileName: ".assetsignore",
|
|
2397
|
+
source: `${filesToAssetsIgnore.join("\n")}
|
|
2398
|
+
`
|
|
2399
|
+
});
|
|
2400
|
+
config = assetsOnlyConfig;
|
|
2263
2401
|
}
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
}
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2402
|
+
if (!config) {
|
|
2403
|
+
return;
|
|
2404
|
+
}
|
|
2405
|
+
config.no_bundle = true;
|
|
2406
|
+
config.rules = [{ type: "ESModule", globs: ["**/*.js"] }];
|
|
2407
|
+
if (config.unsafe && Object.keys(config.unsafe).length === 0) {
|
|
2408
|
+
config.unsafe = void 0;
|
|
2409
|
+
}
|
|
2410
|
+
this.emitFile({
|
|
2411
|
+
type: "asset",
|
|
2412
|
+
fileName: "wrangler.json",
|
|
2413
|
+
source: JSON.stringify(config)
|
|
2414
|
+
});
|
|
2415
|
+
},
|
|
2416
|
+
handleHotUpdate(options) {
|
|
2417
|
+
if (resolvedPluginConfig.configPaths.has(options.file)) {
|
|
2418
|
+
options.server.restart();
|
|
2419
|
+
}
|
|
2420
|
+
},
|
|
2421
|
+
async buildEnd() {
|
|
2422
|
+
if (miniflare) {
|
|
2423
|
+
await miniflare.dispose();
|
|
2424
|
+
miniflare = void 0;
|
|
2425
|
+
}
|
|
2426
|
+
},
|
|
2427
|
+
async configureServer(viteDevServer) {
|
|
2428
|
+
assert7(
|
|
2429
|
+
viteDevServer.httpServer,
|
|
2430
|
+
"Unexpected error: No Vite HTTP server"
|
|
2431
|
+
);
|
|
2432
|
+
miniflare = new Miniflare(
|
|
2433
|
+
getDevMiniflareOptions(resolvedPluginConfig, viteDevServer)
|
|
2434
|
+
);
|
|
2435
|
+
await initRunners(resolvedPluginConfig, viteDevServer, miniflare);
|
|
2436
|
+
const entryWorker = await getDevEntryWorker(
|
|
2437
|
+
resolvedPluginConfig,
|
|
2438
|
+
miniflare
|
|
2439
|
+
);
|
|
2440
|
+
const middleware = createMiddleware(({ request }) => {
|
|
2441
|
+
return entryWorker.fetch(toMiniflareRequest(request), {
|
|
2442
|
+
redirect: "manual"
|
|
2443
|
+
});
|
|
2444
|
+
});
|
|
2445
|
+
handleWebSocket(
|
|
2446
|
+
viteDevServer.httpServer,
|
|
2447
|
+
entryWorker.fetch,
|
|
2448
|
+
viteDevServer.config.logger
|
|
2449
|
+
);
|
|
2450
|
+
return () => {
|
|
2451
|
+
viteDevServer.middlewares.use((req, res, next) => {
|
|
2452
|
+
middleware(req, res, next);
|
|
2453
|
+
});
|
|
2454
|
+
};
|
|
2455
|
+
},
|
|
2456
|
+
configurePreviewServer(vitePreviewServer) {
|
|
2457
|
+
const miniflare2 = new Miniflare(
|
|
2458
|
+
getPreviewMiniflareOptions(
|
|
2459
|
+
vitePreviewServer,
|
|
2460
|
+
pluginConfig.persistState ?? true
|
|
2461
|
+
)
|
|
2462
|
+
);
|
|
2463
|
+
const middleware = createMiddleware(({ request }) => {
|
|
2464
|
+
return miniflare2.dispatchFetch(toMiniflareRequest(request), {
|
|
2465
|
+
redirect: "manual"
|
|
2466
|
+
});
|
|
2467
|
+
});
|
|
2468
|
+
handleWebSocket(
|
|
2469
|
+
vitePreviewServer.httpServer,
|
|
2470
|
+
miniflare2.dispatchFetch,
|
|
2471
|
+
vitePreviewServer.config.logger
|
|
2472
|
+
);
|
|
2473
|
+
return () => {
|
|
2474
|
+
vitePreviewServer.middlewares.use((req, res, next) => {
|
|
2475
|
+
middleware(req, res, next);
|
|
2476
|
+
});
|
|
2477
|
+
};
|
|
2290
2478
|
}
|
|
2291
2479
|
},
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2480
|
+
// Plugin to support `CompiledWasm` modules
|
|
2481
|
+
{
|
|
2482
|
+
name: "vite-plugin-cloudflare:modules",
|
|
2483
|
+
// We set `enforce: "pre"` so that this plugin runs before the Vite core plugins.
|
|
2484
|
+
// Otherwise the `vite:wasm-fallback` plugin prevents the `.wasm` extension being used for module imports.
|
|
2485
|
+
enforce: "pre",
|
|
2486
|
+
applyToEnvironment(environment) {
|
|
2487
|
+
if (resolvedPluginConfig.type === "assets-only") {
|
|
2488
|
+
return false;
|
|
2489
|
+
}
|
|
2490
|
+
return Object.keys(resolvedPluginConfig.workers).includes(
|
|
2491
|
+
environment.name
|
|
2298
2492
|
);
|
|
2299
|
-
|
|
2493
|
+
},
|
|
2494
|
+
async resolveId(source, importer) {
|
|
2495
|
+
if (!source.endsWith(".wasm")) {
|
|
2300
2496
|
return;
|
|
2301
2497
|
}
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2498
|
+
const resolved = await this.resolve(source, importer);
|
|
2499
|
+
assert7(
|
|
2500
|
+
resolved,
|
|
2501
|
+
`Unexpected error: could not resolve Wasm module ${source}`
|
|
2502
|
+
);
|
|
2503
|
+
return {
|
|
2504
|
+
external: true,
|
|
2505
|
+
id: createModuleReference("CompiledWasm", resolved.id)
|
|
2506
|
+
};
|
|
2507
|
+
},
|
|
2508
|
+
renderChunk(code, chunk) {
|
|
2509
|
+
const moduleRE = new RegExp(MODULE_PATTERN, "g");
|
|
2510
|
+
let match;
|
|
2511
|
+
let magicString;
|
|
2512
|
+
while (match = moduleRE.exec(code)) {
|
|
2513
|
+
magicString ??= new MagicString(code);
|
|
2514
|
+
const [full, moduleType, modulePath] = match;
|
|
2307
2515
|
assert7(
|
|
2308
|
-
|
|
2309
|
-
|
|
2516
|
+
modulePath,
|
|
2517
|
+
`Unexpected error: module path not found in reference ${full}.`
|
|
2310
2518
|
);
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2519
|
+
let source;
|
|
2520
|
+
try {
|
|
2521
|
+
source = fs4.readFileSync(modulePath);
|
|
2522
|
+
} catch (error) {
|
|
2523
|
+
throw new Error(
|
|
2524
|
+
`Import ${modulePath} not found. Does the file exist?`
|
|
2525
|
+
);
|
|
2526
|
+
}
|
|
2527
|
+
const referenceId = this.emitFile({
|
|
2528
|
+
type: "asset",
|
|
2529
|
+
name: path6.basename(modulePath),
|
|
2530
|
+
originalFileName: modulePath,
|
|
2531
|
+
source
|
|
2532
|
+
});
|
|
2533
|
+
const emittedFileName = this.getFileName(referenceId);
|
|
2534
|
+
const relativePath = vite6.normalizePath(
|
|
2535
|
+
path6.relative(path6.dirname(chunk.fileName), emittedFileName)
|
|
2536
|
+
);
|
|
2537
|
+
const importPath = relativePath.startsWith(".") ? relativePath : `./${relativePath}`;
|
|
2538
|
+
magicString.update(
|
|
2539
|
+
match.index,
|
|
2540
|
+
match.index + full.length,
|
|
2541
|
+
importPath
|
|
2314
2542
|
);
|
|
2315
2543
|
}
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
fileName: ".assetsignore",
|
|
2323
|
-
source: "wrangler.json"
|
|
2324
|
-
});
|
|
2325
|
-
config = assetsOnlyConfig;
|
|
2326
|
-
}
|
|
2327
|
-
if (!config) {
|
|
2328
|
-
return;
|
|
2329
|
-
}
|
|
2330
|
-
config.no_bundle = true;
|
|
2331
|
-
config.rules = [{ type: "ESModule", globs: ["**/*.js"] }];
|
|
2332
|
-
config.unsafe = void 0;
|
|
2333
|
-
this.emitFile({
|
|
2334
|
-
type: "asset",
|
|
2335
|
-
fileName: "wrangler.json",
|
|
2336
|
-
source: JSON.stringify(config)
|
|
2337
|
-
});
|
|
2338
|
-
},
|
|
2339
|
-
handleHotUpdate(options) {
|
|
2340
|
-
if (resolvedPluginConfig.configPaths.has(options.file)) {
|
|
2341
|
-
options.server.restart();
|
|
2342
|
-
}
|
|
2343
|
-
},
|
|
2344
|
-
async buildEnd() {
|
|
2345
|
-
if (miniflare) {
|
|
2346
|
-
await miniflare.dispose();
|
|
2347
|
-
miniflare = void 0;
|
|
2544
|
+
if (magicString) {
|
|
2545
|
+
return {
|
|
2546
|
+
code: magicString.toString(),
|
|
2547
|
+
map: this.environment.config.build.sourcemap ? magicString.generateMap({ hires: "boundary" }) : null
|
|
2548
|
+
};
|
|
2549
|
+
}
|
|
2348
2550
|
}
|
|
2349
|
-
},
|
|
2350
|
-
async configureServer(viteDevServer) {
|
|
2351
|
-
assert7(viteDevServer.httpServer, "Unexpected error: No Vite HTTP server");
|
|
2352
|
-
miniflare = new Miniflare(
|
|
2353
|
-
getDevMiniflareOptions(resolvedPluginConfig, viteDevServer)
|
|
2354
|
-
);
|
|
2355
|
-
await initRunners(resolvedPluginConfig, viteDevServer, miniflare);
|
|
2356
|
-
const entryWorker = await getDevEntryWorker(
|
|
2357
|
-
resolvedPluginConfig,
|
|
2358
|
-
miniflare
|
|
2359
|
-
);
|
|
2360
|
-
const middleware = createMiddleware(({ request }) => {
|
|
2361
|
-
return entryWorker.fetch(toMiniflareRequest(request), {
|
|
2362
|
-
redirect: "manual"
|
|
2363
|
-
});
|
|
2364
|
-
});
|
|
2365
|
-
handleWebSocket(
|
|
2366
|
-
viteDevServer.httpServer,
|
|
2367
|
-
entryWorker.fetch,
|
|
2368
|
-
viteDevServer.config.logger
|
|
2369
|
-
);
|
|
2370
|
-
return () => {
|
|
2371
|
-
viteDevServer.middlewares.use((req, res, next) => {
|
|
2372
|
-
middleware(req, res, next);
|
|
2373
|
-
});
|
|
2374
|
-
};
|
|
2375
|
-
},
|
|
2376
|
-
configurePreviewServer(vitePreviewServer) {
|
|
2377
|
-
const miniflare2 = new Miniflare(
|
|
2378
|
-
getPreviewMiniflareOptions(
|
|
2379
|
-
vitePreviewServer,
|
|
2380
|
-
pluginConfig.persistState ?? true
|
|
2381
|
-
)
|
|
2382
|
-
);
|
|
2383
|
-
const middleware = createMiddleware(({ request }) => {
|
|
2384
|
-
return miniflare2.dispatchFetch(toMiniflareRequest(request), {
|
|
2385
|
-
redirect: "manual"
|
|
2386
|
-
});
|
|
2387
|
-
});
|
|
2388
|
-
handleWebSocket(
|
|
2389
|
-
vitePreviewServer.httpServer,
|
|
2390
|
-
miniflare2.dispatchFetch,
|
|
2391
|
-
vitePreviewServer.config.logger
|
|
2392
|
-
);
|
|
2393
|
-
return () => {
|
|
2394
|
-
vitePreviewServer.middlewares.use((req, res, next) => {
|
|
2395
|
-
middleware(req, res, next);
|
|
2396
|
-
});
|
|
2397
|
-
};
|
|
2398
2551
|
}
|
|
2399
|
-
|
|
2552
|
+
];
|
|
2553
|
+
}
|
|
2554
|
+
function getDotDevDotVarsContent(configPath, cloudflareEnv) {
|
|
2555
|
+
const configDir = path6.dirname(configPath);
|
|
2556
|
+
const defaultDotDevDotVarsPath = `${configDir}/.dev.vars`;
|
|
2557
|
+
const inputDotDevDotVarsPath = `${defaultDotDevDotVarsPath}${cloudflareEnv ? `.${cloudflareEnv}` : ""}`;
|
|
2558
|
+
const targetPath = fs4.existsSync(inputDotDevDotVarsPath) ? inputDotDevDotVarsPath : fs4.existsSync(defaultDotDevDotVarsPath) ? defaultDotDevDotVarsPath : null;
|
|
2559
|
+
if (targetPath) {
|
|
2560
|
+
const dotDevDotVarsContent = fs4.readFileSync(targetPath);
|
|
2561
|
+
return dotDevDotVarsContent;
|
|
2562
|
+
}
|
|
2563
|
+
return null;
|
|
2564
|
+
}
|
|
2565
|
+
function createModuleReference(type, id) {
|
|
2566
|
+
return `__CLOUDFLARE_MODULE__${type}__${id}__`;
|
|
2400
2567
|
}
|
|
2401
2568
|
export {
|
|
2402
2569
|
cloudflare2 as cloudflare
|