diff options
Diffstat (limited to 'packages/integrations/netlify')
-rw-r--r-- | packages/integrations/netlify/src/integration-edge-functions.ts | 46 | ||||
-rw-r--r-- | packages/integrations/netlify/src/integration-functions.ts | 28 |
2 files changed, 47 insertions, 27 deletions
diff --git a/packages/integrations/netlify/src/integration-edge-functions.ts b/packages/integrations/netlify/src/integration-edge-functions.ts index 11a18beb9..b69667dde 100644 --- a/packages/integrations/netlify/src/integration-edge-functions.ts +++ b/packages/integrations/netlify/src/integration-edge-functions.ts @@ -1,4 +1,4 @@ -import type { AstroAdapter, AstroConfig, AstroIntegration, BuildConfig, RouteData } from 'astro'; +import type { AstroAdapter, AstroConfig, AstroIntegration, RouteData } from 'astro'; import esbuild from 'esbuild'; import * as fs from 'fs'; import * as npath from 'path'; @@ -6,6 +6,12 @@ import { fileURLToPath } from 'url'; import type { Plugin as VitePlugin } from 'vite'; import { createRedirects } from './shared.js'; +interface BuildConfig { + server: URL; + client: URL; + serverEntry: string; +} + const SHIM = `globalThis.process = { argv: [], env: {}, @@ -74,8 +80,8 @@ async function createEdgeManifest(routes: RouteData[], entryFile: string, dir: U await fs.promises.writeFile(manifestURL, _manifest, 'utf-8'); } -async function bundleServerEntry(buildConfig: BuildConfig, vite: any) { - const entryUrl = new URL(buildConfig.serverEntry, buildConfig.server); +async function bundleServerEntry({ serverEntry, server }: BuildConfig, vite: any) { + const entryUrl = new URL(serverEntry, server); const pth = fileURLToPath(entryUrl); await esbuild.build({ target: 'es2020', @@ -96,7 +102,7 @@ async function bundleServerEntry(buildConfig: BuildConfig, vite: any) { const chunkFileNames = vite?.build?.rollupOptions?.output?.chunkFileNames ?? 'chunks/chunk.[hash].mjs'; const chunkPath = npath.dirname(chunkFileNames); - const chunksDirUrl = new URL(chunkPath + '/', buildConfig.server); + const chunksDirUrl = new URL(chunkPath + '/', server); await fs.promises.rm(chunksDirUrl, { recursive: true, force: true }); } catch {} } @@ -105,17 +111,13 @@ export function netlifyEdgeFunctions({ dist }: NetlifyEdgeFunctionsOptions = {}) let _config: AstroConfig; let entryFile: string; let _buildConfig: BuildConfig; + let needsBuildConfig = false; let _vite: any; return { name: '@astrojs/netlify/edge-functions', hooks: { 'astro:config:setup': ({ config, updateConfig }) => { - if (dist) { - config.outDir = dist; - } else { - config.outDir = new URL('./dist/', config.root); - } - + needsBuildConfig = !config.build.client; // Add a plugin that shims the global environment. const injectPlugin: VitePlugin = { name: '@astrojs/netlify/plugin-inject', @@ -128,8 +130,14 @@ export function netlifyEdgeFunctions({ dist }: NetlifyEdgeFunctionsOptions = {}) } }, }; - + const outDir = dist ?? new URL('./dist/', config.root); updateConfig({ + outDir, + build: { + client: outDir, + server: new URL('./.netlify/edge-functions/', config.root), + serverEntry: 'entry.js', + }, vite: { plugins: [injectPlugin], }, @@ -138,6 +146,8 @@ export function netlifyEdgeFunctions({ dist }: NetlifyEdgeFunctionsOptions = {}) 'astro:config:done': ({ config, setAdapter }) => { setAdapter(getAdapter()); _config = config; + _buildConfig = config.build; + entryFile = config.build.serverEntry.replace(/\.m?js/, ''); if (config.output === 'static') { console.warn(`[@astrojs/netlify] \`output: "server"\` is required to use this adapter.`); @@ -146,12 +156,14 @@ export function netlifyEdgeFunctions({ dist }: NetlifyEdgeFunctionsOptions = {}) ); } }, - 'astro:build:start': async ({ buildConfig }) => { - _buildConfig = buildConfig; - entryFile = buildConfig.serverEntry.replace(/\.m?js/, ''); - buildConfig.client = _config.outDir; - buildConfig.server = new URL('./.netlify/edge-functions/', _config.root); - buildConfig.serverEntry = 'entry.js'; + 'astro:build:start': ({ buildConfig }) => { + if(needsBuildConfig) { + buildConfig.client = _config.outDir; + buildConfig.server = new URL('./.netlify/edge-functions/', _config.root); + buildConfig.serverEntry = 'entry.js'; + _buildConfig = buildConfig; + entryFile = buildConfig.serverEntry.replace(/\.m?js/, ''); + } }, 'astro:build:setup': ({ vite, target }) => { if (target === 'server') { diff --git a/packages/integrations/netlify/src/integration-functions.ts b/packages/integrations/netlify/src/integration-functions.ts index d78fb1f32..025250bc1 100644 --- a/packages/integrations/netlify/src/integration-functions.ts +++ b/packages/integrations/netlify/src/integration-functions.ts @@ -22,19 +22,25 @@ function netlifyFunctions({ }: NetlifyFunctionsOptions = {}): AstroIntegration { let _config: AstroConfig; let entryFile: string; + let needsBuildConfig = false; return { name: '@astrojs/netlify', hooks: { - 'astro:config:setup': ({ config }) => { - if (dist) { - config.outDir = dist; - } else { - config.outDir = new URL('./dist/', config.root); - } + 'astro:config:setup': ({ config, updateConfig }) => { + needsBuildConfig = !config.build.client; + const outDir = dist ?? new URL('./dist/', config.root); + updateConfig({ + outDir, + build: { + client: outDir, + server: new URL('./.netlify/functions-internal/', config.root), + } + }); }, 'astro:config:done': ({ config, setAdapter }) => { setAdapter(getAdapter({ binaryMediaTypes })); _config = config; + entryFile = config.build.serverEntry.replace(/\.m?js/, ''); if (config.output === 'static') { console.warn(`[@astrojs/netlify] \`output: "server"\` is required to use this adapter.`); @@ -43,10 +49,12 @@ function netlifyFunctions({ ); } }, - 'astro:build:start': async ({ buildConfig }) => { - entryFile = buildConfig.serverEntry.replace(/\.m?js/, ''); - buildConfig.client = _config.outDir; - buildConfig.server = new URL('./.netlify/functions-internal/', _config.root); + 'astro:build:start': ({ buildConfig }) => { + if(needsBuildConfig) { + buildConfig.client = _config.outDir; + buildConfig.server = new URL('./.netlify/functions-internal/', _config.root); + entryFile = buildConfig.serverEntry.replace(/\.m?js/, ''); + } }, 'astro:build:done': async ({ routes, dir }) => { await createRedirects(routes, dir, entryFile, false); |