0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-01-27 22:19:04 -05:00
astro/packages/integrations/partytown/src/index.ts

65 lines
2 KiB
TypeScript
Raw Normal View History

import { partytownSnippet } from '@builder.io/partytown/integration';
import { copyLibFiles, libDirPath } from '@builder.io/partytown/utils';
2022-06-06 16:49:53 +00:00
import type { AstroConfig, AstroIntegration } from 'astro';
import { createRequire } from 'module';
import path from 'path';
import * as fs from 'fs';
2022-06-06 16:49:53 +00:00
import { fileURLToPath } from 'url';
import sirv from './sirv.js';
const resolve = createRequire(import.meta.url).resolve;
2022-05-16 18:32:54 +00:00
type PartytownOptions =
| {
config?: {
forward?: string[];
debug?: boolean;
};
}
| undefined;
export default function createPlugin(options: PartytownOptions): AstroIntegration {
let config: AstroConfig;
let partytownSnippetHtml: string;
const partytownEntrypoint = resolve('@builder.io/partytown/package.json');
const partytownLibDirectory = path.resolve(partytownEntrypoint, '../lib');
return {
name: '@astrojs/partytown',
hooks: {
'astro:config:setup': ({ config: _config, command, injectScript }) => {
const lib = `${_config.base}~partytown/`;
2022-05-16 18:32:54 +00:00
const forward = options?.config?.forward || [];
const debug = options?.config?.debug || command === 'dev';
partytownSnippetHtml = partytownSnippet({ lib, debug, forward });
injectScript('head-inline', partytownSnippetHtml);
},
'astro:config:done': ({ config: _config }) => {
config = _config;
},
'astro:server:setup': ({ server }) => {
const lib = `${config.base}~partytown/`;
2022-04-02 14:15:41 -06:00
server.middlewares.use(
sirv(partytownLibDirectory, {
mount: lib,
2022-04-02 14:15:41 -06:00
dev: true,
etag: true,
extensions: [],
})
);
},
'astro:build:done': async ({ dir }) => {
await copyLibFiles(fileURLToPath(new URL('~partytown', dir)), {
2022-04-02 14:15:41 -06:00
debugDir: false,
});
},
'astro:build:ssr': async ({ manifest }) => {
const dirpath = libDirPath({ debugDir: false });
const files = await fs.promises.readdir(dirpath);
for(const file of files) {
if(file === 'debug') continue;
manifest.assets.push(`/~partytown/${file}`)
}
}
},
};
}