From 4d2f9450a3dfec8bb93639f3c29d2f40abc26535 Mon Sep 17 00:00:00 2001 From: Maksim Karelov Date: Fri, 1 Sep 2023 17:54:23 +0700 Subject: [PATCH] Add ability to remove assets originals Related to #8143 Setting `assetsRemoveOriginals: true` will remove original images from `dist/_astro` folder --- .changeset/thirty-geckos-bathe.md | 5 +++++ packages/astro/src/@types/astro.ts | 18 +++++++++++++++++ packages/astro/src/assets/build/generate.ts | 22 ++++++++++++++++----- packages/astro/src/core/config/schema.ts | 3 +++ 4 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 .changeset/thirty-geckos-bathe.md diff --git a/.changeset/thirty-geckos-bathe.md b/.changeset/thirty-geckos-bathe.md new file mode 100644 index 000000000..cc8a7ba35 --- /dev/null +++ b/.changeset/thirty-geckos-bathe.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Add ability to remove assets originals diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index e8801d083..acc9aedc6 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -791,6 +791,24 @@ export interface AstroUserConfig { * ``` */ assetsPrefix?: string; + /** + * @docs + * @name build.assetsRemoveOriginals + * @type {boolean} + * @default `false` + * @version 3.0.6 + * @description + * Specifies necessity for removing assets originals. + * + * ```js + * { + * build: { + * assetsRemoveOriginals: true + * } + * } + * ``` + */ + assetsRemoveOriginals?: boolean; /** * @docs * @name build.serverEntry diff --git a/packages/astro/src/assets/build/generate.ts b/packages/astro/src/assets/build/generate.ts index b2004fad0..46742b18d 100644 --- a/packages/astro/src/assets/build/generate.ts +++ b/packages/astro/src/assets/build/generate.ts @@ -57,6 +57,23 @@ export async function generateImage( const finalFileURL = new URL('.' + filepath, clientRoot); const finalFolderURL = new URL('./', finalFileURL); + // The original filepath or URL from the image transform + const originalImagePath = isLocalImage + ? (options.src as ImageMetadata).src + : (options.src as string); + + if (config.build.assetsRemoveOriginals) { + const originalFileURL = new URL('.' + originalImagePath, clientRoot); + try { + await fs.promises.unlink(originalFileURL); + } catch (e) { + logger.warn( + 'astro:assets', + `An error was encountered while removing asset original. Error: ${e}` + ); + } + } + // For remote images, instead of saving the image directly, we save a JSON file with the image data and expiration date from the server const cacheFile = basename(filepath) + (isLocalImage ? '' : '.json'); const cachedFileURL = new URL(cacheFile, assetsCacheDir); @@ -90,11 +107,6 @@ export async function generateImage( // If the cache file doesn't exist, just move on, and we'll generate it } - // The original filepath or URL from the image transform - const originalImagePath = isLocalImage - ? (options.src as ImageMetadata).src - : (options.src as string); - let imageData; let resultData: { data: Buffer | undefined; expires: number | undefined } = { data: undefined, diff --git a/packages/astro/src/core/config/schema.ts b/packages/astro/src/core/config/schema.ts index 46ed2a01f..b517d8948 100644 --- a/packages/astro/src/core/config/schema.ts +++ b/packages/astro/src/core/config/schema.ts @@ -23,6 +23,7 @@ const ASTRO_CONFIG_DEFAULTS = { client: './dist/client/', server: './dist/server/', assets: '_astro', + assetsRemoveOriginals: false, serverEntry: 'entry.mjs', redirects: true, inlineStylesheets: 'auto', @@ -119,6 +120,7 @@ export const AstroConfigSchema = z.object({ .transform((val) => new URL(val)), assets: z.string().optional().default(ASTRO_CONFIG_DEFAULTS.build.assets), assetsPrefix: z.string().optional(), + assetsRemoveOriginals: z.boolean().default(ASTRO_CONFIG_DEFAULTS.build.assetsRemoveOriginals), serverEntry: z.string().optional().default(ASTRO_CONFIG_DEFAULTS.build.serverEntry), redirects: z.boolean().optional().default(ASTRO_CONFIG_DEFAULTS.build.redirects), inlineStylesheets: z @@ -341,6 +343,7 @@ export function createRelativeSchema(cmd: string, fileProtocolRoot: string) { .transform((val) => resolveDirAsUrl(val, fileProtocolRoot)), assets: z.string().optional().default(ASTRO_CONFIG_DEFAULTS.build.assets), assetsPrefix: z.string().optional(), + assetsRemoveOriginals: z.boolean().default(ASTRO_CONFIG_DEFAULTS.build.assetsRemoveOriginals), serverEntry: z.string().optional().default(ASTRO_CONFIG_DEFAULTS.build.serverEntry), redirects: z.boolean().optional().default(ASTRO_CONFIG_DEFAULTS.build.redirects), inlineStylesheets: z