Skip to content

fix: use wrangler CLI to bundle worker #13640

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 7 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/tame-ligers-peel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/adapter-cloudflare': patch
---

fix: pre-bundle `_worker.js`
1 change: 1 addition & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default [
'@typescript-eslint/no-floating-promises': 'error'
},
ignores: [
'packages/adapter-cloudflare/test/apps/**/*',
'packages/adapter-node/rollup.config.js',
'packages/adapter-node/tests/smoke.spec_disabled.js',
'packages/adapter-static/test/apps/**/*',
Expand Down
46 changes: 41 additions & 5 deletions packages/adapter-cloudflare/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { copyFileSync, existsSync, writeFileSync } from 'node:fs';
import { execSync } from 'node:child_process';
import { copyFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
import * as path from 'node:path';
import { fileURLToPath } from 'node:url';
import { getPlatformProxy } from 'wrangler';
import { experimental_readRawConfig, getPlatformProxy } from 'wrangler';

/** @type {import('./index.js').default} */
export default function (options = {}) {
Expand Down Expand Up @@ -31,6 +32,7 @@ export default function (options = {}) {
const tmp = builder.getBuildDirectory('cloudflare-tmp');

builder.rimraf(dest);
builder.rimraf(tmp);

builder.mkdirp(dest);
builder.mkdirp(tmp);
Expand All @@ -47,20 +49,54 @@ export default function (options = {}) {
const written_files = builder.writeClient(dest_dir);
builder.writePrerendered(dest_dir);

const relativePath = path.posix.relative(dest, builder.getServerDirectory());
const relativePath = path.posix.relative(tmp, builder.getServerDirectory());
writeFileSync(
`${tmp}/manifest.js`,
`export const manifest = ${builder.generateManifest({ relativePath })};\n\n` +
`export const prerendered = new Set(${JSON.stringify(builder.prerendered.paths)});\n\n` +
`export const base_path = ${JSON.stringify(builder.config.kit.paths.base)};\n`
);
builder.copy(`${files}/worker.js`, `${dest}/_worker.js`, {
const worker_tmp = `${tmp}/index.js`;
builder.copy(`${files}/worker.js`, worker_tmp, {
replace: {
SERVER: `${relativePath}/index.js`,
MANIFEST: `${path.posix.relative(dest, tmp)}/manifest.js`
MANIFEST: './manifest.js'
}
});

const wrangler_config_redirect = '.wrangler/deploy/config.json';
let generated_wrangler_config = 'svelte-kit-generated-wrangler.jsonc';

builder.rimraf(wrangler_config_redirect);

const { configPath: wrangler_config_path, rawConfig: wrangler_config } =
experimental_readRawConfig({});

// if "pages_build_output_dir" is set, we need to temporarily unset it
// or the deploy command will fail
if (wrangler_config.pages_build_output_dir) {
wrangler_config.pages_build_output_dir = undefined;
// keep the generated wrangler config adjacent to the user wrangler config
// so that relative paths set by the user remain valid
generated_wrangler_config = `${path.dirname(wrangler_config_path)}/${generated_wrangler_config}`;
mkdirSync('.wrangler/deploy', { recursive: true });
writeFileSync(
wrangler_config_redirect,
JSON.stringify({ configPath: generated_wrangler_config })
);
writeFileSync(generated_wrangler_config, JSON.stringify(wrangler_config, null, '\t'));
}

const wrangler = `node ${path.dirname(fileURLToPath(import.meta.url))}/node_modules/wrangler/bin/wrangler.js`;
execSync(
`${wrangler} deploy ${worker_tmp} --dry-run --outdir ${dest}/_worker.js --name ${wrangler_config.name || 'svelte-kit'} --compatibility-date ${wrangler_config.compatibility_date || new Date().toISOString().split('T')[0]}`,
{
stdio: 'inherit'
}
);
builder.rimraf(wrangler_config_redirect);
builder.rimraf(generated_wrangler_config);

writeFileSync(
`${dest}/_routes.json`,
JSON.stringify(get_routes_json(builder, written_files, options.routes ?? {}), null, '\t')
Expand Down
4 changes: 3 additions & 1 deletion packages/adapter-cloudflare/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,15 @@
"lint": "prettier --check .",
"format": "pnpm lint --write",
"check": "tsc --skipLibCheck",
"prepublishOnly": "pnpm build"
"prepublishOnly": "pnpm build",
"test": "pnpm build && pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test"
},
"dependencies": {
"@cloudflare/workers-types": "^4.20250312.0",
"worktop": "0.8.0-next.18"
},
"devDependencies": {
"@playwright/test": "^1.44.1",
"@sveltejs/kit": "workspace:^",
"@types/node": "^18.19.48",
"esbuild": "^0.24.0",
Expand Down
4 changes: 4 additions & 0 deletions packages/adapter-cloudflare/test/apps/basic/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.DS_Store
node_modules
/.svelte-kit
/.wrangler
21 changes: 21 additions & 0 deletions packages/adapter-cloudflare/test/apps/basic/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "~TODO~",
"version": "0.0.1",
"private": true,
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "wrangler pages dev .svelte-kit/cloudflare",
"prepare": "svelte-kit sync || echo ''",
"test": "playwright test"
},
"devDependencies": {
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"server-side-dep": "file:server-side-dep",
"svelte": "^5.23.1",
"vite": "^6.0.11",
"wrangler": "^3.87.0"
},
"type": "module"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { config as default } from '../../utils.js';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export function sum(a: number, b: number): number;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/** @type {import('./index.js').sum} */
export function sum(a, b) {
return a + b;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "server-side-dep",
"version": "0.0.1",
"type": "module",
"types": "./index.d.ts",
"exports": {
".": "./index.js"
}
}
11 changes: 11 additions & 0 deletions packages/adapter-cloudflare/test/apps/basic/src/app.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body>
<div>%sveltekit.body%</div>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { sum } from 'server-side-dep';

export function load() {
return {
sum: sum(1, 2)
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<script>
export let data;
</script>

<h1>Sum: {data.sum}</h1>
10 changes: 10 additions & 0 deletions packages/adapter-cloudflare/test/apps/basic/svelte.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import adapter from '../../../index.js';

/** @type {import('@sveltejs/kit').Config} */
const config = {
kit: {
adapter: adapter()
}
};

export default config;
6 changes: 6 additions & 0 deletions packages/adapter-cloudflare/test/apps/basic/test/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { expect, test } from '@playwright/test';

test('worker works', async ({ page }) => {
await page.goto('/');
await expect(page.locator('h1')).toContainText('Sum: 3');
});
14 changes: 14 additions & 0 deletions packages/adapter-cloudflare/test/apps/basic/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"compilerOptions": {
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"moduleResolution": "bundler"
},
"extends": "./.svelte-kit/tsconfig.json"
}
11 changes: 11 additions & 0 deletions packages/adapter-cloudflare/test/apps/basic/vite.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { sveltekit } from '@sveltejs/kit/vite';

/** @type {import('vite').UserConfig} */
const config = {
build: {
minify: false
},
plugins: [sveltekit()]
};

export default config;
28 changes: 28 additions & 0 deletions packages/adapter-cloudflare/test/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { devices } from '@playwright/test';
import process from 'node:process';

/** @type {import('@playwright/test').PlaywrightTestConfig} */
export const config = {
forbidOnly: !!process.env.CI,
// generous timeouts on CI
timeout: process.env.CI ? 45000 : 15000,
webServer: {
command: 'pnpm build && pnpm preview',
port: 8788
},
retries: process.env.CI ? 2 : 0,
projects: [
{
name: 'chromium'
}
],
use: {
...devices['Desktop Chrome'],
screenshot: 'only-on-failure',
trace: 'retain-on-failure'
},
workers: process.env.CI ? 2 : undefined,
reporter: 'list',
testDir: 'test',
testMatch: /(.+\.)?(test|spec)\.[jt]s/
};
2 changes: 1 addition & 1 deletion packages/adapter-cloudflare/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@
"@sveltejs/kit": ["../kit/types/index"]
}
},
"include": ["index.js", "internal.d.ts", "src/worker.js"]
"include": ["index.js", "utils.js", "test/utils.js", "internal.d.ts", "src/worker.js"]
}
Loading
Loading