diff options
30 files changed, 1529 insertions, 299 deletions
diff --git a/examples/fast-build/astro.config.mjs b/examples/fast-build/astro.config.mjs new file mode 100644 index 000000000..32eca8696 --- /dev/null +++ b/examples/fast-build/astro.config.mjs @@ -0,0 +1,11 @@ +import { imagetools } from 'vite-imagetools'; + +// @ts-check +export default /** @type {import('astro').AstroUserConfig} */ ({ + renderers: [ + "@astrojs/renderer-vue" + ], + vite: { + plugins: [imagetools()] + } +}); diff --git a/examples/fast-build/package.json b/examples/fast-build/package.json new file mode 100644 index 000000000..4abd5fc13 --- /dev/null +++ b/examples/fast-build/package.json @@ -0,0 +1,16 @@ +{ + "name": "@example/fast-build", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "astro dev --experimental-static-build", + "start": "astro dev", + "build": "astro build --experimental-static-build", + "preview": "astro preview" + }, + "devDependencies": { + "astro": "^0.21.6", + "unocss": "^0.15.5", + "vite-imagetools": "^4.0.1" + } +} diff --git a/examples/fast-build/src/components/Greeting.vue b/examples/fast-build/src/components/Greeting.vue new file mode 100644 index 000000000..69fa4fbca --- /dev/null +++ b/examples/fast-build/src/components/Greeting.vue @@ -0,0 +1,20 @@ +<script> +export default { + data() { + return { + greeting: 'Hello World!', + }; + }, +}; +</script> + +<template> + <p class="greeting">{{ greeting }}</p> +</template> + +<style> +.greeting { + color: red; + font-weight: bold; +} +</style> diff --git a/examples/fast-build/src/images/penguin.jpg b/examples/fast-build/src/images/penguin.jpg Binary files differnew file mode 100644 index 000000000..6c5dcd37a --- /dev/null +++ b/examples/fast-build/src/images/penguin.jpg diff --git a/examples/fast-build/src/images/random.jpg b/examples/fast-build/src/images/random.jpg Binary files differnew file mode 100644 index 000000000..291883837 --- /dev/null +++ b/examples/fast-build/src/images/random.jpg diff --git a/examples/fast-build/src/pages/index.astro b/examples/fast-build/src/pages/index.astro new file mode 100644 index 000000000..b5b9785da --- /dev/null +++ b/examples/fast-build/src/pages/index.astro @@ -0,0 +1,32 @@ +--- +import imgUrl from '../images/penguin.jpg'; +import grayscaleUrl from '../images/random.jpg?grayscale=true'; +import Greeting from '../components/Greeting.vue'; +--- + +<html> +<head> + <title>Demo app</title> + <style> + h1 { color: salmon; } + </style> +</head> +<body> + <section> + <h1>Images</h1> + + <h2>Imported in JS</h2> + <img src={imgUrl} /> + </section> + + <section> + <h1>Component CSS</h1> + <Greeting /> + </section> + + <section> + <h1>ImageTools</h1> + <img src={grayscaleUrl} /> + </section> +</body> +</html>
\ No newline at end of file diff --git a/examples/fast-build/src/styles/global.css b/examples/fast-build/src/styles/global.css new file mode 100644 index 000000000..9f52e094e --- /dev/null +++ b/examples/fast-build/src/styles/global.css @@ -0,0 +1,3 @@ +body { + background: lightcoral; +} diff --git a/packages/astro/package.json b/packages/astro/package.json index 8435c3c20..9a0db9f66 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -56,7 +56,7 @@ "test": "mocha --parallel --timeout 15000" }, "dependencies": { - "@astrojs/compiler": "^0.5.4", + "@astrojs/compiler": "^0.6.0", "@astrojs/language-server": "^0.8.2", "@astrojs/markdown-remark": "^0.5.0", "@astrojs/prism": "0.3.0", diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index bce09f050..cdb2771d5 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -363,11 +363,13 @@ export interface SSRElement { export interface SSRMetadata { renderers: Renderer[]; pathname: string; + experimentalStaticBuild: boolean; } export interface SSRResult { styles: Set<SSRElement>; scripts: Set<SSRElement>; + links: Set<SSRElement>; createAstro(Astro: AstroGlobalPartial, props: Record<string, any>, slots: Record<string, any> | null): AstroGlobal; _metadata: SSRMetadata; } diff --git a/packages/astro/src/cli/index.ts b/packages/astro/src/cli/index.ts index 621678e50..03c84a711 100644 --- a/packages/astro/src/cli/index.ts +++ b/packages/astro/src/cli/index.ts @@ -25,6 +25,7 @@ interface CLIState { hostname?: string; port?: number; config?: string; + experimentalStaticBuild?: boolean; }; } @@ -37,6 +38,7 @@ function resolveArgs(flags: Arguments): CLIState { port: typeof flags.port === 'number' ? flags.port : undefined, config: typeof flags.config === 'string' ? flags.config : undefined, hostname: typeof flags.hostname === 'string' ? flags.hostname : undefined, + experimentalStaticBuild: typeof flags.experimentalStaticBuild === 'boolean' ? flags.experimentalStaticBuild : false, }; if (flags.version) { @@ -73,6 +75,7 @@ function printHelp() { --config <path> Specify the path to the Astro config file. --project-root <path> Specify the path to the project root folder. --no-sitemap Disable sitemap generation (build only). + --experimental-static-build A more performant build that expects assets to be define statically. --verbose Enable verbose logging --silent Disable logging --version Show the version number and exit. @@ -92,6 +95,7 @@ function mergeCLIFlags(astroConfig: AstroConfig, flags: CLIState['options']) { if (typeof flags.site === 'string') astroConfig.buildOptions.site = flags.site; if (typeof flags.port === 'number') astroConfig.devOptions.port = flags.port; if (typeof flags.hostname === 'string') astroConfig.devOptions.hostname = flags.hostname; + if (typeof flags.experimentalStaticBuild === 'boolean') astroConfig.buildOptions.experimentalStaticBuild = flags.experimentalStaticBuild; } /** The primary CLI action */ diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index be1496b61..3789f9789 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -1,23 +1,18 @@ -import type { AstroConfig, ComponentInstance, GetStaticPathsResult, ManifestData, RouteCache, RouteData, RSSResult } from '../../@types/astro'; +import type { AstroConfig, ManifestData, RouteCache } from '../../@types/astro'; import type { LogOptions } from '../logger'; -import type { AllPagesData } from './types'; -import type { RenderedChunk } from 'rollup'; -import { rollupPluginAstroBuildHTML } from '../../vite-plugin-build-html/index.js'; -import { rollupPluginAstroBuildCSS } from '../../vite-plugin-build-css/index.js'; import fs from 'fs'; import * as colors from 'kleur/colors'; import { polyfill } from '@astropub/webapi'; import { performance } from 'perf_hooks'; import vite, { ViteDevServer } from '../vite.js'; -import { fileURLToPath } from 'url'; import { createVite, ViteConfigWithSSR } from '../create-vite.js'; import { debug, defaultLogOptions, info, levels, timerMessage, warn } from '../logger.js'; -import { preload as ssrPreload } from '../ssr/index.js'; -import { generatePaginateFunction } from '../ssr/paginate.js'; -import { createRouteManifest, validateGetStaticPathsModule, validateGetStaticPathsResult } from '../ssr/routing.js'; -import { generateRssFunction } from '../ssr/rss.js'; +import { createRouteManifest } from '../ssr/routing.js'; import { generateSitemap } from '../ssr/sitemap.js'; +import { collectPagesData } from './page-data.js'; +import { build as scanBasedBuild } from './scan-based-build.js'; +import { staticBuild } from './static-build.js'; export interface BuildOptions { mode?: string; @@ -82,137 +77,45 @@ class AstroBuilder { debug(logging, 'build', timerMessage('Vite started', timer.viteStart)); timer.loadStart = performance.now(); - const assets: Record<string, string> = {}; - const allPages: AllPagesData = {}; - // Collect all routes ahead-of-time, before we start the build. - // NOTE: This enforces that `getStaticPaths()` is only called once per route, - // and is then cached across all future SSR builds. In the past, we've had trouble - // with parallelized builds without guaranteeing that this is called first. - await Promise.all( - this.manifest.routes.map(async (route) => { - // static route: - if (route.pathname) { - allPages[route.component] = { - route, - paths: [route.pathname], - preload: await ssrPreload({ - astroConfig: this.config, - filePath: new URL(`./${route.component}`, this.config.projectRoot), - logging, - mode: 'production', - origin, - pathname: route.pathname, - route, - routeCache: this.routeCache, - viteServer, - }) - .then((routes) => { - const html = `${route.pathname}`.replace(/\/?$/, '/index.html'); - debug(logging, 'build', `├── ${colors.bold(colors.green('✔'))} ${route.component} → ${colors.yellow(html)}`); - return routes; - }) - .catch((err) => { - debug(logging, 'build', `├── ${colors.bold(colors.red('✘'))} ${route.component}`); - throw err; - }), - }; - return; - } - // dynamic route: - const result = await this.getStaticPathsForRoute(route) - .then((routes) => { - const label = routes.paths.length === 1 ? 'page' : 'pages'; - debug(logging, 'build', `├── ${colors.bold(colors.green('✔'))} ${route.component} → ${colors.magenta(`[${routes.paths.length} ${label}]`)}`); - return routes; - }) - .catch((err) => { - debug(logging, 'build', `├── ${colors.bold(colors.red('✗'))} ${route.component}`); - throw err; - }); - if (result.rss?.xml) { - const rssFile = new URL(result.rss.url.replace(/^\/?/, './'), this.config.dist); - if (assets[fileURLToPath(rssFile)]) { - throw new Error(`[getStaticPaths] RSS feed ${result.rss.url} already exists.\nUse \`rss(data, {url: '...'})\` to choose a unique, custom URL. (${route.component})`); - } - assets[fileURLToPath(rssFile)] = result.rss.xml; - } - allPages[route.component] = { - route, - paths: result.paths, - preload: await ssrPreload({ - astroConfig: this.config, - filePath: new URL(`./${route.component}`, this.config.projectRoot), - logging, - mode: 'production', - origin, - pathname: result.paths[0], - route, - routeCache: this.routeCache, - viteServer, - }), - }; - }) - ); + const { assets, allPages } = await collectPagesData({ + astroConfig: this.config, + logging: this.logging, + manifest: this.manifest, + origin, + routeCache: this.routeCache, + viteServer: this.viteServer, + }); debug(logging, 'build', timerMessage('All pages loaded', timer.loadStart)); - // Pure CSS chunks are chunks that only contain CSS. - // This is all of them, and chunkToReferenceIdMap maps them to a hash id used to find the final file. - const pureCSSChunks = new Set<RenderedChunk>(); - const chunkToReferenceIdMap = new Map<string, string>(); - - // This is a mapping of pathname to the string source of all collected - // inline <style> for a page. - const astroStyleMap = new Map<string, string>(); - // This is a virtual JS module that imports all dependent styles for a page. - const astroPageStyleMap = new Map<string, string>(); - + // The names of each pages const pageNames: string[] = []; // Bundle the assets in your final build: This currently takes the HTML output // of every page (stored in memory) and bundles the assets pointed to on those pages. timer.buildStart = performance.now(); - await vite.build({ - logLevel: 'error', - mode: 'production', - build: { - emptyOutDir: true, - minify: 'esbuild', // significantly faster than "terser" but may produce slightly-bigger bundles - outDir: fileURLToPath(this.config.dist), - rollupOptions: { - // The `input` will be populated in the build rollup plugin. - input: [], - output: { format: 'esm' }, - }, - target: 'es2020', // must match an esbuild target - }, - plugins: [ - rollupPluginAstroBuildHTML({ - astroConfig: this.config, - astroPageStyleMap, - astroStyleMap, - chunkToReferenceIdMap, - pureCSSChunks, - logging, - origin, - allPages, - pageNames, - routeCache: this.routeCache, - viteServer, - }), - rollupPluginAstroBuildCSS({ - astroPageStyleMap, - astroStyleMap, - chunkToReferenceIdMap, - pureCSSChunks, - }), - ...(viteConfig.plugins || []), - ], - publicDir: viteConfig.publicDir, - root: viteConfig.root, - envPrefix: 'PUBLIC_', - server: viteConfig.server, - base: this.config.buildOptions.site ? new URL(this.config.buildOptions.site).pathname : '/', - }); + + // Use the new faster static based build. + if (this.config.buildOptions.experimentalStaticBuild) { + await staticBuild({ + allPages, + astroConfig: this.config, + logging: this.logging, + origin: this.origin, + routeCache: this.routeCache, + viteConfig: this.viteConfig, + }); + } else { + await scanBasedBuild({ + allPages, + astroConfig: this.config, + logging: this.logging, + origin: this.origin, + pageNames, + routeCache: this.routeCache, + viteConfig: this.viteConfig, + viteServer: this.viteServer, + }); + } debug(logging, 'build', timerMessage('Vite build finished', timer.buildStart)); // Write any additionally generated assets to disk. @@ -243,22 +146,6 @@ class AstroBuilder { } } - /** Extract all static paths from a dynamic route */ - private async getStaticPathsForRoute(route: RouteData): Promise<{ paths: string[]; rss?: RSSResult }> { - if (!this.viteServer) throw new Error(`vite.createServer() not called!`); - const filePath = new URL(`./${route.component}`, this.config.projectRoot); - const mod = (await this.viteServer.ssrLoadModule(fileURLToPath(filePath))) as ComponentInstance; - validateGetStaticPathsModule(mod); - const rss = generateRssFunction(this.config.buildOptions.site, route); - const staticPaths: GetStaticPathsResult = (await mod.getStaticPaths!({ paginate: generatePaginateFunction(route), rss: rss.generator })).flat(); - this.routeCache[route.component] = staticPaths; - validateGetStaticPathsResult(staticPaths, this.logging); - return { - paths: staticPaths.map((staticPath) => staticPath.params && route.generate(staticPath.params)).filter(Boolean), - rss: rss.rss, - }; - } - /** Stats */ private async printStats({ logging, timeStart, pageCount }: { logging: LogOptions; timeStart: number; pageCount: number }) { /* eslint-disable no-console */ diff --git a/packages/astro/src/core/build/internal.ts b/packages/astro/src/core/build/internal.ts new file mode 100644 index 000000000..1028f3e4e --- /dev/null +++ b/packages/astro/src/core/build/internal.ts @@ -0,0 +1,45 @@ +import type { RenderedChunk } from 'rollup'; + +export interface BuildInternals { + // Pure CSS chunks are chunks that only contain CSS. + pureCSSChunks: Set<RenderedChunk>; + // chunkToReferenceIdMap maps them to a hash id used to find the final file. + chunkToReferenceIdMap: Map<string, string>; + + // This is a mapping of pathname to the string source of all collected + // inline <style> for a page. + astroStyleMap: Map<string, string>; + // This is a virtual JS module that imports all dependent styles for a page. + astroPageStyleMap: Map<string, string>; + + // A mapping to entrypoints (facadeId) to assets (styles) that are added. + facadeIdToAssetsMap: Map<string, string[]>; +} + +/** + * Creates internal maps used to coordinate the CSS and HTML plugins. + * @returns {BuildInternals} + */ +export function createBuildInternals(): BuildInternals { + // Pure CSS chunks are chunks that only contain CSS. + // This is all of them, and chunkToReferenceIdMap maps them to a hash id used to find the final file. + const pureCSSChunks = new Set<RenderedChunk>(); + const chunkToReferenceIdMap = new Map<string, string>(); + + // This is a mapping of pathname to the string source of all collected + // inline <style> for a page. + const astroStyleMap = new Map<string, string>(); + // This is a virtual JS module that imports all dependent styles for a page. + const astroPageStyleMap = new Map<string, string>(); + + // A mapping to entrypoints (facadeId) to assets (styles) that are added. + const facadeIdToAssetsMap = new Map<string, string[]>(); + + return { + pureCSSChunks, + chunkToReferenceIdMap, + astroStyleMap, + astroPageStyleMap, + facadeIdToAssetsMap, + }; +} diff --git a/packages/astro/src/core/build/page-data.ts b/packages/astro/src/core/build/page-data.ts new file mode 100644 index 000000000..aa6247537 --- /dev/null +++ b/packages/astro/src/core/build/page-data.ts @@ -0,0 +1,122 @@ +import type { AstroConfig, ComponentInstance, GetStaticPathsResult, ManifestData, RouteCache, RouteData, RSSResult } from '../../@types/astro'; +import type { AllPagesData } from './types'; +import type { LogOptions } from '../logger'; +import type { ViteDevServer } from '../vite.js'; + +import { fileURLToPath } from 'url'; +import * as colors from 'kleur/colors'; +import { debug } from '../logger.js'; +import { preload as ssrPreload } from '../ssr/index.js'; +import { validateGetStaticPathsModule, validateGetStaticPathsResult } from '../ssr/routing.js'; +import { generatePaginateFunction } from '../ssr/paginate.js'; +import { generateRssFunction } from '../ssr/rss.js'; + +export interface CollectPagesDataOptions { + astroConfig: AstroConfig; + logging: LogOptions; + manifest: ManifestData; + origin: string; + routeCache: RouteCache; + viteServer: ViteDevServer; +} + +export interface CollectPagesDataResult { + assets: Record<string, string>; + allPages: AllPagesData; +} + +// Examines the routes and returns a collection of information about each page. +export async function collectPagesData(opts: CollectPagesDataOptions): Promise<CollectPagesDataResult> { + const { astroConfig, logging, manifest, origin, routeCache, viteServer } = opts; + + const assets: Record<string, string> = {}; + const allPages: AllPagesData = {}; + + // Collect all routes ahead-of-time, before we start the build. + // NOTE: This enforces that `getStaticPaths()` is only called once per route, + // and is then cached across all future SSR builds. In the past, we've had trouble + // with parallelized builds without guaranteeing that this is called first. + await Promise.all( + manifest.routes.map(async (route) => { + // static route: + if (route.pathname) { + allPages[route.component] = { + route, + paths: [route.pathname], + preload: await ssrPreload({ + astroConfig, + filePath: new URL(`./${route.component}`, astroConfig.projectRoot), + logging, + mode: 'production', + origin, + pathname: route.pathname, + route, + routeCache, + viteServer, + }) + .then((routes) => { + const html = `${route.pathname}`.replace(/\/?$/, '/index.html'); + debug(logging, 'build', `├── ${colors.bold(colors.green('✔'))} ${route.component} → ${colors.yellow(html)}`); + return routes; + }) + .catch((err) => { + debug(logging, 'build', `├── ${colors.bold(colors.red('✘'))} ${route.component}`); + throw err; + }), + }; + return; + } + // dynamic route: + const result = await getStaticPathsForRoute(opts, route) + .then((routes) => { + const label = routes.paths.length === 1 ? 'page' : 'pages'; + debug(logging, 'build', `├── ${colors.bold(colors.green('✔'))} ${route.component} → ${colors.magenta(`[${routes.paths.length} ${label}]`)}`); + return routes; + }) + .catch((err) => { + debug(logging, 'build', `├── ${colors.bold(colors.red('✗'))} ${route.component}`); + throw err; + }); + if (result.rss?.xml) { + const rssFile = new URL(result.rss.url.replace(/^\/?/, './'), astroConfig.dist); + if (assets[fileURLToPath(rssFile)]) { + throw new Error(`[getStaticPaths] RSS feed ${result.rss.url} already exists.\nUse \`rss(data, {url: '...'})\` to choose a unique, custom URL. (${route.component})`); + } + assets[fileURLToPath(rssFile)] = result.rss.xml; + } + allPages[route.component] = { + route, + paths: result.paths, + preload: await ssrPreload({ + astroConfig, + filePath: new URL(`./${route.component}`, astroConfig.projectRoot), + logging, + mode: 'production', + origin, + pathname: result.paths[0], + route, + routeCache, + viteServer, + }), + }; + }) + ); + + return { assets, allPages }; +} + +async function getStaticPathsForRoute(opts: CollectPagesDataOptions, route: RouteData): Promise<{ paths: string[]; rss?: RSSResult }> { + const { astroConfig, logging, routeCache, viteServer } = opts; + if (!viteServer) throw new Error(`vite.createServer() not called!`); + const filePath = new URL(`./${route.component}`, astroConfig.projectRoot); + const mod = (await viteServer.ssrLoadModule(fileURLToPath(filePath))) as ComponentInstance; + validateGetStaticPathsModule(mod); + const rss = generateRssFunction(astroConfig.buildOptions.site, route); + const staticPaths: GetStaticPathsResult = (await mod.getStaticPaths!({ paginate: generatePaginateFunction(route), rss: rss.generator })).flat(); + routeCache[route.component] = staticPaths; + validateGetStaticPathsResult(staticPaths, logging); + return { + paths: staticPaths.map((staticPath) => staticPath.params && route.generate(staticPath.params)).filter(Boolean), + rss: rss.rss, + }; +} diff --git a/packages/astro/src/core/build/scan-based-build.ts b/packages/astro/src/core/build/scan-based-build.ts new file mode 100644 index 000000000..7bb787758 --- /dev/null +++ b/packages/astro/src/core/build/scan-based-build.ts @@ -0,0 +1,68 @@ +import type { ViteDevServer } from '../vite.js'; +import type { AstroConfig, RouteCache } from '../../@types/astro'; +import type { AllPagesData } from './types'; +import type { LogOptions } from '../logger'; +import type { ViteConfigWithSSR } from '../create-vite.js'; + +import { fileURLToPath } from 'url'; +import vite from '../vite.js'; +import { createBuildInternals } from '../../core/build/internal.js'; +import { rollupPluginAstroBuildHTML } from '../../vite-plugin-build-html/index.js'; +import { rollupPluginAstroBuildCSS } from '../../vite-plugin-build-css/index.js'; + +export interface ScanBasedBuildOptions { + allPages: AllPagesData; + astroConfig: AstroConfig; + logging: LogOptions; + origin: string; + pageNames: string[]; + routeCache: RouteCache; + viteConfig: ViteConfigWithSSR; + viteServer: ViteDevServer; +} + +export async function build(opts: ScanBasedBuildOptions) { + const { allPages, astroConfig, logging, origin, pageNames, routeCache, viteConfig, viteServer } = opts; + + // Internal maps used to coordinate the HTML and CSS plugins. + const internals = createBuildInternals(); + + return await vite.build({ + logLevel: 'error', + mode: 'production', + build: { + emptyOutDir: true, + minify: 'esbuild', // significantly faster than "terser" but may produce slightly-bigger bundles + outDir: fileURLToPath(astroConfig.dist), + rollupOptions: { + // The `input` will be populated in the build rollup plugin. + input: [], + output: { + format: 'esm', + }, + }, + target: 'es2020', // must match an esbuild target + }, + plugins: [ + rollupPluginAstroBuildHTML({ + astroConfig, + internals, + logging, + origin, + allPages, + pageNames, + routeCache, + viteServer, + }), + rollupPluginAstroBuildCSS({ + internals, + }), + ...(viteConfig.plugins || []), + ], + publicDir: viteConfig.publicDir, + root: viteConfig.root, + envPrefix: 'PUBLIC_', + server: viteConfig.server, + base: astroConfig.buildOptions.site ? new URL(astroConfig.buildOptions.site).pathname : '/', + }); +} diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts new file mode 100644 index 000000000..a6ed89e3c --- /dev/null +++ b/packages/astro/src/core/build/static-build.ts @@ -0,0 +1,195 @@ +import type { OutputChunk, PreRenderedChunk, RollupOutput } from 'rollup'; +import type { Plugin as VitePlugin } from '../vite'; +import type { AstroConfig, RouteCache } from '../../@types/astro'; +import type { AllPagesData } from './types'; +import type { LogOptions } from '../logger'; +import type { ViteConfigWithSSR } from '../create-vite'; +import type { PageBuildData } from './types'; +import type { BuildInternals } from '../../core/build/internal.js'; +import type { AstroComponentFactory } from '../../runtime/server'; + +import fs from 'fs'; +import { fileURLToPath } from 'url'; +import vite from '../vite.js'; +import { debug, info, error } from '../../core/logger.js'; +import { createBuildInternals } from '../../core/build/internal.js'; +import { rollupPluginAstroBuildCSS } from '../../vite-plugin-build-css/index.js'; +import { renderComponent, getParamsAndProps } from '../ssr/index.js'; + +export interface StaticBuildOptions { + allPages: AllPagesData; + astroConfig: AstroConfig; + logging: LogOptions; + origin: string; + routeCache: RouteCache; + viteConfig: ViteConfigWithSSR; +} + +export async function staticBuild(opts: StaticBuildOptions) { + const { allPages, astroConfig } = opts; + + // The JavaScript entrypoints. + const jsInput: Set<string> = new Set(); + + // A map of each page .astro file, to the PageBuildData which contains information + // about that page, such as its paths. + const facadeIdToPageDataMap = new Map<string, PageBuildData>(); + + for (const [component, pageData] of Object.entries(allPages)) { + const [renderers, mod] = pageData.preload; + + // Hydrated components are statically identified. + for (const path of mod.$$metadata.getAllHydratedComponentPaths()) { + // Note that this part is not yet implemented in the static build. + //jsInput.add(path); + } + + let astroModuleId = new URL('./' + component, astroConfig.projectRoot).pathname; + jsInput.add(astroModuleId); + facadeIdToPageDataMap.set(astroModuleId, pageData); + } + + // Build internals needed by the CSS plugin + const internals = createBuildInternals(); + + // Perform the SSR build + const result = (await ssrBuild(opts, internals, jsInput)) as RollupOutput; + + // Generate each of the pages. + await generatePages(result, opts, internals, facadeIdToPageDataMap); +} + +async function ssrBuild(opts: StaticBuildOptions, internals: BuildInternals, input: Set<string>) { + const { astroConfig, viteConfig } = opts; + + return await vite.build({ + logLevel: 'error', + mode: 'production', + build: { + emptyOutDir: true, + minify: false, // 'esbuild', // significantly faster than "terser" but may produce slightly-bigger bundles + outDir: fileURLToPath(astroConfig.dist), + ssr: true, + rollupOptions: { + input: Array.from(input), + output: { + format: 'esm', + }, + }, + target: 'es2020', // must match an esbuild target + }, + plugins: [ + vitePluginNewBuild(), + rollupPluginAstroBuildCSS({ + internals, + }), + ...(viteConfig.plugins || []), + ], + publicDir: viteConfig.publicDir, + root: viteConfig.root, + envPrefix: 'PUBLIC_', + server: viteConfig.server, + base: astroConfig.buildOptions.site ? new URL(astroConfig.buildOptions.site).pathname : '/', + }); +} + +async function generatePages(result: RollupOutput, opts: StaticBuildOptions, internals: BuildInternals, facadeIdToPageDataMap: Map<string, PageBuildData>) { + debug(opts.logging, 'generate', 'End build step, now generating'); + const generationPromises = []; + for (let output of result.output) { + if (output.type === 'chunk' && output.facadeModuleId && output.facadeModuleId.endsWith('.astro')) { + generationPromises.push(generatePage(output, opts, internals, facadeIdToPageDataMap)); + } + } + await Promise.all(generationPromises); +} + +async function generatePage(output: OutputChunk, opts: StaticBuildOptions, internals: BuildInternals, facadeIdToPageDataMap: Map<string, PageBuildData>) { + const { astroConfig } = opts; + + let url = new URL('./' + output.fileName, astroConfig.dist); + const facadeId: string = output.facadeModuleId as string; + let pageData = + facadeIdToPageDataMap.get(facadeId) || + // Check with a leading `/` because on Windows it doesn't have one. + facadeIdToPageDataMap.get('/' + facadeId); + + if (!pageData) { + throw new Error(`Unable to find a PageBuildData for the Astro page: ${facadeId}. There are the PageBuilDatas we have ${Array.from(facadeIdToPageDataMap.keys()).join(', ')}`); + } + + let linkIds = internals.facadeIdToAssetsMap.get(facadeId) || []; + let compiledModule = await import(url.toString()); + let Component = compiledModule.default; + + const generationOptions: Readonly<GeneratePathOptions> = { + pageData, + linkIds, + Component, + }; + + const renderPromises = pageData.paths.map((path) => { + return generatePath(path, opts, generationOptions); + }); + return await Promise.all(renderPromises); +} + +interface GeneratePathOptions { + pageData: PageBuildData; + linkIds: string[]; + Component: AstroComponentFactory; +} + +async function generatePath(path: string, opts: StaticBuildOptions, gopts: GeneratePathOptions) { + const { astroConfig, logging, origin, routeCache } = opts; + const { Component, linkIds, pageData } = gopts; + + const [renderers, mod] = pageData.preload; + + try { + const [params, pageProps] = await getParamsAndProps({ + route: pageData.route, + routeCache, + logging, + pathname: path, + mod, + }); + + info(logging, 'generate', `Generating: ${path}`); + + const html = await renderComponent(renderers, Component, astroConfig, path, origin, params, pageProps, linkIds); + const outFolder = new URL('.' + path + '/', astroConfig.dist); + const outFile = new URL('./index.html', outFolder); + await fs.promises.mkdir(outFolder, { recursive: true }); + await fs.promises.writeFile(outFile, html, 'utf-8'); + } catch (err) { + error(opts.logging, 'build', `Error rendering:`, err); + } +} + +export function vitePluginNewBuild(): VitePlugin { + return { + name: '@astro/rollup-plugin-new-build', + + configResolved(resolvedConfig) { + // Delete this hook because it causes assets not to be built + const plugins = resolvedConfig.plugins as VitePlugin[]; + const viteAsset = plugins.find((p) => p.name === 'vite:asset'); + if (viteAsset) { + delete viteAsset.generateBundle; + } + }, + + outputOptions(outputOptions) { + Object.assign(outputOptions, { + entryFileNames(_chunk: PreRenderedChunk) { + return 'assets/[name].[hash].mjs'; + }, + chunkFileNames(_chunk: PreRenderedChunk) { + return 'assets/[name].[hash].mjs'; + }, + }); + return outputOptions; + }, + }; +} diff --git a/packages/astro/src/core/config.ts b/packages/astro/src/core/config.ts index f2e999f80..38a4e8ea2 100644 --- a/packages/astro/src/core/config.ts +++ b/packages/astro/src/core/config.ts @@ -58,6 +58,7 @@ export const AstroConfigSchema = z.object({ .union([z.literal('file'), z.literal('directory')]) .optional() .default('directory'), + experimentalStaticBuild: z.boolean().optional().default(false), }) .optional() .default({}), diff --git a/packages/astro/src/core/ssr/index.ts b/packages/astro/src/core/ssr/index.ts index 4b979a182..18d2e8c67 100644 --- a/packages/astro/src/core/ssr/index.ts +++ b/packages/astro/src/core/ssr/index.ts @@ -17,6 +17,7 @@ import type { SSRResult, } from '../../@types/astro'; import type { LogOptions } from '../logger'; +import type { AstroComponentFactory } from '../../runtime/server/index'; import eol from 'eol'; import fs from 'fs'; @@ -138,6 +139,120 @@ export async function preload({ astroConfig, filePath, viteServer }: SSROptions) return [renderers, mod]; } +export async function renderComponent( + renderers: Renderer[], + Component: AstroComponentFactory, + astroConfig: AstroConfig, + pathname: string, + origin: string, + params: Params, + pageProps: Props, + links: string[] = [] +): Promise<string> { + const _links = new Set<SSRElement>( + links.map((href) => ({ + props: { + rel: 'stylesheet', + href, + }, + children: '', + })) + ); + const result: SSRResult = { + styles: new Set<SSRElement>(), + scripts: new Set<SSRElement>(), + links: _links, + /** This function returns the `Astro` faux-global */ + createAstro(astroGlobal: AstroGlobalPartial, props: Record<string, any>, slots: Record<string, any> | null) { + const site = new URL(origin); + const url = new URL('.' + pathname, site); + const canonicalURL = getCanonicalURL('.' + pathname, astroConfig.buildOptions.site || origin); + return { + __proto__: astroGlobal, + props, + request: { + canonicalURL, + params, + url, + }, + slots: Object.fromEntries(Object.entries(slots || {}).map(([slotName]) => [slotName, true])), + // This is used for <Markdown> but shouldn't be used publicly + privateRenderSlotDoNotUse(slotName: string) { + return renderSlot(result, slots ? slots[slotName] : null); + }, + // <Markdown> also needs the same `astroConfig.markdownOptions.render` as `.md` pages + async privateRenderMarkdownDoNotUse(content: string, opts: any) { + let mdRender = astroConfig.markdownOptions.render; + let renderOpts = {}; + if (Array.isArray(mdRender)) { + renderOpts = mdRender[1]; + mdRender = mdRender[0]; + } + if (typeof mdRender === 'string') { + ({ default: mdRender } = await import(mdRender)); + } + const { code } = await mdRender(content, { ...renderOpts, ...(opts ?? {}) }); + return code; + }, + } as unknown as AstroGlobal; + }, + _metadata: { + renderers, + pathname, + experimentalStaticBuild: astroConfig.buildOptions.experimentalStaticBuild, + }, + }; + + let html = await renderPage(result, Component, pageProps, null); + + return html; +} + +export async function getParamsAndProps({ + route, + routeCache, + logging, + pathname, + mod, +}: { + route: RouteData | undefined; + routeCache: RouteCache; + pathname: string; + mod: ComponentInstance; + logging: LogOptions; +}): Promise<[Params, Props]> { + // Handle dynamic routes + let params: Params = {}; + let pageProps: Props = {}; + if (route && !route.pathname) { + if (route.params.length) { + const paramsMatch = route.pattern.exec(pathname); + if (paramsMatch) { + params = getParams(route.params)(paramsMatch); + } + } + validateGetStaticPathsModule(mod); + if (!routeCache[route.component]) { + routeCache[route.component] = await ( + await mod.getStaticPaths!({ + paginate: generatePaginateFunction(route), + rss: () => { + /* noop */ + }, + }) + ).flat(); + } + validateGetStaticPathsResult(routeCache[route.component], logging); + const routePathParams: GetStaticPathsResult = routeCache[route.component]; + const matchedStaticPath = routePathParams.find(({ params: _params }) => JSON.stringify(_params) === JSON.stringify(params)); + if (!matchedStaticPath) { + throw new Error(`[getStaticPaths] route pattern matched, but no matching static path found. (${pathname})`); + } + pageProps = { ...matchedStaticPath.props } || {}; + } + return [params, pageProps]; +} + /** use Vite to SSR */ export async function render(renderers: Renderer[], mod: ComponentInstance, ssrOpts: SSROptions): Promise<string> { const { astroConfig, filePath, logging, mode, origin, pathname, route, routeCache, viteServer } = ssrOpts; @@ -183,6 +298,7 @@ export async function render(renderers: Renderer[], mod: ComponentInstance, ssrO const result: SSRResult = { styles: new Set<SSRElement>(), scripts: new Set<SSRElement>(), + links: new Set<SSRElement>(), /** This function returns the `Astro` faux-global */ createAstro(astroGlobal: AstroGlobalPartial, props: Record<string, any>, slots: Record<string, any> | null) { const site = new URL(origin); @@ -225,6 +341,7 @@ export async function render(renderers: Renderer[], mod: ComponentInstance, ssrO _metadata: { renderers, pathname, + experimentalStaticBuild: astroConfig.buildOptions.experimentalStaticBuild, }, }; diff --git a/packages/astro/src/runtime/server/index.ts b/packages/astro/src/runtime/server/index.ts index 9e0d75f48..601dec4bc 100644 --- a/packages/astro/src/runtime/server/index.ts +++ b/packages/astro/src/runtime/server/index.ts @@ -372,14 +372,16 @@ const uniqueElements = (item: any, index: number, all: any[]) => { // styles and scripts into the head. export async function renderPage(result: SSRResult, Component: AstroComponentFactory, props: any, children: any) { const template = await renderToString(result, Component, props, children); - const styles = Array.from(result.styles) - .filter(uniqueElements) - .map((style) => - renderElement('style', { - ...style, - props: { ...style.props, 'astro-style': true }, - }) - ); + const styles = result._metadata.experimentalStaticBuild + ? [] + : Array.from(result.styles) + .filter(uniqueElements) + .map((style) => + renderElement('style', { + ...style, + props: { ...style.props, 'astro-style': true }, + }) + ); let needsHydrationStyles = false; const scripts = Array.from(result.scripts) .filter(uniqueElements) @@ -396,12 +398,16 @@ export async function renderPage(result: SSRResult, Component: AstroComponentFac styles.push(renderElement('style', { props: { 'astro-style': true }, children: 'astro-root, astro-fragment { display: contents; }' })); } + const links = Array.from(result.links) + .filter(uniqueElements) + .map((link) => renderElement('link', link)); + // inject styles & scripts at end of <head> let headPos = template.indexOf('</head>'); if (headPos === -1) { - return styles.join('\n') + scripts.join('\n') + template; // if no </head>, prepend styles & scripts + return links.join('\n') + styles.join('\n') + scripts.join('\n') + template; // if no </head>, prepend styles & scripts } - return template.substring(0, headPos) + styles.join('\n') + scripts.join('\n') + template.substring(headPos); + return template.substring(0, headPos) + links.join('\n') + styles.join('\n') + scripts.join('\n') + template.substring(headPos); } export async function renderAstroComponent(component: InstanceType<typeof AstroComponent>) { diff --git a/packages/astro/src/vite-plugin-astro/compile.ts b/packages/astro/src/vite-plugin-astro/compile.ts new file mode 100644 index 000000000..71a08a94a --- /dev/null +++ b/packages/astro/src/vite-plugin-astro/compile.ts @@ -0,0 +1,110 @@ +import type { AstroConfig } from '../@types/astro'; +import type { TransformResult } from '@astrojs/compiler'; +import type { SourceMapInput } from 'rollup'; +import type { TransformHook } from './styles'; + +import fs from 'fs'; +import { fileURLToPath } from 'url'; +import { transform } from '@astrojs/compiler'; +import { transformWithVite } from './styles.js'; + +type CompilationCache = Map<string, TransformResult>; + +const configCache = new WeakMap<AstroConfig, CompilationCache>(); + +// https://github.com/vitejs/vite/discussions/5109#discussioncomment-1450726 +function isSSR(options: undefined | boolean | { ssr: boolean }): boolean { + if (options === undefined) { + return false; + } + if (typeof options === 'boolean') { + return options; + } + if (typeof options == 'object') { + return !!options.ssr; + } + return false; +} + +async function compile(config: AstroConfig, filename: string, source: string, viteTransform: TransformHook, opts: boolean | undefined) { + // pages and layouts should be transformed as full documents (implicit <head> <body> etc) + // everything else is treated as a fragment + const normalizedID = fileURLToPath(new URL(`file://${filename}`)); + const isPage = normalizedID.startsWith(fileURLToPath(config.pages)) || normalizedID.startsWith(fileURLToPath(config.layouts)); + + let cssTransformError: Error | undefined; + + // Transform from `.astro` to valid `.ts` + // use `sourcemap: "both"` so that sourcemap is included in the code + // result passed to esbuild, but also available in the catch handler. + const transformResult = await transform(source, { + as: isPage ? 'document' : 'fragment', + projectRoot: config.projectRoot.toString(), + site: config.buildOptions.site, + sourcefile: filename, + sourcemap: 'both', + internalURL: 'astro/internal', + experimentalStaticExtraction: config.buildOptions.experimentalStaticBuild, + // TODO add experimental flag here + preprocessStyle: async (value: string, attrs: Record<string, string>) => { + const lang = `.${attrs?.lang || 'css'}`.toLowerCase(); + try { + const result = await transformWithVite({ + value, + lang, + id: filename, + transformHook: viteTransform, + ssr: isSSR(opts), + }); + + let map: SourceMapInput | undefined; + if (!result) return null as any; // TODO: add type in compiler to fix "any" + if (result.map) { + if (typeof result.map === 'string') { + map = result.map; + } else if (result.map.mappings) { + map = result.map.toString(); + } + } + return { code: result.code, map }; + } catch (err) { + // save error to throw in plugin context + cssTransformError = err as any; + return null; + } + }, + }); + + // throw CSS transform errors here if encountered + if (cssTransformError) throw cssTransformError; + + return transformResult; +} + +export function invalidateCompilation(config: AstroConfig, filename: string) { + if (configCache.has(config)) { + const cache = configCache.get(config)!; + cache.delete(filename); + } +} + +export async function cachedCompilation(config: AstroConfig, filename: string, source: string | null, viteTransform: TransformHook, opts: boolean | undefined) { + let cache: CompilationCache; + if (!configCache.has(config)) { + cache = new Map(); + configCache.set(config, cache); + } else { + cache = configCache.get(config)!; + } + if (cache.has(filename)) { + return cache.get(filename)!; + } + + if (source === null) { + const fileUrl = new URL(`file://${filename}`); + source = await fs.promises.readFile(fileUrl, 'utf-8'); + } + const transformResult = await compile(config, filename, source, viteTransform, opts); + cache.set(filename, transformResult); + return transformResult; +} diff --git a/packages/astro/src/vite-plugin-astro/index.ts b/packages/astro/src/vite-plugin-astro/index.ts index e77389ff6..918d597a5 100644 --- a/packages/astro/src/vite-plugin-astro/index.ts +++ b/packages/astro/src/vite-plugin-astro/index.ts @@ -1,14 +1,12 @@ -import type { TransformResult } from '@astrojs/compiler'; -import type { SourceMapInput } from 'rollup'; import type vite from '../core/vite'; import type { AstroConfig } from '../@types/astro'; import esbuild from 'esbuild'; -import fs from 'fs'; import { fileURLToPath } from 'url'; -import { transform } from '@astrojs/compiler'; import { AstroDevServer } from '../core/dev/index.js'; -import { getViteTransform, TransformHook, transformWithVite } from './styles.js'; +import { getViteTransform, TransformHook } from './styles.js'; +import { parseAstroRequest } from './query.js'; +import { cachedCompilation, invalidateCompilation } from './compile.js'; const FRONTMATTER_PARSE_REGEXP = /^\-\-\-(.*)^\-\-\-/ms; interface AstroPluginOptions { @@ -16,22 +14,8 @@ interface AstroPluginOptions { devServer?: AstroDevServer; } -// https://github.com/vitejs/vite/discussions/5109#discussioncomment-1450726 -function isSSR(options: undefined | boolean | { ssr: boolean }): boolean { - if (options === undefined) { - return false; - } - if (typeof options === 'boolean') { - return options; - } - if (typeof options == 'object') { - return !!options.ssr; - } - return false; -} - /** Transform .astro files for Vite */ -export default function astro({ config, devServer }: AstroPluginOptions): vite.Plugin { +export default function astro({ config }: AstroPluginOptions): vite.Plugin { let viteTransform: TransformHook; return { name: '@astrojs/vite-plugin-astro', @@ -40,57 +24,51 @@ export default function astro({ config, devServer }: AstroPluginOptions): vite.P viteTransform = getViteTransform(resolvedConfig); }, // note: don’t claim .astro files with resolveId() — it prevents Vite from transpiling the final JS (import.meta.globEager, etc.) + async resolveId(id) { + // serve sub-part requests (*?astro) as virtual modules + if (parseAstroRequest(id).query.astro) { + return id; + } + }, async load(id, opts) { + let { filename, query } = parseAstroRequest(id); + if (query.astro) { + if (query.type === 'style') { + if (filename.startsWith('/') && !filename.startsWith(config.projectRoot.pathname)) { + filename = new URL('.' + filename, config.projectRoot).pathname; + } + const transformResult = await cachedCompilation(config, filename, null, viteTransform, opts); + + if (typeof query.index === 'undefined') { + throw new Error(`Requests for Astro CSS must include an index.`); + } + + const csses = transformResult.css; + const code = csses[query.index]; + + return { + code, + }; + } + } + + return null; + }, + async transform(source, id, opts) { if (!id.endsWith('.astro')) { - return null; + return; } - // pages and layouts should be transformed as full documents (implicit <head> <body> etc) - // everything else is treated as a fragment - const normalizedID = fileURLToPath(new URL(`file://${id}`)); - const isPage = normalizedID.startsWith(fileURLToPath(config.pages)) || normalizedID.startsWith(fileURLToPath(config.layouts)); - let source = await fs.promises.readFile(id, 'utf8'); - let tsResult: TransformResult | undefined; - let cssTransformError: Error | undefined; try { - // Transform from `.astro` to valid `.ts` - // use `sourcemap: "both"` so that sourcemap is included in the code - // result passed to esbuild, but also available in the catch handler. - tsResult = await transform(source, { - as: isPage ? 'document' : 'fragment', - projectRoot: config.projectRoot.toString(), - site: config.buildOptions.site, - sourcefile: id, - sourcemap: 'both', - internalURL: 'astro/internal', - preprocessStyle: async (value: string, attrs: Record<string, string>) => { - const lang = `.${attrs?.lang || 'css'}`.toLowerCase(); - try { - const result = await transformWithVite({ value, lang, id, transformHook: viteTransform, ssr: isSSR(opts) }); - let map: SourceMapInput | undefined; - if (!result) return null as any; // TODO: add type in compiler to fix "any" - if (result.map) { - if (typeof result.map === 'string') { - map = result.map; - } else if (result.map.mappings) { - map = result.map.toString(); - } - } - return { code: result.code, map }; - } catch (err) { - // save error to throw in plugin context - cssTransformError = err as any; - return null; - } - }, - }); - - // throw CSS transform errors here if encountered - if (cssTransformError) throw cssTransformError; + const transformResult = await cachedCompilation(config, id, source, viteTransform, opts); // Compile all TypeScript to JavaScript. // Also, catches invalid JS/TS in the compiled output before returning. - const { code, map } = await esbuild.transform(tsResult.code, { loader: 'ts', sourcemap: 'external', sourcefile: id }); + const { code, map } = await esbuild.transform(transformResult.code, { + loader: 'ts', + sourcemap: 'external', + sourcefile: id, + }); return { code, @@ -125,21 +103,21 @@ export default function astro({ config, devServer }: AstroPluginOptions): vite.P labels: 'compiler', title: '🐛 BUG: `@astrojs/compiler` panic', body: `### Describe the Bug - -\`@astrojs/compiler\` encountered an unrecoverable error when compiling the following file. - -**${id.replace(fileURLToPath(config.projectRoot), '')}** -\`\`\`astro -${source} -\`\`\` -`, + + \`@astrojs/compiler\` encountered an unrecoverable error when compiling the following file. + + **${id.replace(fileURLToPath(config.projectRoot), '')}** + \`\`\`astro + ${source} + \`\`\` + `, }); err.url = `https://github.com/withastro/astro/issues/new?${search.toString()}`; err.message = `Error: Uh oh, the Astro compiler encountered an unrecoverable error! - -Please open -a GitHub issue using the link below: -${err.url}`; + + Please open + a GitHub issue using the link below: + ${err.url}`; // TODO: remove stack replacement when compiler throws better errors err.stack = ` at ${id}`; } @@ -147,10 +125,9 @@ ${err.url}`; throw err; } }, - // async handleHotUpdate(context) { - // if (devServer) { - // return devServer.handleHotUpdate(context); - // } - // }, + async handleHotUpdate(context) { + // Invalidate the compilation cache so it recompiles + invalidateCompilation(config, context.file); + }, }; } diff --git a/packages/astro/src/vite-plugin-astro/query.ts b/packages/astro/src/vite-plugin-astro/query.ts new file mode 100644 index 000000000..f6ea8414a --- /dev/null +++ b/packages/astro/src/vite-plugin-astro/query.ts @@ -0,0 +1,35 @@ +export interface AstroQuery { + astro?: boolean; + src?: boolean; + type?: 'script' | 'template' | 'style' | 'custom'; + index?: number; + lang?: string; + raw?: boolean; +} + +// Parses an id to check if its an Astro request. +// CSS is imported like `import '/src/pages/index.astro?astro&type=style&index=0&lang.css'; +// This parses those ids and returns an object representing what it found. +export function parseAstroRequest(id: string): { + filename: string; + query: AstroQuery; +} { + const [filename, rawQuery] = id.split(`?`, 2); + const query = Object.fromEntries(new URLSearchParams(rawQuery).entries()) as AstroQuery; + if (query.astro != null) { + query.astro = true; + } + if (query.src != null) { + query.src = true; + } + if (query.index != null) { + query.index = Number(query.index); + } + if (query.raw != null) { + query.raw = true; + } + return { + filename, + query, + }; +} diff --git a/packages/astro/src/vite-plugin-build-css/index.ts b/packages/astro/src/vite-plugin-build-css/index.ts index f26a36dce..cba865351 100644 --- a/packages/astro/src/vite-plugin-build-css/index.ts +++ b/packages/astro/src/vite-plugin-build-css/index.ts @@ -1,9 +1,10 @@ import type { RenderedChunk } from 'rollup'; -import { Plugin as VitePlugin } from '../core/vite'; +import type { BuildInternals } from '../core/build/internal'; -import { STYLE_EXTENSIONS } from '../core/ssr/css.js'; import * as path from 'path'; import esbuild from 'esbuild'; +import { Plugin as VitePlugin } from '../core/vite'; +import { STYLE_EXTENSIONS } from '../core/ssr/css.js'; const PLUGIN_NAME = '@astrojs/rollup-plugin-build-css'; @@ -45,14 +46,11 @@ function isPageStyleVirtualModule(id: string) { } interface PluginOptions { - astroStyleMap: Map<string, string>; - astroPageStyleMap: Map<string, string>; - chunkToReferenceIdMap: Map<string, string>; - pureCSSChunks: Set<RenderedChunk>; + internals: BuildInternals; } export function rollupPluginAstroBuildCSS(options: PluginOptions): VitePlugin { - const { astroPageStyleMap, astroStyleMap, chunkToReferenceIdMap, pureCSSChunks } = options; + const { internals } = options; const styleSourceMap = new Map<string, string>(); return { @@ -94,10 +92,10 @@ export function rollupPluginAstroBuildCSS(options: PluginOptions): VitePlugin { async load(id) { if (isPageStyleVirtualModule(id)) { - return astroPageStyleMap.get(id) || null; + return internals.astroPageStyleMap.get(id) || null; } if (isStyleVirtualModule(id)) { - return astroStyleMap.get(id) || null; + return internals.astroStyleMap.get(id) || null; } return null; }, @@ -127,17 +125,26 @@ export function rollupPluginAstroBuildCSS(options: PluginOptions): VitePlugin { // if (!chunkCSS) return null; // don’t output empty .css files if (isPureCSS) { - const { code: minifiedCSS } = await esbuild.transform(chunkCSS, { - loader: 'css', - minify: true, - }); - const referenceId = this.emitFile({ - name: chunk.name + '.css', - type: 'asset', - source: minifiedCSS, - }); - pureCSSChunks.add(chunk); - chunkToReferenceIdMap.set(chunk.fileName, referenceId); + internals.pureCSSChunks.add(chunk); + } + + const { code: minifiedCSS } = await esbuild.transform(chunkCSS, { + loader: 'css', + minify: true, + }); + const referenceId = this.emitFile({ + name: chunk.name + '.css', + type: 'asset', + source: minifiedCSS, + }); + + internals.chunkToReferenceIdMap.set(chunk.fileName, referenceId); + if (chunk.type === 'chunk') { + const facadeId = chunk.facadeModuleId!; + if (!internals.facadeIdToAssetsMap.has(facadeId)) { + internals.facadeIdToAssetsMap.set(facadeId, []); + } + internals.facadeIdToAssetsMap.get(facadeId)!.push(this.getFileName(referenceId)); } return null; @@ -145,8 +152,8 @@ export function rollupPluginAstroBuildCSS(options: PluginOptions): VitePlugin { // Delete CSS chunks so JS is not produced for them. generateBundle(opts, bundle) { - if (pureCSSChunks.size) { - const pureChunkFilenames = new Set([...pureCSSChunks].map((chunk) => chunk.fileName)); + if (internals.pureCSSChunks.size) { + const pureChunkFilenames = new Set([...internals.pureCSSChunks].map((chunk) => chunk.fileName)); const emptyChunkFiles = [...pureChunkFilenames] .map((file) => path.basename(file)) .join('|') @@ -155,7 +162,7 @@ export function rollupPluginAstroBuildCSS(options: PluginOptions): VitePlugin { for (const [chunkId, chunk] of Object.entries(bundle)) { if (chunk.type === 'chunk') { - if (pureCSSChunks.has(chunk)) { + if (internals.pureCSSChunks.has(chunk)) { // Delete pure CSS chunks, these are JavaScript chunks that only import // other CSS files, so are empty at the end of bundling. delete bundle[chunkId]; diff --git a/packages/astro/src/vite-plugin-build-html/index.ts b/packages/astro/src/vite-plugin-build-html/index.ts index cdc5c1877..90765c35d 100644 --- a/packages/astro/src/vite-plugin-build-html/index.ts +++ b/packages/astro/src/vite-plugin-build-html/index.ts @@ -1,8 +1,9 @@ import type { AstroConfig, RouteCache } from '../@types/astro'; import type { LogOptions } from '../core/logger'; import type { ViteDevServer, Plugin as VitePlugin } from '../core/vite'; -import type { OutputChunk, PreRenderedChunk, RenderedChunk } from 'rollup'; +import type { OutputChunk, PreRenderedChunk } from 'rollup'; import type { AllPagesData } from '../core/build/types'; +import type { BuildInternals } from '../core/build/internal'; import parse5 from 'parse5'; import srcsetParse from 'srcset-parse'; import * as npath from 'path'; @@ -26,20 +27,17 @@ const STATUS_CODE_RE = /^404$/; interface PluginOptions { astroConfig: AstroConfig; - astroStyleMap: Map<string, string>; - astroPageStyleMap: Map<string, string>; - chunkToReferenceIdMap: Map<string, string>; + internals: BuildInternals; logging: LogOptions; allPages: AllPagesData; pageNames: string[]; - pureCSSChunks: Set<RenderedChunk>; origin: string; routeCache: RouteCache; viteServer: ViteDevServer; } export function rollupPluginAstroBuildHTML(options: PluginOptions): VitePlugin { - const { astroConfig, astroStyleMap, astroPageStyleMap, chunkToReferenceIdMap, pureCSSChunks, logging, origin, allPages, routeCache, viteServer, pageNames } = options; + const { astroConfig, internals, logging, origin, allPages, routeCache, viteServer, pageNames } = options; // The filepath root of the src folder const srcRoot = astroConfig.src.pathname; @@ -161,7 +159,7 @@ export function rollupPluginAstroBuildHTML(options: PluginOptions): VitePlugin { if (styles) { const styleId = getAstroStyleId(pathname); - astroStyleMap.set(styleId, styles); + internals.astroStyleMap.set(styleId, styles); // Put this at the front of imports assetImports.unshift(styleId); } @@ -175,7 +173,7 @@ export function rollupPluginAstroBuildHTML(options: PluginOptions): VitePlugin { if (assetImports.length) { const pageStyleId = getAstroPageStyleId(pathname); const jsSource = assetImports.map((sid) => `import '${sid}';`).join('\n'); - astroPageStyleMap.set(pageStyleId, jsSource); + internals.astroPageStyleMap.set(pageStyleId, jsSource); assetInput.add(pageStyleId); // preserve asset order in the order we encounter them @@ -268,7 +266,7 @@ export function rollupPluginAstroBuildHTML(options: PluginOptions): VitePlugin { // Sort CSS in order of appearance in HTML (pageStyleImportOrder) // This is the “global ordering” used below - const sortedCSSChunks = [...pureCSSChunks]; + const sortedCSSChunks = [...internals.pureCSSChunks]; sortedCSSChunks.sort((a, b) => { let aIndex = Math.min( ...Object.keys(a.modules).map((id) => { @@ -298,7 +296,7 @@ export function rollupPluginAstroBuildHTML(options: PluginOptions): VitePlugin { const referenceIDs: string[] = []; for (const chunkID of chunkModules) { - const referenceID = chunkToReferenceIdMap.get(chunkID); + const referenceID = internals.chunkToReferenceIdMap.get(chunkID); if (referenceID) referenceIDs.push(referenceID); } for (const id of Object.keys(chunk.modules)) { diff --git a/packages/astro/test/preact-component.test.js b/packages/astro/test/preact-component.test.js index d9fb14d1b..247232aef 100644 --- a/packages/astro/test/preact-component.test.js +++ b/packages/astro/test/preact-component.test.js @@ -6,6 +6,9 @@ let fixture; before(async () => { fixture = await loadFixture({ + devOptions: { + port: 3009, + }, projectRoot: './fixtures/preact-component/', renderers: ['@astrojs/renderer-preact'], }); diff --git a/packages/astro/test/react-component.test.js b/packages/astro/test/react-component.test.js index c6485460f..78af0d97c 100644 --- a/packages/astro/test/react-component.test.js +++ b/packages/astro/test/react-component.test.js @@ -7,6 +7,9 @@ let fixture; describe('React Components', () => { before(async () => { fixture = await loadFixture({ + devOptions: { + port: 3008, + }, projectRoot: './fixtures/react-component/', renderers: ['@astrojs/renderer-react', '@astrojs/renderer-vue'], }); diff --git a/packages/astro/test/solid-component.test.js b/packages/astro/test/solid-component.test.js index 426f687bc..1166b1515 100644 --- a/packages/astro/test/solid-component.test.js +++ b/packages/astro/test/solid-component.test.js @@ -7,6 +7,9 @@ describe('Solid component', () => { before(async () => { fixture = await loadFixture({ + devOptions: { + port: 3006, + }, projectRoot: './fixtures/solid-component/', renderers: ['@astrojs/renderer-solid'], }); diff --git a/packages/astro/test/svelte-component.test.js b/packages/astro/test/svelte-component.test.js index f50f24e0c..4e4ef5e56 100644 --- a/packages/astro/test/svelte-component.test.js +++ b/packages/astro/test/svelte-component.test.js @@ -7,6 +7,9 @@ describe('Svelte component', () => { before(async () => { fixture = await loadFixture({ + devOptions: { + port: 3007, + }, projectRoot: './fixtures/svelte-component/', renderers: ['@astrojs/renderer-svelte'], }); diff --git a/packages/astro/test/test-utils.js b/packages/astro/test/test-utils.js index f017b0cb9..eeffb8676 100644 --- a/packages/astro/test/test-utils.js +++ b/packages/astro/test/test-utils.js @@ -9,6 +9,7 @@ import preview from '../dist/core/preview/index.js'; /** * @typedef {import('node-fetch').Response} Response * @typedef {import('../src/core/dev/index').DevServer} DevServer + * @typedef {import('../src/@types/astro').AstroConfig AstroConfig} * * * @typedef {Object} Fixture @@ -21,7 +22,7 @@ import preview from '../dist/core/preview/index.js'; /** * Load Astro fixture - * @param {Object} inlineConfig Astro config partial (note: must specify projectRoot) + * @param {AstroConfig} inlineConfig Astro config partial (note: must specify projectRoot) * @returns {Fixture} The fixture. Has the following properties: * .config - Returns the final config. Will be automatically passed to the methods below: * diff --git a/packages/astro/test/vue-component.test.js b/packages/astro/test/vue-component.test.js index f375174bb..d4928cf1f 100644 --- a/packages/astro/test/vue-component.test.js +++ b/packages/astro/test/vue-component.test.js @@ -7,6 +7,9 @@ describe('Vue component', () => { before(async () => { fixture = await loadFixture({ + devOptions: { + port: 3005, + }, projectRoot: './fixtures/vue-component/', renderers: ['@astrojs/renderer-vue'], }); @@ -106,6 +106,13 @@ "@algolia/logger-common" "4.11.0" "@algolia/requester-common" "4.11.0" +"@antfu/utils@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.3.0.tgz#6306c43b52a883bd8e973e3ed8dd64248418bcc4" + integrity sha512-UU8TLr/EoXdg7OjMp0h9oDoIAVr+Z/oW9cpOxQQyrsz6Qzd2ms/1CdWx8fl2OQdFpxGmq5Vc4TwfLHId6nAZjA== + dependencies: + "@types/throttle-debounce" "^2.1.0" + "@apideck/better-ajv-errors@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.1.tgz#a8d4ef3ce67c418b8b24f2b76b6bc84eb547baf7" @@ -115,10 +122,10 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@astrojs/compiler@^0.5.4": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@astrojs/compiler/-/compiler-0.5.7.tgz#378a65afbc8d9945aa2bce2b80af1d2bf8808560" - integrity sha512-SMmgApjroKy6PGSjofTBbl9kIQb7/ywtiP0hYpa/x2yuiCQQoe+QLusOnNgmGDgJBmV/5UVEf1+EA+77s4acHQ== +"@astrojs/compiler@^0.6.0": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@astrojs/compiler/-/compiler-0.6.2.tgz#f9f6d2bfabc70921fa2be9da49767f878a1bc1e4" + integrity sha512-okzco1cwAPC1Fs1EovCckQpZFLAkuysTM+0qVXQ41fE6mLxmq/4i7fFR7l0Wy/0JapgcRQbK5xN4Y08ku4EPQg== dependencies: typescript "^4.3.5" @@ -1335,6 +1342,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@iconify/types@^1.0.12": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@iconify/types/-/types-1.0.12.tgz#839f1f784b7030b94482d51996570f4dbd7d6796" + integrity sha512-6er6wSGF3hgc1JEZqiGpg21CTCjHBYOUwqLmb2Idzkjiw6ogalGP0ZMLVutCzah+0WB4yP+Zd2oVPN8jvJ+Ftg== + +"@iconify/utils@^1.0.20": + version "1.0.20" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-1.0.20.tgz#b265fe2288cb30666bf64b80b246b55b0b952d90" + integrity sha512-J5IriR8KeANs8vIEFKWzOlOvNgZHkwqkmqaIwvqtuDbBeFHtXGfM/LYMDmjtRJ0AAa7f254qw6TK7gAibYfHUA== + dependencies: + "@iconify/types" "^1.0.12" + "@jsdevtools/rehype-toc@3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@jsdevtools/rehype-toc/-/rehype-toc-3.0.2.tgz#29c32e6b40cd4b5dafd96cb90d5057ac5dab4a51" @@ -1541,6 +1560,11 @@ dependencies: "@octokit/openapi-types" "^11.2.0" +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + "@proload/core@^0.2.1": version "0.2.2" resolved "https://registry.yarnpkg.com/@proload/core/-/core-0.2.2.tgz#d6de30e06a8864bdd0fbe568f87d0582cf988c1d" @@ -1916,6 +1940,11 @@ "@types/mime" "^1" "@types/node" "*" +"@types/throttle-debounce@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776" + integrity sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ== + "@types/trusted-types@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" @@ -2006,6 +2035,103 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +"@unocss/cli@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/cli/-/cli-0.15.6.tgz#68b56455a3a9c9700dcd46a87c5ba40a9dd62111" + integrity sha512-NPgUJklUTS+RzfEZghpTgg+FiZAm3B+AMy5x7nimSCoqwkeSioV/1YBu4eVaO+a1QdNqTKq8LrSM5qyvumrKOw== + dependencies: + "@unocss/config" "0.15.6" + "@unocss/core" "0.15.6" + "@unocss/preset-uno" "0.15.6" + cac "^6.7.12" + chokidar "^3.5.2" + colorette "^2.0.16" + consola "^2.15.3" + fast-glob "^3.2.7" + pathe "^0.2.0" + +"@unocss/config@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/config/-/config-0.15.6.tgz#d3e94871492671bde034d15dfc3a063c677efe78" + integrity sha512-RRDqJpPvSL9d4JuDMkkNzd1wPNb2lyO8/ih5dNjgm19lNqbNNW8LX7yhakr3ctRVJ07j7riOccJMLokoqRSd3A== + dependencies: + "@unocss/core" "0.15.6" + unconfig "^0.2.2" + +"@unocss/core@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/core/-/core-0.15.6.tgz#0a4b3e8343dc7556bea6e3e46ac2299da1c1efb3" + integrity sha512-rGigqZEnYIhb38ldiRYR4CcsPc8sjAu5TIx04/Ta4OmolmSVYhdV4/MHnFvjqBATsUNl8FcZLmI+Si+qwtxKtg== + +"@unocss/inspector@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/inspector/-/inspector-0.15.6.tgz#63fd9cdfb0103d12a1f9406cca796de89e191142" + integrity sha512-chEPZiDf9LMv6UN/US7P3Q8WkC5X/4g4ZYJQbu/j1T1u6RWBe809wXmNbcpHA87o62gMweX1VINs2nwdFz3rTw== + dependencies: + gzip-size "^6.0.0" + sirv "^1.0.19" + +"@unocss/preset-attributify@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/preset-attributify/-/preset-attributify-0.15.6.tgz#0693da6a478fa59a3c3450fa40b126b4bc629486" + integrity sha512-drXO5EiaWx6B+I+5FzaKR9blnKoKYQ56di0hDgZ3heGfFsCskQ6DwVHYKBjCDozMqwSOjGZBjTLMwALj/MnaqA== + dependencies: + "@unocss/core" "0.15.6" + +"@unocss/preset-icons@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/preset-icons/-/preset-icons-0.15.6.tgz#f7bd15dca5563df547fffd119d37fc935f6de375" + integrity sha512-o5NWtOu3OKVaWYVieQ1pVmsj7jvWvMgE5TXPKRr3OTRR2u8M5wo+yRX4+m1sVjAtWiUz8e49TpbbsQTM42Lv7A== + dependencies: + "@iconify/utils" "^1.0.20" + "@unocss/core" "0.15.6" + local-pkg "^0.4.0" + +"@unocss/preset-mini@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/preset-mini/-/preset-mini-0.15.6.tgz#53f81ff7eeb827009850341968694bfd5d6ff963" + integrity sha512-L5yt4kgnEvbYRsESjqel6N1m3AFrqBKYekurPl8s0VBa/Wkm3dq3RVO7qxEdsE2/AW0HxsEIIEKJtqJJEQY6xg== + dependencies: + "@unocss/core" "0.15.6" + +"@unocss/preset-uno@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/preset-uno/-/preset-uno-0.15.6.tgz#beddcedb1a62ec299f1bd0a7fa3c22c8d8d9092c" + integrity sha512-tnp8U6M52W1LPaJphiNyR0UWR7eR29/SICu+u23kGGTlqsLctMWn/DCqq5YiEBrs7MuBARpaK95mYD17D1fAVA== + dependencies: + "@unocss/core" "0.15.6" + "@unocss/preset-mini" "0.15.6" + "@unocss/preset-wind" "0.15.6" + +"@unocss/preset-wind@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/preset-wind/-/preset-wind-0.15.6.tgz#75086c718d0c5781818a76f9a06c121d1dafdc0c" + integrity sha512-rCGQwuBDoVUUrocmPSguNgxumuichaTBfu9KCjsZv1m5xWn78EHu5igQCnLhIVjyHaakQwwfawQW0pdvzAC1tw== + dependencies: + "@unocss/core" "0.15.6" + "@unocss/preset-mini" "0.15.6" + +"@unocss/reset@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/reset/-/reset-0.15.6.tgz#f18f9dbbb67e597ed31c2a4065b0e892a688f181" + integrity sha512-hjOYCrheZCrxWRC2eaTb0S29QnIRjt/KHscbMl4oL0lijOhWJ2BujJxYQ1sDZ47oCo+yBsEF6rqecNZ5puDb3g== + +"@unocss/scope@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/scope/-/scope-0.15.6.tgz#1ad65288553de4bad6fb6a59c6408c69d2409d84" + integrity sha512-ygHAxmW+VUSdG30JatnMzL3uQs3j/JinVhLmXkA5/A66xPq3JIwzvzJrGG7ZWUBbwaN5OHncS+5seB7jgjqsQw== + +"@unocss/vite@0.15.6": + version "0.15.6" + resolved "https://registry.yarnpkg.com/@unocss/vite/-/vite-0.15.6.tgz#81e79fd73f38d7ae6f318b5393370e66ea0fe443" + integrity sha512-AQOlqDfVfTbHRKzTU33iazszyG6CC3aL6lQrKhEsi506zgTn/CzqPyiLOEAGFbrQNR7CFeab0aufL/KR0McNpg== + dependencies: + "@rollup/pluginutils" "^4.1.1" + "@unocss/config" "0.15.6" + "@unocss/core" "0.15.6" + "@unocss/inspector" "0.15.6" + "@unocss/scope" "0.15.6" + "@vitejs/plugin-vue@^1.9.4": version "1.10.2" resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-1.10.2.tgz#d718479e2789d8a94b63e00f23f1898ba239253a" @@ -2280,6 +2406,19 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + arg@^5.0.0, arg@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" @@ -2447,6 +2586,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + before-after-hook@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" @@ -2484,6 +2628,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bluebird@3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -2588,16 +2741,36 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-modules@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== +builtins@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-4.0.0.tgz#a8345420de82068fdc4d6559d0456403a8fb1905" + integrity sha512-qC0E2Dxgou1IHhvJSLwGDSTvokbRovU5zZFuDY6oY8Y2lF3nGt5Ad8YZK7GMtqzY84Wu7pXTPeHQeHcXSXsRhw== + dependencies: + semver "^7.0.0" + bytes@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== +cac@^6.7.12: + version "6.7.12" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.12.tgz#6fb5ea2ff50bd01490dbda497f4ae75a99415193" + integrity sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA== + cache-content-type@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" @@ -2823,6 +2996,11 @@ chokidar@3.5.2, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -2883,7 +3061,12 @@ code-block-writer@^10.1.1: resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-10.1.1.tgz#ad5684ed4bfb2b0783c8b131281ae84ee640a42f" integrity sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw== -color-convert@^1.9.0: +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2902,11 +3085,32 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.1.4, color-name@~1.1.4: +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^2.0.16: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -2971,6 +3175,16 @@ connect@^3.7.0: parseurl "~1.3.3" utils-merge "1.0.1" +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + content-disposition@~0.5.2: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -3180,6 +3394,13 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -3192,6 +3413,11 @@ deep-equal@~1.0.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3228,6 +3454,11 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +defu@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/defu/-/defu-5.0.0.tgz#5768f0d402a555bfc4c267246b20f82ce8b5a10b" + integrity sha512-VHg73EDeRXlu7oYWRmmrNp/nl7QkdXUxkQQKig0Zk8daNmm84AbGoC8Be6/VVLJEKxn12hR0UBmz8O+xQiAPKQ== + degenerator@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.1.tgz#7ef78ec0c8577a544477308ddf1d2d6e88d51f5b" @@ -3292,6 +3523,11 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + detective@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" @@ -3370,7 +3606,7 @@ dotenv@^8.1.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== -duplexer@~0.1.1: +duplexer@^0.1.2, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -3415,7 +3651,7 @@ encodeurl@^1.0.2, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -4107,6 +4343,11 @@ execa@^6.0.0: signal-exit "^3.0.5" strip-final-newline "^3.0.0" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4334,6 +4575,11 @@ from@~0: resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -4397,6 +4643,20 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -4463,6 +4723,11 @@ get-uri@3: fs-extra "^8.1.0" ftp "^0.3.10" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + github-slugger@^1.1.1, github-slugger@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" @@ -4577,6 +4842,13 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -4630,6 +4902,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -4914,6 +5191,11 @@ idb@^6.1.4: resolved "https://registry.yarnpkg.com/idb/-/idb-6.1.5.tgz#dbc53e7adf1ac7c59f9b2bf56e00b4ea4fce8c7b" integrity sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw== +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -4924,6 +5206,13 @@ ignore@^5.1.4, ignore@^5.1.8: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +imagetools-core@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/imagetools-core/-/imagetools-core-3.0.1.tgz#979c5e2627921679dc39393e4ef0631716aa3d40" + integrity sha512-6W48yS78WPmf3LWrSiH6aG5HfnZNENvMRdGEalRQ+xNK2LtHLQDgzmLNW119rK13UN9AppDV28nVR9wIKifgUQ== + dependencies: + sharp "^0.28.2" + immutable@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" @@ -4951,6 +5240,13 @@ import-from@^3.0.0: dependencies: resolve-from "^5.0.0" +import-meta-resolve@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz#244fd542fd1fae73550d4f8b3cde3bba1d7b2b18" + integrity sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A== + dependencies: + builtins "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -4969,7 +5265,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4979,6 +5275,11 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" @@ -5024,6 +5325,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -5097,6 +5403,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -5327,6 +5640,11 @@ jest-worker@^26.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" +jiti@^1.12.9: + version "1.12.9" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.12.9.tgz#2ce45b265cfc8dc91ebd70a5204807cf915291bc" + integrity sha512-TdcJywkQtcwLxogc4rSMAi479G2eDPzfW0fLySks7TPhgZZ4s/tM6stnzayIh3gS/db3zExWJyUx4cNWrwAmoQ== + joi@^17.4.0: version "17.5.0" resolved "https://registry.yarnpkg.com/joi/-/joi-17.5.0.tgz#7e66d0004b5045d971cf416a55fb61d33ac6e011" @@ -5629,6 +5947,13 @@ load-yaml-file@^0.2.0: pify "^4.0.1" strip-bom "^3.0.0" +local-pkg@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.0.tgz#e6221171813d5a0812dd84fa80ffb1c8fcc00531" + integrity sha512-2XBWjO/v63JeR1HPzLJxdTVRQDB84Av2p2KtBA5ahvpyLUPubcAU6iXlAJrONcY7aSqgJhXxElAnKtnYsRolPQ== + dependencies: + mlly "^0.2.2" + locate-character@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-2.0.5.tgz#f2d2614d49820ecb3c92d80d193b8db755f74c0f" @@ -6316,6 +6641,11 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -6337,7 +6667,7 @@ minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -6362,6 +6692,11 @@ mixme@^0.5.1: resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.4.tgz#8cb3bd0cd32a513c161bf1ca99d143f0bcf2eff3" integrity sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -6374,6 +6709,13 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mlly@^0.2.2: + version "0.2.10" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-0.2.10.tgz#645902c9761dc6b5ded174b8e717147fe52e4893" + integrity sha512-xfyW6c2QBGArtctzNnTV5leOKX8nOMz2simeubtXofdsdSJFSNw+Ncvrs8kxcN3pBrQLXuYBHNFV6NgZ5Ryf4A== + dependencies: + import-meta-resolve "^1.1.1" + mocha@^9.1.3: version "9.1.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" @@ -6414,6 +6756,11 @@ mri@^1.1.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +mrmime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" + integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -6444,6 +6791,11 @@ nanostores@^0.5.6, nanostores@^0.5.7: resolved "https://registry.yarnpkg.com/nanostores/-/nanostores-0.5.8.tgz#f0ca342ed32f655329d125f3dbd900132fd1efb2" integrity sha512-syNUBiyorm4olP6TBs7HQg0/ICT58Np2awUC7/cR+o85WdyQe7JUdNORWuPonj0GQovjJdKDZmC2w0D/HIOMwA== +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -6476,6 +6828,18 @@ nlcst-to-string@^3.0.0: dependencies: "@types/nlcst" "^1.0.0" +node-abi@^2.21.0: + version "2.30.1" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" + integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== + dependencies: + semver "^5.4.1" + +node-addon-api@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + node-fetch@*, node-fetch@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.1.0.tgz#714f4922dc270239487654eaeeab86b8206cb52e" @@ -6579,6 +6943,16 @@ npm-run-path@^5.0.1: dependencies: path-key "^4.0.0" +npmlog@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + nth-check@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -6593,12 +6967,17 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + object-assign@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= -object-assign@^4.1.1: +object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -6945,6 +7324,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-0.2.0.tgz#30fd7bbe0a0d91f0e60bae621f5d19e9e225c339" + integrity sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw== + pathval@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" @@ -7054,6 +7438,25 @@ preact@~10.5.15: resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.15.tgz#6df94d8afecf3f9e10a742fd8c362ddab464225f" integrity sha512-5chK29n6QcJc3m1lVrKQSQ+V7K1Gb8HeQY6FViQ5AxCAEGu3DaHffWNDkC9+miZgsLvbvU9rxbV1qinGHMHzqA== +prebuild-install@^6.1.2: + version "6.1.4" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" + integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^2.21.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + preferred-pm@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.3.tgz#1b6338000371e3edbce52ef2e4f65eb2e73586d6" @@ -7225,6 +7628,16 @@ raw-body@^2.2.0: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-dom@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" @@ -7290,7 +7703,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.2.2: +readable-stream@^2.0.6, readable-stream@^2.2.2: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -7303,6 +7716,15 @@ readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.0.17: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -7662,7 +8084,7 @@ sade@^1.7.3: dependencies: mri "^1.1.0" -safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7727,7 +8149,7 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.5: +semver@^7.0.0, semver@^7.2.1, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -7767,7 +8189,7 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -set-blocking@^2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -7782,6 +8204,20 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +sharp@^0.28.2: + version "0.28.3" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.28.3.tgz#ecd74cefd020bee4891bb137c9850ee2ce277a8b" + integrity sha512-21GEP45Rmr7q2qcmdnjDkNP04Ooh5v0laGS5FDpojOO84D1DJwUijLiSq8XNNM6e8aGXYtoYRh3sVNdm8NodMA== + dependencies: + color "^3.1.3" + detect-libc "^1.0.3" + node-addon-api "^3.2.0" + prebuild-install "^6.1.2" + semver "^7.3.5" + simple-get "^3.1.0" + tar-fs "^2.1.1" + tunnel-agent "^0.6.0" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -7839,6 +8275,36 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.5: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3, simple-get@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sirv@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -8068,15 +8534,16 @@ stream-transform@^2.1.3: dependencies: mixme "^0.5.1" -string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" -string-width@^4.1.0, string-width@^4.2.0: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8085,6 +8552,14 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.0.1.tgz#0d8158335a6cfd8eb95da9b6b262ce314a036ffd" @@ -8133,6 +8608,13 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -8169,7 +8651,7 @@ strip-ansi@^0.3.0: dependencies: ansi-regex "^0.2.1" -strip-ansi@^3.0.0: +strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= @@ -8244,6 +8726,11 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + strnum@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" @@ -8343,6 +8830,27 @@ tailwindcss@^3.0.5: resolve "^1.20.0" tmp "^0.2.1" +tar-fs@^2.0.0, tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^6.1.0: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -8464,6 +8972,11 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + totalist@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/totalist/-/totalist-2.0.0.tgz#db6f1e19c0fa63e71339bbb8fba89653c18c7eec" @@ -8565,6 +9078,13 @@ tty-table@^2.8.10: wcwidth "^1.0.1" yargs "^15.1.0" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + turbo@^1.0.0: version "1.0.19" resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.0.19.tgz#5c666b7b497e443269da2c553d00fe23dbcc6914" @@ -8647,6 +9167,15 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unconfig@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/unconfig/-/unconfig-0.2.2.tgz#08742355bdadb8cf9d1f1870a971fec87f38726e" + integrity sha512-JN1MeYJ/POnjBj7NgOJJxPp6+NcD6Nd0hEuK0D89kjm9GvQQUq8HeE2Eb7PZgtu+64mWkDiqeJn1IZoLH7htPg== + dependencies: + "@antfu/utils" "^0.3.0" + defu "^5.0.0" + jiti "^1.12.9" + unherit@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unherit/-/unherit-3.0.0.tgz#83d69af9d8e3afd28fa51cff9ee84de7a1d82a6b" @@ -8826,6 +9355,19 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unocss@^0.15.5: + version "0.15.6" + resolved "https://registry.yarnpkg.com/unocss/-/unocss-0.15.6.tgz#e42f2a677adb98f05c817d0fb41bf1b2c1572634" + integrity sha512-Cq2CQCA2ISHnNgv2ben1nQP8/3w8O1D5geoK6ZZY8F5wvIvw/mZ9+qcgVx2ZuX5lLZMRP8MG9jL2WW0ocVgjNg== + dependencies: + "@unocss/cli" "0.15.6" + "@unocss/core" "0.15.6" + "@unocss/preset-attributify" "0.15.6" + "@unocss/preset-icons" "0.15.6" + "@unocss/preset-uno" "0.15.6" + "@unocss/reset" "0.15.6" + "@unocss/vite" "0.15.6" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -8867,7 +9409,7 @@ useragent@^2.1.8: lru-cache "4.1.x" tmp "0.0.x" -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -8949,6 +9491,15 @@ vfile@^5.0.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +vite-imagetools@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vite-imagetools/-/vite-imagetools-4.0.2.tgz#9b05f8adeabe149c223bd16cff7a3994185fcdbf" + integrity sha512-xIHAQi5oBRH/Vqb1OwDzcYHolOqQpFqATOj6/qzXzBASiBs1ZKa4tg9ICeRzsUczmiE3QLbFm3T4XURtzyJxwQ== + dependencies: + "@rollup/pluginutils" "^4.1.1" + imagetools-core "^3.0.1" + magic-string "^0.25.7" + vite-plugin-pwa@0.11.5: version "0.11.5" resolved "https://registry.yarnpkg.com/vite-plugin-pwa/-/vite-plugin-pwa-0.11.5.tgz#dfa6541dbd8938303b737541bdad57b6d26234ec" @@ -9187,6 +9738,13 @@ which@^1.2.9: dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" |