Adds a new "astro:build:generated" hook for SSG builds (#4772)
* adds a new "astro:build:generated" hook for SSG builds * chore: add changeset
This commit is contained in:
parent
b2da8a124a
commit
03b18e8d1b
5 changed files with 38 additions and 0 deletions
5
.changeset/four-eggs-compare.md
Normal file
5
.changeset/four-eggs-compare.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'astro': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Adds a new "astro:build:generated" hook that runs after SSG builds finish but **before** build artifacts are cleaned up. This is a very specific use case, "astro:build:done" is probably what you're looking for.
|
|
@ -1159,6 +1159,7 @@ export interface AstroIntegration {
|
||||||
target: 'client' | 'server';
|
target: 'client' | 'server';
|
||||||
updateConfig: (newConfig: ViteConfigWithSSR) => void;
|
updateConfig: (newConfig: ViteConfigWithSSR) => void;
|
||||||
}) => void | Promise<void>;
|
}) => void | Promise<void>;
|
||||||
|
'astro:build:generated'?: (options: { dir: URL }) => void | Promise<void>;
|
||||||
'astro:build:done'?: (options: {
|
'astro:build:done'?: (options: {
|
||||||
pages: { pathname: string }[];
|
pages: { pathname: string }[];
|
||||||
dir: URL;
|
dir: URL;
|
||||||
|
|
|
@ -19,6 +19,7 @@ import {
|
||||||
removeTrailingForwardSlash,
|
removeTrailingForwardSlash,
|
||||||
} from '../../core/path.js';
|
} from '../../core/path.js';
|
||||||
import type { RenderOptions } from '../../core/render/core';
|
import type { RenderOptions } from '../../core/render/core';
|
||||||
|
import { runHookBuildGenerated } from '../../integrations/index.js';
|
||||||
import { BEFORE_HYDRATION_SCRIPT_ID, PAGE_SCRIPT_ID } from '../../vite-plugin-scripts/index.js';
|
import { BEFORE_HYDRATION_SCRIPT_ID, PAGE_SCRIPT_ID } from '../../vite-plugin-scripts/index.js';
|
||||||
import { call as callEndpoint } from '../endpoint/index.js';
|
import { call as callEndpoint } from '../endpoint/index.js';
|
||||||
import { debug, info } from '../logger/core.js';
|
import { debug, info } from '../logger/core.js';
|
||||||
|
@ -111,6 +112,9 @@ export async function generatePages(opts: StaticBuildOptions, internals: BuildIn
|
||||||
for (const pageData of eachPageData(internals)) {
|
for (const pageData of eachPageData(internals)) {
|
||||||
await generatePage(opts, internals, pageData, ssrEntry, builtPaths);
|
await generatePage(opts, internals, pageData, ssrEntry, builtPaths);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await runHookBuildGenerated({ config: opts.astroConfig, buildConfig: opts.buildConfig, logging: opts.logging });
|
||||||
|
|
||||||
info(opts.logging, null, dim(`Completed in ${getTimeStat(timer, performance.now())}.\n`));
|
info(opts.logging, null, dim(`Completed in ${getTimeStat(timer, performance.now())}.\n`));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -263,6 +263,28 @@ export async function runHookBuildSsr({
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function runHookBuildGenerated({
|
||||||
|
config,
|
||||||
|
buildConfig,
|
||||||
|
logging,
|
||||||
|
}: {
|
||||||
|
config: AstroConfig;
|
||||||
|
buildConfig: BuildConfig;
|
||||||
|
logging: LogOptions;
|
||||||
|
}) {
|
||||||
|
const dir = config.output === 'server' ? buildConfig.client : config.outDir;
|
||||||
|
|
||||||
|
for (const integration of config.integrations) {
|
||||||
|
if (integration?.hooks?.['astro:build:generated']) {
|
||||||
|
await withTakingALongTimeMsg({
|
||||||
|
name: integration.name,
|
||||||
|
hookResult: integration.hooks['astro:build:generated']({ dir }),
|
||||||
|
logging,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function runHookBuildDone({
|
export async function runHookBuildDone({
|
||||||
config,
|
config,
|
||||||
buildConfig,
|
buildConfig,
|
||||||
|
|
|
@ -4,6 +4,8 @@ import { loadFixture } from './test-utils.js';
|
||||||
describe('Static build: dir takes the URL path to the output directory', () => {
|
describe('Static build: dir takes the URL path to the output directory', () => {
|
||||||
/** @type {URL} */
|
/** @type {URL} */
|
||||||
let checkDir;
|
let checkDir;
|
||||||
|
/** @type {URL} */
|
||||||
|
let checkGeneratedDir;
|
||||||
before(async () => {
|
before(async () => {
|
||||||
const fixture = await loadFixture({
|
const fixture = await loadFixture({
|
||||||
root: './fixtures/static-build-dir/',
|
root: './fixtures/static-build-dir/',
|
||||||
|
@ -11,6 +13,9 @@ describe('Static build: dir takes the URL path to the output directory', () => {
|
||||||
{
|
{
|
||||||
name: '@astrojs/dir',
|
name: '@astrojs/dir',
|
||||||
hooks: {
|
hooks: {
|
||||||
|
'astro:build:generated': ({ dir }) => {
|
||||||
|
checkGeneratedDir = dir;
|
||||||
|
},
|
||||||
'astro:build:done': ({ dir }) => {
|
'astro:build:done': ({ dir }) => {
|
||||||
checkDir = dir;
|
checkDir = dir;
|
||||||
},
|
},
|
||||||
|
@ -25,5 +30,6 @@ describe('Static build: dir takes the URL path to the output directory', () => {
|
||||||
expect(removeTrailingSlash(checkDir.toString())).to.be.equal(
|
expect(removeTrailingSlash(checkDir.toString())).to.be.equal(
|
||||||
removeTrailingSlash(new URL('./fixtures/static-build-dir/dist', import.meta.url).toString())
|
removeTrailingSlash(new URL('./fixtures/static-build-dir/dist', import.meta.url).toString())
|
||||||
);
|
);
|
||||||
|
expect(checkDir.toString()).to.be.equal(checkGeneratedDir.toString());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue