diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js index 0969ba1bbf07..d595f21b0d58 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -1,5 +1,6 @@ import { Server } from 'SERVER'; import { manifest, prerendered } from 'MANIFEST'; +DURABLE_OBJECT_EXPORTS; import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler'; import static_asset_manifest_json from '__STATIC_CONTENT_MANIFEST'; const static_asset_manifest = JSON.parse(static_asset_manifest_json); diff --git a/packages/adapter-cloudflare-workers/index.d.ts b/packages/adapter-cloudflare-workers/index.d.ts index 8b90611b73c3..3472b8e6a059 100644 --- a/packages/adapter-cloudflare-workers/index.d.ts +++ b/packages/adapter-cloudflare-workers/index.d.ts @@ -1,4 +1,11 @@ import { Adapter } from '@sveltejs/kit'; import './ambient.js'; -export default function plugin(options: { config?: string }): Adapter; +export default function plugin(options: { + config?: string + /** + * Customize the file that exports DurableObject classes definitions + * @default "./src/lib/durableObjects.js" + */ + durableObjectExports?: string +}): Adapter; diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index e21c1b9bdd38..39bb33e85ca1 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -15,7 +15,7 @@ import { fileURLToPath } from 'node:url'; */ /** @type {import('.').default} */ -export default function ({ config = 'wrangler.toml' } = {}) { +export default function ({ config = 'wrangler.toml', ...options } = {}) { return { name: '@sveltejs/adapter-cloudflare-workers', @@ -38,10 +38,20 @@ export default function ({ config = 'wrangler.toml' } = {}) { builder.log.minor('Generating worker...'); const relativePath = posix.relative(tmp, builder.getServerDirectory()); + let durable_objects_exports = '' + try { + durable_objects_exports = readFileSync(options.durableObjectExports ?? './src/lib/durableObjects.js', 'utf-8') + } catch { + if (options.durableObjectExports) { + throw new Error('Specified durableObjectExports file not found'); + } + } + builder.copy(`${files}/entry.js`, `${tmp}/entry.js`, { replace: { SERVER: `${relativePath}/index.js`, - MANIFEST: './manifest.js' + MANIFEST: './manifest.js', + DURABLE_OBJECT_EXPORTS: durable_objects_exports } }); diff --git a/packages/adapter-cloudflare/index.d.ts b/packages/adapter-cloudflare/index.d.ts index e6fb925ff102..0f8f6abae3ed 100644 --- a/packages/adapter-cloudflare/index.d.ts +++ b/packages/adapter-cloudflare/index.d.ts @@ -30,6 +30,11 @@ export interface AdapterOptions { */ exclude?: string[]; }; + /** + * Customize the file that exports DurableObject classes definitions + * @default "./src/lib/durableObjects.js" + */ + durableObjectExports?: string } export interface RoutesJSONSpec { diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index ccf6887beca8..e4269e451bf7 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -1,4 +1,4 @@ -import { writeFileSync } from 'node:fs'; +import { readFileSync, writeFileSync } from 'node:fs'; import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; import * as esbuild from 'esbuild'; @@ -38,10 +38,20 @@ export default function (options = {}) { writeFileSync(`${dest}/_headers`, generate_headers(builder.config.kit.appDir), { flag: 'a' }); + let durable_objects_exports = '' + try { + durable_objects_exports = readFileSync(options.durableObjectExports ?? './src/lib/durableObjects.js', 'utf-8') + } catch { + if (options.durableObjectExports) { + throw new Error('Specified durableObjectExports file not found'); + } + } + builder.copy(`${files}/worker.js`, `${tmp}/_worker.js`, { replace: { SERVER: `${relativePath}/index.js`, - MANIFEST: './manifest.js' + MANIFEST: './manifest.js', + DURABLE_OBJECT_EXPORTS: durable_objects_exports } }); diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index 59e6af9f54a3..4963c5f68e34 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -1,5 +1,6 @@ import { Server } from 'SERVER'; import { manifest, prerendered } from 'MANIFEST'; +DURABLE_OBJECT_EXPORTS; import * as Cache from 'worktop/cfw.cache'; const server = new Server(manifest);