summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/fast-build/astro.config.mjs11
-rw-r--r--examples/fast-build/package.json16
-rw-r--r--examples/fast-build/src/components/Greeting.vue20
-rw-r--r--examples/fast-build/src/images/penguin.jpgbin0 -> 12013 bytes
-rw-r--r--examples/fast-build/src/images/random.jpgbin0 -> 14553 bytes
-rw-r--r--examples/fast-build/src/pages/index.astro32
-rw-r--r--examples/fast-build/src/styles/global.css3
-rw-r--r--packages/astro/package.json2
-rw-r--r--packages/astro/src/@types/astro.ts2
-rw-r--r--packages/astro/src/cli/index.ts4
-rw-r--r--packages/astro/src/core/build/index.ts187
-rw-r--r--packages/astro/src/core/build/internal.ts45
-rw-r--r--packages/astro/src/core/build/page-data.ts122
-rw-r--r--packages/astro/src/core/build/scan-based-build.ts68
-rw-r--r--packages/astro/src/core/build/static-build.ts195
-rw-r--r--packages/astro/src/core/config.ts1
-rw-r--r--packages/astro/src/core/ssr/index.ts117
-rw-r--r--packages/astro/src/runtime/server/index.ts26
-rw-r--r--packages/astro/src/vite-plugin-astro/compile.ts110
-rw-r--r--packages/astro/src/vite-plugin-astro/index.ts137
-rw-r--r--packages/astro/src/vite-plugin-astro/query.ts35
-rw-r--r--packages/astro/src/vite-plugin-build-css/index.ts53
-rw-r--r--packages/astro/src/vite-plugin-build-html/index.ts18
-rw-r--r--packages/astro/test/preact-component.test.js3
-rw-r--r--packages/astro/test/react-component.test.js3
-rw-r--r--packages/astro/test/solid-component.test.js3
-rw-r--r--packages/astro/test/svelte-component.test.js3
-rw-r--r--packages/astro/test/test-utils.js3
-rw-r--r--packages/astro/test/vue-component.test.js3
-rw-r--r--yarn.lock606
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
new file mode 100644
index 000000000..6c5dcd37a
--- /dev/null
+++ b/examples/fast-build/src/images/penguin.jpg
Binary files differ
diff --git a/examples/fast-build/src/images/random.jpg b/examples/fast-build/src/images/random.jpg
new file mode 100644
index 000000000..291883837
--- /dev/null
+++ b/examples/fast-build/src/images/random.jpg
Binary files differ
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'],
});
diff --git a/yarn.lock b/yarn.lock
index 35d265f8f..2be64de40 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -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"