From 1aa65db98e9635bf1a1f92708be409e640bbb6ed Mon Sep 17 00:00:00 2001 From: dominikg Date: Thu, 10 Mar 2022 21:28:17 +0100 Subject: [PATCH] fix: update adapter-cloudflare-workers to build module package see https://github.com/sveltejs/kit/pull/4276#pullrequestreview-905716476 --- .changeset/few-walls-obey.md | 5 ++- packages/adapter-cloudflare-workers/README.md | 8 +++- packages/adapter-cloudflare-workers/index.js | 43 ++++++++++++++++--- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/.changeset/few-walls-obey.md b/.changeset/few-walls-obey.md index 11aaa493487c4..b089af1ccb756 100644 --- a/.changeset/few-walls-obey.md +++ b/.changeset/few-walls-obey.md @@ -6,6 +6,7 @@ #### add the following to your wrangler.toml ```toml -[build.upload] -format = "modules" + [build.upload] + format = "modules" + main = "./worker.mjs" ``` diff --git a/packages/adapter-cloudflare-workers/README.md b/packages/adapter-cloudflare-workers/README.md index c02c44c0e08ac..2bbda21bc5d37 100644 --- a/packages/adapter-cloudflare-workers/README.md +++ b/packages/adapter-cloudflare-workers/README.md @@ -53,7 +53,6 @@ Then configure your sites build directory and your account-details in the config ```toml account_id = 'YOUR ACCOUNT_ID' zone_id = 'YOUR ZONE_ID' # optional, if you don't specify this a workers.dev subdomain will be used. -site = {bucket = "./build", entry-point = "./workers-site"} type = "javascript" @@ -62,7 +61,12 @@ type = "javascript" command = "" [build.upload] -format = "service-worker" +format = "modules" +main = "./worker.mjs" + +[site] +bucket = "./.cloudflare/assets" +entry-point = "./.cloudflare/worker" ``` It's recommended that you add the `build` and `workers-site` folders (or whichever other folders you specify) to your `.gitignore`. diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index f161a109cb373..b6698d19e212d 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -11,7 +11,7 @@ export default function () { name: '@sveltejs/adapter-cloudflare-workers', async adapt(builder) { - const { site } = validate_config(builder); + const { site, build } = validate_config(builder); // @ts-ignore const { bucket } = site; @@ -19,6 +19,9 @@ export default function () { // @ts-ignore const entrypoint = site['entry-point'] || 'workers-site'; + // @ts-ignore + const main_path = build.upload.main; + const files = fileURLToPath(new URL('./files', import.meta.url).href); const tmp = builder.getBuildDirectory('cloudflare-workers-tmp'); @@ -51,13 +54,18 @@ export default function () { await esbuild.build({ entryPoints: [`${tmp}/entry.js`], - outfile: `${entrypoint}/index.js`, - bundle: true, + outfile: `${entrypoint}/${main_path}`, target: 'es2020', - platform: 'browser' + platform: 'browser', + bundle: true, + external: ['__STATIC_CONTENT_MANIFEST'], + format: 'esm' }); - writeFileSync(`${entrypoint}/package.json`, JSON.stringify({ main: 'index.js' })); + writeFileSync( + `${entrypoint}/package.json`, + JSON.stringify({ main: main_path, type: 'module' }) + ); builder.log.minor('Copying assets...'); builder.writeClient(bucket); @@ -86,6 +94,24 @@ function validate_config(builder) { ); } + // @ts-ignore + const main_file = wrangler_config.build?.upload?.main; + const main_file_ext = main_file?.split('.').slice(-1)[0]; + if (main_file_ext && main_file_ext !== 'mjs') { + // @ts-ignore + const upload_rules = wrangler_config.build?.upload?.rules; + // @ts-ignore + const matching_rule = upload_rules?.find(({ globs }) => + // @ts-ignore + globs.find((glob) => glob.endsWith(`*.${main_file_ext}`)) + ); + if (!matching_rule) { + throw new Error( + 'To support a build.upload.main value not ending in .mjs, an upload rule must be added to build.upload.rules. Consult https://developers.cloudflare.com/workers/cli-wrangler/configuration/#build' + ); + } + } + return wrangler_config; } @@ -104,6 +130,13 @@ function validate_config(builder) { route = "" zone_id = "" + [build] + command = "" + + [build.upload] + format = "modules" + main = "./worker.mjs" + [site] bucket = "./.cloudflare/assets" entry-point = "./.cloudflare/worker"`