summaryrefslogtreecommitdiff
path: root/packages/integrations
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations')
-rw-r--r--packages/integrations/image/src/build/ssg.ts15
-rw-r--r--packages/integrations/image/src/index.ts6
-rw-r--r--packages/integrations/image/src/vite-plugin-astro-image.ts6
-rw-r--r--packages/integrations/image/test/assets-prefix.test.js22
-rw-r--r--packages/integrations/image/test/fixtures/assets-prefix/astro.config.mjs10
-rw-r--r--packages/integrations/image/test/fixtures/assets-prefix/package.json9
-rw-r--r--packages/integrations/image/test/fixtures/assets-prefix/src/assets/social.pngbin0 -> 1512228 bytes
-rw-r--r--packages/integrations/image/test/fixtures/assets-prefix/src/pages/index.astro13
8 files changed, 74 insertions, 7 deletions
diff --git a/packages/integrations/image/src/build/ssg.ts b/packages/integrations/image/src/build/ssg.ts
index 41fc510d7..2a6976d76 100644
--- a/packages/integrations/image/src/build/ssg.ts
+++ b/packages/integrations/image/src/build/ssg.ts
@@ -8,7 +8,7 @@ import path from 'node:path';
import { fileURLToPath } from 'node:url';
import type { SSRImageService, TransformOptions } from '../loaders/index.js';
import { debug, info, warn, type LoggerLevel } from '../utils/logger.js';
-import { isRemoteImage } from '../utils/paths.js';
+import { isRemoteImage, prependForwardSlash } from '../utils/paths.js';
import { ImageCache } from './cache.js';
async function loadLocalImage(src: string | URL) {
@@ -135,10 +135,15 @@ export async function ssgBuild({
// tracks the cache duration for the original source image
let expires = 0;
- // Vite will prefix a hashed image with the base path, we need to strip this
- // off to find the actual file relative to /dist
- if (config.base && src.startsWith(config.base)) {
- src = src.substring(config.base.length - +config.base.endsWith('/'));
+ // Strip leading assetsPrefix or base added by addStaticImage
+ if (config.build.assetsPrefix) {
+ if (src.startsWith(config.build.assetsPrefix)) {
+ src = prependForwardSlash(src.slice(config.build.assetsPrefix.length));
+ }
+ } else if (config.base) {
+ if (src.startsWith(config.base)) {
+ src = prependForwardSlash(src.slice(config.base.length));
+ }
}
if (isRemoteImage(src)) {
diff --git a/packages/integrations/image/src/index.ts b/packages/integrations/image/src/index.ts
index 0a101724e..671faad5c 100644
--- a/packages/integrations/image/src/index.ts
+++ b/packages/integrations/image/src/index.ts
@@ -130,7 +130,11 @@ export default function integration(options: IntegrationOptions = {}): AstroInte
// Doing this here makes sure that base is ignored when building
// staticImages to /dist, but the rendered HTML will include the
// base prefix for `src`.
- return prependForwardSlash(joinPaths(_config.base, _buildConfig.assets, filename));
+ if (_config.build.assetsPrefix) {
+ return joinPaths(_config.build.assetsPrefix, _buildConfig.assets, filename);
+ } else {
+ return prependForwardSlash(joinPaths(_config.base, _buildConfig.assets, filename));
+ }
}
// Helpers for building static images should only be available for SSG
diff --git a/packages/integrations/image/src/vite-plugin-astro-image.ts b/packages/integrations/image/src/vite-plugin-astro-image.ts
index b721578a5..bf5078fb3 100644
--- a/packages/integrations/image/src/vite-plugin-astro-image.ts
+++ b/packages/integrations/image/src/vite-plugin-astro-image.ts
@@ -9,6 +9,7 @@ import type { Plugin, ResolvedConfig } from 'vite';
import type { IntegrationOptions } from './index.js';
import type { InputFormat } from './loaders/index.js';
import { metadata } from './utils/metadata.js';
+import { appendForwardSlash } from './utils/paths.js';
export interface ImageMetadata {
src: string;
@@ -118,7 +119,10 @@ export function createPlugin(config: AstroConfig, options: Required<IntegrationO
const [full, hash, postfix = ''] = match;
const file = this.getFileName(hash);
- const outputFilepath = resolvedConfig.base + file + postfix;
+ const prefix = config.build.assetsPrefix
+ ? appendForwardSlash(config.build.assetsPrefix)
+ : config.base;
+ const outputFilepath = prefix + file + postfix;
s.overwrite(match.index, match.index + full.length, outputFilepath);
}
diff --git a/packages/integrations/image/test/assets-prefix.test.js b/packages/integrations/image/test/assets-prefix.test.js
new file mode 100644
index 000000000..099acfeb3
--- /dev/null
+++ b/packages/integrations/image/test/assets-prefix.test.js
@@ -0,0 +1,22 @@
+import { expect } from 'chai';
+import * as cheerio from 'cheerio';
+import { loadFixture } from './test-utils.js';
+
+const assetsPrefixRegex = /^http:\/\/localhost:4321\/_astro\/.*/;
+
+describe('Assets Prefix', function () {
+ /** @type {import('../../../astro/test/test-utils').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({ root: './fixtures/assets-prefix/' });
+ await fixture.build();
+ });
+
+ it('images src has assets prefix', async () => {
+ const html = await fixture.readFile('/index.html');
+ const $ = cheerio.load(html);
+ const img = $('#social-jpg');
+ expect(img.attr('src')).to.match(assetsPrefixRegex);
+ });
+});
diff --git a/packages/integrations/image/test/fixtures/assets-prefix/astro.config.mjs b/packages/integrations/image/test/fixtures/assets-prefix/astro.config.mjs
new file mode 100644
index 000000000..e5a629ed0
--- /dev/null
+++ b/packages/integrations/image/test/fixtures/assets-prefix/astro.config.mjs
@@ -0,0 +1,10 @@
+import { defineConfig } from 'astro/config';
+import image from '@astrojs/image';
+
+// https://astro.build/config
+export default defineConfig({
+ integrations: [image()],
+ build: {
+ assetsPrefix: 'http://localhost:4321',
+ }
+});
diff --git a/packages/integrations/image/test/fixtures/assets-prefix/package.json b/packages/integrations/image/test/fixtures/assets-prefix/package.json
new file mode 100644
index 000000000..a72317c84
--- /dev/null
+++ b/packages/integrations/image/test/fixtures/assets-prefix/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/image-assets-prefix",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/image": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/image/test/fixtures/assets-prefix/src/assets/social.png b/packages/integrations/image/test/fixtures/assets-prefix/src/assets/social.png
new file mode 100644
index 000000000..1399856f1
--- /dev/null
+++ b/packages/integrations/image/test/fixtures/assets-prefix/src/assets/social.png
Binary files differ
diff --git a/packages/integrations/image/test/fixtures/assets-prefix/src/pages/index.astro b/packages/integrations/image/test/fixtures/assets-prefix/src/pages/index.astro
new file mode 100644
index 000000000..b66a202be
--- /dev/null
+++ b/packages/integrations/image/test/fixtures/assets-prefix/src/pages/index.astro
@@ -0,0 +1,13 @@
+---
+import socialJpg from '../assets/social.png';
+import { Image } from '@astrojs/image/components';
+---
+
+<html>
+ <head>
+ <!-- Head Stuff -->
+ </head>
+ <body>
+ <Image id="social-jpg" src={socialJpg} width={506} height={253} alt="social-jpg" />
+ </body>
+</html>