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';
|
||||
updateConfig: (newConfig: ViteConfigWithSSR) => void;
|
||||
}) => void | Promise<void>;
|
||||
'astro:build:generated'?: (options: { dir: URL }) => void | Promise<void>;
|
||||
'astro:build:done'?: (options: {
|
||||
pages: { pathname: string }[];
|
||||
dir: URL;
|
||||
|
|
|
@ -19,6 +19,7 @@ import {
|
|||
removeTrailingForwardSlash,
|
||||
} from '../../core/path.js';
|
||||
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 { call as callEndpoint } from '../endpoint/index.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)) {
|
||||
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`));
|
||||
}
|
||||
|
||||
|
|
|
@ -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({
|
||||
config,
|
||||
buildConfig,
|
||||
|
|
|
@ -4,6 +4,8 @@ import { loadFixture } from './test-utils.js';
|
|||
describe('Static build: dir takes the URL path to the output directory', () => {
|
||||
/** @type {URL} */
|
||||
let checkDir;
|
||||
/** @type {URL} */
|
||||
let checkGeneratedDir;
|
||||
before(async () => {
|
||||
const fixture = await loadFixture({
|
||||
root: './fixtures/static-build-dir/',
|
||||
|
@ -11,6 +13,9 @@ describe('Static build: dir takes the URL path to the output directory', () => {
|
|||
{
|
||||
name: '@astrojs/dir',
|
||||
hooks: {
|
||||
'astro:build:generated': ({ dir }) => {
|
||||
checkGeneratedDir = dir;
|
||||
},
|
||||
'astro:build:done': ({ 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(
|
||||
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