address feedback

This commit is contained in:
Emanuele Stoppa 2023-07-26 09:07:09 +01:00
parent 95110f4aec
commit a25d3497e1
3 changed files with 116 additions and 139 deletions

View file

@ -1857,8 +1857,7 @@ export interface AstroIntegration {
name: string; name: string;
/** The different hooks available to extend. */ /** The different hooks available to extend. */
hooks: { hooks: {
'astro:config:setup'?: ( 'astro:config:setup'?: (options: {
options: {
config: AstroConfig; config: AstroConfig;
command: 'dev' | 'build' | 'preview'; command: 'dev' | 'build' | 'preview';
isRestart: boolean; isRestart: boolean;
@ -1868,31 +1867,27 @@ export interface AstroIntegration {
injectScript: (stage: InjectedScriptStage, content: string) => void; injectScript: (stage: InjectedScriptStage, content: string) => void;
injectRoute: (injectRoute: InjectedRoute) => void; injectRoute: (injectRoute: InjectedRoute) => void;
addClientDirective: (directive: ClientDirectiveConfig) => void; addClientDirective: (directive: ClientDirectiveConfig) => void;
logger: AstroIntegrationLogger;
// TODO: Add support for `injectElement()` for full HTML element injection, not just scripts. // TODO: Add support for `injectElement()` for full HTML element injection, not just scripts.
// This may require some refactoring of `scripts`, `styles`, and `links` into something // This may require some refactoring of `scripts`, `styles`, and `links` into something
// more generalized. Consider the SSR use-case as well. // more generalized. Consider the SSR use-case as well.
// injectElement: (stage: vite.HtmlTagDescriptor, element: string) => void; // injectElement: (stage: vite.HtmlTagDescriptor, element: string) => void;
}, }) => void | Promise<void>;
bag: AstroIntegrationBag 'astro:config:done'?: (options: {
) => void | Promise<void>;
'astro:config:done'?: (
options: {
config: AstroConfig; config: AstroConfig;
setAdapter: (adapter: AstroAdapter) => void; setAdapter: (adapter: AstroAdapter) => void;
}, logger: AstroIntegrationLogger;
bag: AstroIntegrationBag }) => void | Promise<void>;
) => void | Promise<void>; 'astro:server:setup'?: (options: {
'astro:server:setup'?: ( server: vite.ViteDevServer;
options: { server: vite.ViteDevServer }, logger: AstroIntegrationLogger;
bag: AstroIntegrationBag }) => void | Promise<void>;
) => void | Promise<void>; 'astro:server:start'?: (options: {
'astro:server:start'?: ( address: AddressInfo;
options: { address: AddressInfo }, logger: AstroIntegrationLogger;
bag: AstroIntegrationBag }) => void | Promise<void>;
) => void | Promise<void>; 'astro:server:done'?: (options: { logger: AstroIntegrationLogger }) => void | Promise<void>;
'astro:server:done'?: (bag: AstroIntegrationBag) => void | Promise<void>; 'astro:build:ssr'?: (options: {
'astro:build:ssr'?: (
options: {
manifest: SerializedSSRManifest; manifest: SerializedSSRManifest;
/** /**
* This maps a {@link RouteData} to an {@link URL}, this URL represents * This maps a {@link RouteData} to an {@link URL}, this URL represents
@ -1903,41 +1898,29 @@ export interface AstroIntegration {
* File path of the emitted middleware * File path of the emitted middleware
*/ */
middlewareEntryPoint: URL | undefined; middlewareEntryPoint: URL | undefined;
}, logger: AstroIntegrationLogger;
bag: AstroIntegrationBag }) => void | Promise<void>;
) => void | Promise<void>; 'astro:build:start'?: (options: { logger: AstroIntegrationLogger }) => void | Promise<void>;
'astro:build:start'?: (bag: AstroIntegrationBag) => void | Promise<void>; 'astro:build:setup'?: (options: {
'astro:build:setup'?: (
options: {
vite: vite.InlineConfig; vite: vite.InlineConfig;
pages: Map<string, PageBuildData>; pages: Map<string, PageBuildData>;
target: 'client' | 'server'; target: 'client' | 'server';
updateConfig: (newConfig: vite.InlineConfig) => void; updateConfig: (newConfig: vite.InlineConfig) => void;
}, logger: AstroIntegrationLogger;
bag: AstroIntegrationBag }) => void | Promise<void>;
) => void | Promise<void>; 'astro:build:generated'?: (options: {
'astro:build:generated'?: ( dir: URL;
options: { dir: URL }, logger: AstroIntegrationLogger;
bag: AstroIntegrationBag }) => void | Promise<void>;
) => void | Promise<void>; 'astro:build:done'?: (options: {
'astro:build:done'?: (
options: {
pages: { pathname: string }[]; pages: { pathname: string }[];
dir: URL; dir: URL;
routes: RouteData[]; routes: RouteData[];
}, logger: AstroIntegrationLogger;
bag: AstroIntegrationBag }) => void | Promise<void>;
) => void | Promise<void>;
}; };
} }
/**
* A set of utilities that are passed at each hook
*/
export type AstroIntegrationBag = {
logger: AstroIntegrationLogger;
};
export type MiddlewareNext<R> = () => Promise<R>; export type MiddlewareNext<R> = () => Promise<R>;
export type MiddlewareHandler<R> = ( export type MiddlewareHandler<R> = (
context: APIContext, context: APIContext,

View file

@ -157,7 +157,7 @@ export class AstroIntegrationLogger {
} }
/** /**
* Creates a new logger instances with a new label, but the same log options. * Creates a new logger instance with a new label, but the same log options.
*/ */
fork(label: string): AstroIntegrationLogger { fork(label: string): AstroIntegrationLogger {
return new AstroIntegrationLogger(this.options, label); return new AstroIntegrationLogger(this.options, label);

View file

@ -5,6 +5,7 @@ import { fileURLToPath } from 'node:url';
import type { InlineConfig, ViteDevServer } from 'vite'; import type { InlineConfig, ViteDevServer } from 'vite';
import type { import type {
AstroConfig, AstroConfig,
AstroIntegration,
AstroRenderer, AstroRenderer,
AstroSettings, AstroSettings,
ContentEntryType, ContentEntryType,
@ -38,16 +39,16 @@ async function withTakingALongTimeMsg<T>({
return result; return result;
} }
// Internally used to store instances of loggers. // Used internally to store instances of loggers.
const Loggers = new Map<string, AstroIntegrationLogger>(); const Loggers = new WeakMap<AstroIntegration, AstroIntegrationLogger>();
function getLogger(adapterName: string, logging: LogOptions) { function getLogger(integration: AstroIntegration, logging: LogOptions) {
if (Loggers.has(adapterName)) { if (Loggers.has(integration)) {
// SAFETY: we check the existence in the if block // SAFETY: we check the existence in the if block
return Loggers.get(adapterName)!; return Loggers.get(integration)!;
} }
const logger = new AstroIntegrationLogger(logging, adapterName); const logger = new AstroIntegrationLogger(logging, integration.name);
Loggers.set(adapterName, logger); Loggers.set(integration, logger);
return logger; return logger;
} }
@ -85,7 +86,7 @@ export async function runHookConfigSetup({
* ``` * ```
*/ */
if (integration.hooks?.['astro:config:setup']) { if (integration.hooks?.['astro:config:setup']) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
const hooks: HookParameters<'astro:config:setup'> = { const hooks: HookParameters<'astro:config:setup'> = {
config: updatedConfig, config: updatedConfig,
@ -122,6 +123,7 @@ export async function runHookConfigSetup({
} }
addedClientDirectives.set(name, buildClientDirectiveEntrypoint(name, entrypoint)); addedClientDirectives.set(name, buildClientDirectiveEntrypoint(name, entrypoint));
}, },
logger,
}; };
// --- // ---
@ -159,7 +161,7 @@ export async function runHookConfigSetup({
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
name: integration.name, name: integration.name,
hookResult: integration.hooks['astro:config:setup'](hooks, { logger }), hookResult: integration.hooks['astro:config:setup'](hooks),
logging, logging,
}); });
@ -182,12 +184,11 @@ export async function runHookConfigDone({
logging: LogOptions; logging: LogOptions;
}) { }) {
for (const integration of settings.config.integrations) { for (const integration of settings.config.integrations) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
if (integration?.hooks?.['astro:config:done']) { if (integration?.hooks?.['astro:config:done']) {
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
name: integration.name, name: integration.name,
hookResult: integration.hooks['astro:config:done']( hookResult: integration.hooks['astro:config:done']({
{
config: settings.config, config: settings.config,
setAdapter(adapter) { setAdapter(adapter) {
if (settings.adapter && settings.adapter.name !== adapter.name) { if (settings.adapter && settings.adapter.name !== adapter.name) {
@ -197,9 +198,8 @@ export async function runHookConfigDone({
} }
settings.adapter = adapter; settings.adapter = adapter;
}, },
}, logger,
{ logger } }),
),
logging, logging,
}); });
} }
@ -217,10 +217,10 @@ export async function runHookServerSetup({
}) { }) {
for (const integration of config.integrations) { for (const integration of config.integrations) {
if (integration?.hooks?.['astro:server:setup']) { if (integration?.hooks?.['astro:server:setup']) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
name: integration.name, name: integration.name,
hookResult: integration.hooks['astro:server:setup']({ server }, { logger }), hookResult: integration.hooks['astro:server:setup']({ server, logger }),
logging, logging,
}); });
} }
@ -237,12 +237,12 @@ export async function runHookServerStart({
logging: LogOptions; logging: LogOptions;
}) { }) {
for (const integration of config.integrations) { for (const integration of config.integrations) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
if (integration?.hooks?.['astro:server:start']) { if (integration?.hooks?.['astro:server:start']) {
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
name: integration.name, name: integration.name,
hookResult: integration.hooks['astro:server:start']({ address }, { logger }), hookResult: integration.hooks['astro:server:start']({ address, logger }),
logging, logging,
}); });
} }
@ -257,7 +257,7 @@ export async function runHookServerDone({
logging: LogOptions; logging: LogOptions;
}) { }) {
for (const integration of config.integrations) { for (const integration of config.integrations) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
if (integration?.hooks?.['astro:server:done']) { if (integration?.hooks?.['astro:server:done']) {
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
@ -278,7 +278,7 @@ export async function runHookBuildStart({
}) { }) {
for (const integration of config.integrations) { for (const integration of config.integrations) {
if (integration?.hooks?.['astro:build:start']) { if (integration?.hooks?.['astro:build:start']) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
name: integration.name, name: integration.name,
@ -306,21 +306,19 @@ export async function runHookBuildSetup({
for (const integration of config.integrations) { for (const integration of config.integrations) {
if (integration?.hooks?.['astro:build:setup']) { if (integration?.hooks?.['astro:build:setup']) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
name: integration.name, name: integration.name,
hookResult: integration.hooks['astro:build:setup']( hookResult: integration.hooks['astro:build:setup']({
{
vite, vite,
pages, pages,
target, target,
updateConfig: (newConfig) => { updateConfig: (newConfig) => {
updatedConfig = mergeConfig(updatedConfig, newConfig); updatedConfig = mergeConfig(updatedConfig, newConfig);
}, },
}, logger,
{ logger } }),
),
logging, logging,
}); });
} }
@ -346,18 +344,16 @@ export async function runHookBuildSsr({
}: RunHookBuildSsr) { }: RunHookBuildSsr) {
for (const integration of config.integrations) { for (const integration of config.integrations) {
if (integration?.hooks?.['astro:build:ssr']) { if (integration?.hooks?.['astro:build:ssr']) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
name: integration.name, name: integration.name,
hookResult: integration.hooks['astro:build:ssr']( hookResult: integration.hooks['astro:build:ssr']({
{
manifest, manifest,
entryPoints, entryPoints,
middlewareEntryPoint, middlewareEntryPoint,
}, logger,
{ logger } }),
),
logging, logging,
}); });
} }
@ -374,12 +370,12 @@ export async function runHookBuildGenerated({
const dir = isServerLikeOutput(config) ? config.build.client : config.outDir; const dir = isServerLikeOutput(config) ? config.build.client : config.outDir;
for (const integration of config.integrations) { for (const integration of config.integrations) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
if (integration?.hooks?.['astro:build:generated']) { if (integration?.hooks?.['astro:build:generated']) {
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
name: integration.name, name: integration.name,
hookResult: integration.hooks['astro:build:generated']({ dir }, { logger }), hookResult: integration.hooks['astro:build:generated']({ dir, logger }),
logging, logging,
}); });
} }
@ -399,18 +395,16 @@ export async function runHookBuildDone({ config, pages, routes, logging }: RunHo
for (const integration of config.integrations) { for (const integration of config.integrations) {
if (integration?.hooks?.['astro:build:done']) { if (integration?.hooks?.['astro:build:done']) {
const logger = getLogger(integration.name, logging); const logger = getLogger(integration, logging);
await withTakingALongTimeMsg({ await withTakingALongTimeMsg({
name: integration.name, name: integration.name,
hookResult: integration.hooks['astro:build:done']( hookResult: integration.hooks['astro:build:done']({
{
pages: pages.map((p) => ({ pathname: p })), pages: pages.map((p) => ({ pathname: p })),
dir, dir,
routes, routes,
}, logger,
{ logger } }),
),
logging, logging,
}); });
} }