diff options
Diffstat (limited to 'packages/integrations/netlify/src')
-rw-r--r-- | packages/integrations/netlify/src/index.ts | 50 | ||||
-rw-r--r-- | packages/integrations/netlify/src/polyfill.ts | 3 | ||||
-rw-r--r-- | packages/integrations/netlify/src/ssr-function.ts | 13 |
3 files changed, 27 insertions, 39 deletions
diff --git a/packages/integrations/netlify/src/index.ts b/packages/integrations/netlify/src/index.ts index 8ce19d51e..a64bfb59c 100644 --- a/packages/integrations/netlify/src/index.ts +++ b/packages/integrations/netlify/src/index.ts @@ -5,7 +5,13 @@ import { fileURLToPath } from 'node:url'; import { emptyDir } from '@astrojs/internal-helpers/fs'; import { createRedirectsFromAstroRoutes } from '@astrojs/underscore-redirects'; import type { Context } from '@netlify/functions'; -import type { AstroConfig, AstroIntegration, AstroIntegrationLogger, RouteData } from 'astro'; +import type { + AstroConfig, + AstroIntegration, + AstroIntegrationLogger, + HookParameters, + IntegrationRouteData, +} from 'astro'; import { build } from 'esbuild'; import { copyDependenciesToFunction } from './lib/nft.js'; import type { Args } from './ssr-function.js'; @@ -20,7 +26,7 @@ export interface NetlifyLocals { }; } -const isStaticRedirect = (route: RouteData) => +const isStaticRedirect = (route: IntegrationRouteData) => route.type === 'redirect' && (route.redirect || route.redirectRoute); type RemotePattern = AstroConfig['image']['remotePatterns'][number]; @@ -135,16 +141,6 @@ async function writeNetlifyFrameworkConfig(config: AstroConfig, logger: AstroInt ); } -// TODO: remove once we don't use a TLA anymore -async function shouldExternalizeAstroEnvSetup() { - try { - await import('astro/env/setup'); - return false; - } catch { - return true; - } -} - export interface NetlifyIntegrationConfig { /** * If enabled, On-Demand-Rendered pages are cached for up to a year. @@ -201,6 +197,8 @@ export default function netlifyIntegration( // Secret used to verify that the caller is the astro-generated edge middleware and not a third-party const middlewareSecret = randomUUID(); + let finalBuildOutput: HookParameters<'astro:config:done'>['buildOutput']; + const TRACE_CACHE = {}; const ssrBuildDir = () => new URL('./.netlify/build/', rootDir); @@ -214,8 +212,8 @@ export default function netlifyIntegration( emptyDir(ssrBuildDir()), ]); - async function writeRedirects(routes: RouteData[], dir: URL) { - const fallback = _config.output === 'static' ? '/.netlify/static' : '/.netlify/functions/ssr'; + async function writeRedirects(routes: IntegrationRouteData[], dir: URL) { + const fallback = finalBuildOutput === 'static' ? '/.netlify/static' : '/.netlify/functions/ssr'; const redirects = createRedirectsFromAstroRoutes({ config: _config, dir, @@ -289,7 +287,7 @@ export default function netlifyIntegration( import { createContext, trySerializeLocals } from 'astro/middleware'; export default async (request, context) => { - const ctx = createContext({ + const ctx = createContext({ request, params: {} }); @@ -319,7 +317,7 @@ export default function netlifyIntegration( request.headers.set("x-astro-middleware-secret", "${middlewareSecret}"); return context.next(); }; - + return onRequest(ctx, next); } @@ -452,11 +450,6 @@ export default function netlifyIntegration( ignored: [fileURLToPath(new URL('./.netlify/**', rootDir))], }, }, - ...((await shouldExternalizeAstroEnvSetup()) - ? { - ssr: { external: ['astro/env/setup'] }, - } - : {}), }, image: { service: { @@ -465,10 +458,12 @@ export default function netlifyIntegration( }, }); }, - 'astro:config:done': async ({ config, setAdapter, logger }) => { + 'astro:config:done': async ({ config, setAdapter, logger, buildOutput }) => { rootDir = config.root; _config = config; + finalBuildOutput = buildOutput; + await writeNetlifyFrameworkConfig(config, logger); const edgeMiddleware = integrationConfig?.edgeMiddleware ?? false; @@ -478,7 +473,6 @@ export default function netlifyIntegration( serverEntrypoint: '@astrojs/netlify/ssr-function.js', exports: ['default'], adapterFeatures: { - functionPerRoute: false, edgeMiddleware, }, args: { middlewareSecret } satisfies Args, @@ -486,13 +480,7 @@ export default function netlifyIntegration( hybridOutput: 'stable', staticOutput: 'stable', serverOutput: 'stable', - assets: { - // keeping this as experimental at least until Netlify Image CDN is out of beta - supportKind: 'experimental', - // still using Netlify Image CDN instead - isSharpCompatible: true, - isSquooshCompatible: true, - }, + sharpImageService: 'stable', envGetSecret: 'experimental', }, }); @@ -504,7 +492,7 @@ export default function netlifyIntegration( await writeRedirects(routes, dir); logger.info('Emitted _redirects'); - if (_config.output !== 'static') { + if (finalBuildOutput !== 'static') { let notFoundContent = undefined; try { notFoundContent = await readFile(new URL('./404.html', dir), 'utf8'); diff --git a/packages/integrations/netlify/src/polyfill.ts b/packages/integrations/netlify/src/polyfill.ts new file mode 100644 index 000000000..dc00f45d7 --- /dev/null +++ b/packages/integrations/netlify/src/polyfill.ts @@ -0,0 +1,3 @@ +import { applyPolyfills } from 'astro/app/node'; + +applyPolyfills(); diff --git a/packages/integrations/netlify/src/ssr-function.ts b/packages/integrations/netlify/src/ssr-function.ts index 22925ddaa..5ea2e97f1 100644 --- a/packages/integrations/netlify/src/ssr-function.ts +++ b/packages/integrations/netlify/src/ssr-function.ts @@ -1,15 +1,12 @@ +// Keep at the top +import './polyfill.js'; + import type { Context } from '@netlify/functions'; import type { SSRManifest } from 'astro'; import { App } from 'astro/app'; -import { applyPolyfills } from 'astro/app/node'; - -applyPolyfills(); +import { setGetEnv } from 'astro/env/setup'; -// Won't throw if the virtual module is not available because it's not supported in -// the users's astro version or if astro:env is not enabled in the project -await import('astro/env/setup') - .then((mod) => mod.setGetEnv((key) => process.env[key])) - .catch(() => {}); +setGetEnv((key) => process.env[key]); export interface Args { middlewareSecret: string; |