summaryrefslogtreecommitdiff
path: root/packages/integrations/netlify/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/netlify/src')
-rw-r--r--packages/integrations/netlify/src/index.ts50
-rw-r--r--packages/integrations/netlify/src/polyfill.ts3
-rw-r--r--packages/integrations/netlify/src/ssr-function.ts13
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;