diff options
5 files changed, 67 insertions, 2 deletions
diff --git a/packages/integrations/netlify/src/index.ts b/packages/integrations/netlify/src/index.ts index 903bf996e..fe105cc62 100644 --- a/packages/integrations/netlify/src/index.ts +++ b/packages/integrations/netlify/src/index.ts @@ -49,9 +49,19 @@ export interface NetlifyIntegrationConfig { * If enabled, Astro Middleware is deployed as an Edge Function and applies to all routes. * Caveat: Locals set in Middleware are not applied to prerendered pages, because they've been rendered at build-time and are served from the CDN. * - * @default disabled + * @default {false} */ edgeMiddleware?: boolean; + + /** + * If enabled, Netlify Image CDN is used for image optimization. + * This transforms images on-the-fly without impacting build times. + * + * If disabled, Astro's built-in image optimization is run at build-time instead. + * + * @default {true} + */ + imageCDN?: boolean } export default function netlifyIntegration( @@ -226,6 +236,8 @@ export default function netlifyIntegration( outDir = new URL('./dist/', rootDir); + const enableImageCDN = isRunningInNetlify && (integrationConfig?.imageCDN ?? true); + updateConfig({ outDir, build: { @@ -242,7 +254,7 @@ export default function netlifyIntegration( }, image: { service: { - entrypoint: isRunningInNetlify ? '@astrojs/netlify/image-service.js' : undefined, + entrypoint: enableImageCDN ? '@astrojs/netlify/image-service.js' : undefined, }, }, }); diff --git a/packages/integrations/netlify/test/functions/fixtures/middleware/astro.config.mjs b/packages/integrations/netlify/test/functions/fixtures/middleware/astro.config.mjs index aefd9805c..ac8593fcc 100644 --- a/packages/integrations/netlify/test/functions/fixtures/middleware/astro.config.mjs +++ b/packages/integrations/netlify/test/functions/fixtures/middleware/astro.config.mjs @@ -5,6 +5,7 @@ export default defineConfig({ output: 'server', adapter: netlify({ edgeMiddleware: process.env.EDGE_MIDDLEWARE === 'true', + imageCDN: process.env.DISABLE_IMAGE_CDN ? false : undefined, }), site: `http://example.com`, });
\ No newline at end of file diff --git a/packages/integrations/netlify/test/functions/fixtures/middleware/src/astronaut.jpg b/packages/integrations/netlify/test/functions/fixtures/middleware/src/astronaut.jpg Binary files differnew file mode 100644 index 000000000..d3326bcc7 --- /dev/null +++ b/packages/integrations/netlify/test/functions/fixtures/middleware/src/astronaut.jpg diff --git a/packages/integrations/netlify/test/functions/fixtures/middleware/src/pages/astronaut.astro b/packages/integrations/netlify/test/functions/fixtures/middleware/src/pages/astronaut.astro new file mode 100644 index 000000000..b3da724c3 --- /dev/null +++ b/packages/integrations/netlify/test/functions/fixtures/middleware/src/pages/astronaut.astro @@ -0,0 +1,9 @@ +--- +import { Image } from 'astro:assets'; +import astronautImage from "../astronaut.jpg" + +export const prerender = true; +--- + +<Image src={astronautImage} alt="an astronaut floating in space" /> + diff --git a/packages/integrations/netlify/test/functions/image-cdn.test.js b/packages/integrations/netlify/test/functions/image-cdn.test.js new file mode 100644 index 000000000..21b5d195e --- /dev/null +++ b/packages/integrations/netlify/test/functions/image-cdn.test.js @@ -0,0 +1,43 @@ +import { loadFixture } from '@astrojs/test-utils'; +import { expect } from 'chai'; +import { describe } from 'node:test'; + +describe('Image CDN', () => { + const root = new URL('./fixtures/middleware/', import.meta.url); + + describe("when running outside of netlify", () => { + it("does not enable Image CDN", async () => { + const fixture = await loadFixture({ root }); + await fixture.build(); + + const astronautPage = await fixture.readFile('astronaut/index.html'); + expect(astronautPage).contains(`src="/_astro/astronaut.`) + }) + }) + + describe("when running inside of netlify", () => { + it("enables Netlify Image CDN", async () => { + process.env.NETLIFY = 'true' + const fixture = await loadFixture({ root }); + await fixture.build(); + + const astronautPage = await fixture.readFile('astronaut/index.html'); + expect(astronautPage).contains(`src="/.netlify/image`) + + process.env.NETLIFY = undefined + }) + + it("respects image CDN opt-out", async () => { + process.env.NETLIFY = 'true' + process.env.DISABLE_IMAGE_CDN = 'true' + const fixture = await loadFixture({ root }); + await fixture.build(); + + const astronautPage = await fixture.readFile('astronaut/index.html'); + expect(astronautPage).contains(`src="/_astro/astronaut.`) + + process.env.NETLIFY = undefined + process.env.DISABLE_IMAGE_CDN = undefined + }) + }) +}); |