diff --git a/examples/hattip-app/pages/+config.ts b/examples/hattip-app/pages/+config.ts index c94eeca..49bbdb5 100644 --- a/examples/hattip-app/pages/+config.ts +++ b/examples/hattip-app/pages/+config.ts @@ -1,4 +1,5 @@ import vikeSolid from "vike-solid/config"; +import vikeCloudflare from "vike-cloudflare/config"; import type { Config } from "vike/types"; import Head from "../layouts/HeadDefault.js"; import Layout from "../layouts/LayoutDefault.js"; @@ -9,5 +10,9 @@ export default { Head, title: "My Vike App", stream: "web", - extends: vikeSolid, + server: { + kind: "hattip", + entry: "hattip-entry.ts", + }, + extends: [vikeSolid, vikeCloudflare], } satisfies Config; diff --git a/examples/hattip-app/vite.config.ts b/examples/hattip-app/vite.config.ts index 9a97856..affcc6e 100644 --- a/examples/hattip-app/vite.config.ts +++ b/examples/hattip-app/vite.config.ts @@ -1,5 +1,4 @@ import { hattip } from "@hattip/vite"; -import { pages } from "vike-cloudflare"; import vikeSolid from "vike-solid/vite"; import vike from "vike/plugin"; import { defineConfig } from "vite"; @@ -8,15 +7,5 @@ export default defineConfig({ build: { target: "es2022", }, - plugins: [ - hattip(), - vike({}), - vikeSolid(), - pages({ - server: { - kind: "hattip", - entry: "hattip-entry.ts", - }, - }), - ], + plugins: [hattip(), vike(), vikeSolid()], }); diff --git a/examples/hono-app/pages/+config.ts b/examples/hono-app/pages/+config.ts index fdb9049..ee95fa0 100644 --- a/examples/hono-app/pages/+config.ts +++ b/examples/hono-app/pages/+config.ts @@ -1,4 +1,5 @@ import vikeSolid from "vike-solid/config"; +import vikeCloudflare from "vike-cloudflare/config"; import type { Config } from "vike/types"; import Head from "../layouts/HeadDefault.js"; import Layout from "../layouts/LayoutDefault.js"; @@ -9,5 +10,9 @@ export default { Head, // title: "My Vike App", - extends: vikeSolid, + server: { + kind: "hono", + entry: "hono-entry.ts", + }, + extends: [vikeSolid, vikeCloudflare], } satisfies Config; diff --git a/examples/hono-app/vite.config.ts b/examples/hono-app/vite.config.ts index 5df1e8f..79a7ca1 100644 --- a/examples/hono-app/vite.config.ts +++ b/examples/hono-app/vite.config.ts @@ -1,6 +1,5 @@ import devServer from "@hono/vite-dev-server"; import adapter from "@hono/vite-dev-server/cloudflare"; -import { pages } from "vike-cloudflare"; import vikeSolid from "vike-solid/vite"; import vike from "vike/plugin"; import { defineConfig } from "vite"; @@ -26,13 +25,7 @@ export default defineConfig({ injectClientScript: false, }), - vike({}), + vike(), vikeSolid(), - pages({ - server: { - kind: "hono", - entry: "hono-entry.ts", - }, - }), ], }); diff --git a/examples/vike-app/pages/+config.ts b/examples/vike-app/pages/+config.ts index fdb9049..96b745d 100644 --- a/examples/vike-app/pages/+config.ts +++ b/examples/vike-app/pages/+config.ts @@ -1,4 +1,5 @@ import vikeSolid from "vike-solid/config"; +import vikeCloudflare from "vike-cloudflare/config"; import type { Config } from "vike/types"; import Head from "../layouts/HeadDefault.js"; import Layout from "../layouts/LayoutDefault.js"; @@ -9,5 +10,5 @@ export default { Head, // <title> title: "My Vike App", - extends: vikeSolid, + extends: [vikeSolid, vikeCloudflare], } satisfies Config; diff --git a/examples/vike-app/vite.config.ts b/examples/vike-app/vite.config.ts index ff3d962..0f4ede2 100644 --- a/examples/vike-app/vite.config.ts +++ b/examples/vike-app/vite.config.ts @@ -1,4 +1,3 @@ -import { pages } from "vike-cloudflare"; import vikeSolid from "vike-solid/vite"; import vike from "vike/plugin"; import { defineConfig } from "vite"; @@ -7,5 +6,5 @@ export default defineConfig({ build: { target: "es2022", }, - plugins: [vike({}), vikeSolid(), pages()], + plugins: [vike(), vikeSolid()], }); diff --git a/packages/vike-cloudflare/package.json b/packages/vike-cloudflare/package.json index 12ec035..032f16a 100644 --- a/packages/vike-cloudflare/package.json +++ b/packages/vike-cloudflare/package.json @@ -44,6 +44,7 @@ "types": "./dist/index.d.ts", "default": "./dist/index.js" }, + "./config": "./dist/config.js", "./types": { "types": "./vike.d.ts" } diff --git a/packages/vike-cloudflare/src/config.ts b/packages/vike-cloudflare/src/config.ts new file mode 100644 index 0000000..b6a4d9b --- /dev/null +++ b/packages/vike-cloudflare/src/config.ts @@ -0,0 +1,31 @@ +export { config as default }; + +import { pages as plugin, type VikeCloudflarePagesOptions } from "./index"; +import type { Config } from "vike/types"; + +const config = { + name: "vike-cloudflare", + require: { + vike: ">=0.4.219", + }, + vite: { + plugins: [plugin()], + }, + /* TODO/now + prerender: { + value: null, + disableAutoFullBuild: true + }, + */ + meta: { + server: { env: { config: true }, global: true }, + }, +} satisfies Config; + +declare global { + namespace Vike { + interface Config { + server?: VikeCloudflarePagesOptions["server"]; + } + } +} diff --git a/packages/vike-cloudflare/src/index.ts b/packages/vike-cloudflare/src/index.ts index b2033a3..79cf948 100644 --- a/packages/vike-cloudflare/src/index.ts +++ b/packages/vike-cloudflare/src/index.ts @@ -6,6 +6,20 @@ import { normalizePath, type Plugin, type ResolvedConfig } from "vite"; import hattipAsset from "../assets/hattip.js?raw"; import honoAsset from "../assets/hono.js?raw"; import vikeAsset from "../assets/vike.js?raw"; +import type { Config } from "vike/types"; + +declare module "vite" { + interface UserConfig { + // TODO/now: + // - Re-use declaration merging done by Vike + // - Extend ResolvedConfig ? + vike?: { + global: { + config: Config; + }; + }; + } +} const NAME = "vike-cloudflare"; const WORKER_JS_NAME = "_worker.js"; @@ -36,25 +50,17 @@ function getAsset(kind: SupportedServers | undefined) { } } -export const pages = (options?: VikeCloudflarePagesOptions): Plugin[] => { +export const pages = (): any => { const virtualEntryId = "virtual:vike-cloudflare-entry"; const virtualServerId = "virtual:vike-cloudflare-server"; const resolvedVirtualServerId = `\0${virtualServerId}`; let resolvedConfig: ResolvedConfig; let shouldPrerender = false; + let options: VikeCloudflarePagesOptions; return [ { name: `${NAME}:disableAutoFullBuild`, - // @ts-ignore - config() { - return { - // TODO/next-major-release: remove this and require >=vike@0.4.219 - vitePluginSsr: { - disableAutoFullBuild: "prerender", - }, - }; - }, }, { name: NAME, @@ -101,9 +107,8 @@ export const pages = (options?: VikeCloudflarePagesOptions): Plugin[] => { }, configResolved: async (config) => { resolvedConfig = config; - // TODO/next-major-release: remove this and require >=vike@0.4.219 - // biome-ignore lint/suspicious/noExplicitAny: - shouldPrerender = !!(await (config as any).configVikePromise).prerender; + options = { server: config.vike!.global.config.server }; + shouldPrerender = !!config.vike!.global.config.prerender; }, options(inputOptions) { assert( @@ -196,7 +201,7 @@ export default handler; }, }, }, - ]; + ] satisfies Plugin[]; }; async function symlinkOrCopy(target: string, path: string) { diff --git a/packages/vike-cloudflare/tsup.config.ts b/packages/vike-cloudflare/tsup.config.ts index 40152bc..c7a0ebc 100644 --- a/packages/vike-cloudflare/tsup.config.ts +++ b/packages/vike-cloudflare/tsup.config.ts @@ -5,7 +5,7 @@ export default defineConfig({ target: "node18", format: "esm", dts: true, - entry: ["src/index.ts"], + entry: ["src/index.ts", "src/config.ts"], clean: true, esbuildPlugins: [RawPlugin()], });