Update renderer API for Vite (#1623)

* Update renderer API for Vite

* Fix lit-element tests

* Clean up comments

* Throw friendly error if renderer provides viteConfig in a bad format
This commit is contained in:
Drew Powers 2021-10-22 09:22:55 -06:00 committed by Drew Powers
parent 4b25d5592a
commit 330620e1b3
67 changed files with 421 additions and 549 deletions

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -14,15 +14,5 @@
"devDependencies": {
"astro": "^0.20.12",
"@snowpack/plugin-dotenv": "^2.1.0"
},
"snowpack": {
"alias": {
"components": "./src/components",
"~": "./src"
},
"plugins": [
"@snowpack/plugin-dotenv"
],
"workspaceRoot": "../.."
}
}

View file

@ -11,8 +11,5 @@
"devDependencies": {
"@astrojs/renderer-lit": "^0.1.2",
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -6,18 +6,14 @@ import '../components/Counter.js';
<!doctype html>
<html lang="en">
<head>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<title>Demo</title>
</head>
<body>
<head>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<title>Demo</title>
</head>
<body>
<h1>Test app</h1>
<my-counter client:load />
<Lorem />
<Lorem />
<calc-add num={33} />
</body>
</body>
</html>

View file

@ -11,8 +11,5 @@
"devDependencies": {
"astro": "^0.20.12",
"@astrojs/renderer-solid": "^0.1.1"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -2,20 +2,14 @@
// Component Imports
import Counter from '../components/Counter.tsx'
// Full Astro Component Syntax:
// https://docs.astro.build/core-concepts/astro-components/
---
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width"
/>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<style>
:global(:root) {
font-family: system-ui;
@ -23,22 +17,22 @@ import Counter from '../components/Counter.tsx'
}
:global(.counter) {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
place-items: center;
font-size: 2em;
grid-template-columns: repeat(3, minmax(0, 1fr));
margin-top: 2em;
place-items: center;
}
:global(.children) {
display: grid;
place-items: center;
margin-bottom: 2em;
place-items: center;
}
</style>
</head>
<body>
<main>
<Counter client:visible>
<h1>Hello Preact!</h1>
<h1>Hello, Preact!</h1>
</Counter>
</main>
</body>

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -11,13 +11,8 @@ const someProps = {
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width"
/>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<style>
:global(:root) {
font-family: system-ui;
@ -25,22 +20,22 @@ const someProps = {
}
:global(.counter) {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
place-items: center;
font-size: 2em;
grid-template-columns: repeat(3, minmax(0, 1fr));
margin-top: 2em;
place-items: center;
}
:global(.children) {
display: grid;
place-items: center;
margin-bottom: 2em;
place-items: center;
}
</style>
</head>
<body>
<main>
<Counter {...someProps} client:visible>
<h1>Hello React!</h1>
<h1>Hello, React!</h1>
</Counter>
</main>
</body>

View file

@ -11,8 +11,5 @@
"devDependencies": {
"astro": "^0.20.12",
"@astrojs/renderer-solid": "0.1.1"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -1,7 +1,6 @@
import { createSignal } from 'solid-js';
/** */
export default function SolidCounter({ children }) {
export default function Counter({ children }) {
const [count, setCount] = createSignal(0);
const add = () => setCount(count() + 1);
const subtract = () => setCount(count() - 1);

View file

@ -1,7 +1,6 @@
---
import Counter from '../components/Counter.jsx';
---
<html>
<head>
<meta charset="utf-8" />
@ -13,10 +12,10 @@ import Counter from '../components/Counter.jsx';
}
.counter {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
place-items: center;
font-size: 2em;
grid-template-columns: repeat(3, minmax(0, 1fr));
margin-top: 3em;
place-items: center;
}
.counter-message {
text-align: center;

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -9,13 +9,8 @@ import Counter from '../components/Counter.svelte'
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width"
/>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<style>
:global(:root) {
font-family: system-ui;
@ -23,22 +18,22 @@ import Counter from '../components/Counter.svelte'
}
:global(.counter) {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
place-items: center;
font-size: 2em;
grid-template-columns: repeat(3, minmax(0, 1fr));
margin-top: 2em;
place-items: center;
}
:global(.children) {
display: grid;
place-items: center;
margin-bottom: 2em;
place-items: center;
}
</style>
</head>
<body>
<main>
<Counter client:visible>
<h1>Hello Svelte!</h1>
<h1>Hello, Svelte!</h1>
</Counter>
</main>
</body>

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -9,13 +9,8 @@ import Counter from '../components/Counter.vue'
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width"
/>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<style>
:global(:root) {
font-family: system-ui;
@ -23,22 +18,22 @@ import Counter from '../components/Counter.vue'
}
:global(.counter) {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
place-items: center;
font-size: 2em;
grid-template-columns: repeat(3, minmax(0, 1fr));
margin-top: 2em;
place-items: center;
}
:global(.children) {
display: grid;
place-items: center;
margin-bottom: 2em;
place-items: center;
}
</style>
</head>
<body>
<main>
<Counter client:visible>
<h1>Hello Vue!</h1>
<h1>Hello, Vue!</h1>
</Counter>
</main>
</body>

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -15,8 +15,5 @@
"rehype-toc": "^3.0.2",
"remark-code-titles": "^0.1.2",
"remark-slug": "^6.0.0"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -10,8 +10,5 @@
},
"devDependencies": {
"astro": "^0.20.12"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -13,8 +13,5 @@
},
"dependencies": {
"nanostores": "^0.3.3"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -12,8 +12,5 @@
"astro": "^0.20.12",
"autoprefixer": "^10.3.7",
"tailwindcss": "^2.2.17"
},
"snowpack": {
"workspaceRoot": "../.."
}
}

View file

@ -240,14 +240,12 @@ export interface RenderPageOptions {
export interface Renderer {
/** Name of the renderer (required) */
name: string;
hydrationPolyfills?: string[];
/** Dont try and build these dependencies for client */
external?: string[];
/** Clientside requirements */
knownEntrypoints?: string[];
polyfills?: string[];
/** Import statement for renderer */
source?: string;
/** Scripts to be injected before component */
polyfills?: string[];
/** Polyfills that need to run before hydration ever occurs */
hydrationPolyfills?: string[];
/** JSX identifier (e.g. 'react' or 'solid-js') */
jsxImportSource?: string;
/** Babel transform options */
@ -259,8 +257,12 @@ export interface Renderer {
html: string;
}>;
};
/** Add plugins to Vite, if any */
vitePlugins?: vite.Plugin[];
/** Return configuration object for Vite ("options" should match https://vitejs.dev/guide/api-plugin.html#config) */
viteConfig?: (options: { mode: 'string'; command: 'build' | 'serve' }) => Promise<vite.InlineConfig>;
/** @deprecated Dont try and build these dependencies for client (deprecated in 0.21) */
external?: string[];
/** @deprecated Clientside requirements (deprecated in 0.21) */
knownEntrypoints?: string[];
}
export interface RouteData {

View file

@ -2,7 +2,6 @@ import type { AstroConfig } from '../@types/astro-core';
import type { AstroDevServer } from './dev';
import type { LogOptions } from './logger';
import fs from 'fs';
import slash from 'slash';
import { fileURLToPath } from 'url';
import { createRequire } from 'module';
@ -16,7 +15,10 @@ import { getPackageJSON, parseNpmName } from './util.js';
const require = createRequire(import.meta.url);
/**
// Some packages are just external, and thats the way it goes.
const ALWAYS_EXTERNAL = new Set(['@sveltejs/vite-plugin-svelte', 'micromark-util-events-to-acorn', 'estree-util-value-to-estree', 'shorthash', 'unified']);
/*
* Tailwind fixes
* These fix Tailwind HMR in dev, and must be declared before Vite initiates.
* These are Tailwind-specific, so theyre safe to add.
@ -26,100 +28,74 @@ const require = createRequire(import.meta.url);
// note: ssr is still an experimental API hence the type omission
type ViteConfigWithSSR = vite.InlineConfig & { ssr?: { external?: string[]; noExternal?: string[] } };
/** Return a common starting point for all Vite actions */
export async function createVite(
viteConfig: ViteConfigWithSSR,
{ astroConfig, logging, devServer }: { astroConfig: AstroConfig; logging: LogOptions; devServer?: AstroDevServer }
): Promise<ViteConfigWithSSR> {
const optimizedDeps = new Set<string>(); // dependencies that must be bundled for the client (Vite may not detect all of these)
const dedupe = new Set<string>(); // dependencies that cant be duplicated (e.g. React & SolidJS)
const plugins: Plugin[] = []; // Vite plugins
interface CreateViteOptions {
astroConfig: AstroConfig;
devServer?: AstroDevServer;
logging: LogOptions;
}
// load project deps
/** Return a common starting point for all Vite actions */
export async function createVite(inlineConfig: ViteConfigWithSSR, { astroConfig, logging, devServer }: CreateViteOptions): Promise<ViteConfigWithSSR> {
const packageJSON = (await getPackageJSON(astroConfig.projectRoot)) || {};
const userDeps = Object.keys(packageJSON?.dependencies || {});
userDeps.forEach((dep) => {
optimizedDeps.add(dep); // prepare all user deps for client ahead of time
});
const userDevDeps = Object.keys(packageJSON?.devDependencies || {});
const { external, noExternal } = await viteSSRDeps([...userDeps, ...userDevDeps]);
// console.log(external.has('tiny-glob'), noExternal.has('tiny-glob'));
const { external, noExternal } = await viteSSRDeps([...userDeps, ...userDevDeps]); // TODO: improve this?
// load Astro renderers
await Promise.all(
astroConfig.renderers.map(async (name) => {
const { default: renderer } = await import(name);
// prepare client-side hydration code for browser
if (renderer.client) {
optimizedDeps.add(name + renderer.client.substr(1));
}
// knownEntrypoints and polyfills need to be added to the client
for (let dep of [...(renderer.knownEntrypoints || []), ...(renderer.polyfills || [])]) {
if (dep[0] === '.') dep = name + dep.substr(1); // if local polyfill, use full path
optimizedDeps.add(dep);
dedupe.add(dep); // we can try and dedupe renderers by default
}
// let renderer inject Vite plugins
if (renderer.vitePlugins) {
plugins.push(...renderer.vitePlugins);
}
// mark external packages as external to Vite
if (renderer.external) {
for (const dep of renderer.external) {
external.add(dep);
noExternal.delete(dep);
}
}
})
);
// load client-side hydrations
fs.readdirSync(new URL('../runtime/client', import.meta.url)).forEach((hydrator) => {
optimizedDeps.add(`astro/client/${hydrator}`); // always prepare these for client
});
return vite.mergeConfig(
{
cacheDir: fileURLToPath(new URL('./node_modules/.vite/', astroConfig.projectRoot)), // using local caches allows Astro to be used in monorepos, etc.
clearScreen: false,
logLevel: 'error',
optimizeDeps: {
/** Try and scan a users project (wont catch everything) */
entries: ['src/**/*'],
/** Always include these dependencies for optimization */
include: [...optimizedDeps],
},
plugins: [
astroVitePlugin({ config: astroConfig, devServer }),
markdownVitePlugin({ config: astroConfig, devServer }),
jsxVitePlugin({ config: astroConfig, logging }),
astroPostprocessVitePlugin({ config: astroConfig, devServer }),
fetchVitePlugin(),
...plugins,
],
publicDir: fileURLToPath(astroConfig.public),
resolve: {
dedupe: [...dedupe],
},
root: fileURLToPath(astroConfig.projectRoot),
server: {
/** prevent serving outside of project root (will become new default soon) */
fs: { strict: true },
/** disable HMR for test */
hmr: process.env.NODE_ENV === 'test' || process.env.NODE_ENV === 'production' ? false : undefined,
/** handle Vite URLs */
proxy: {
// add proxies here
},
},
/** Note: SSR API is in beta (https://vitejs.dev/guide/ssr.html) */
ssr: {
external: [...external],
noExternal: [...noExternal],
// First, start with the Vite configuration that Astro core needs
let viteConfig: ViteConfigWithSSR = {
cacheDir: fileURLToPath(new URL('./node_modules/.vite/', astroConfig.projectRoot)), // using local caches allows Astro to be used in monorepos, etc.
clearScreen: false, // we want to control the output, not Vite
logLevel: 'error', // log errors only
optimizeDeps: {
entries: ['src/**/*'], // Try and scan a users project (wont catch everything),
include: [...userDeps], // tell Vite to prebuild everything in a users package.json dependencies
},
plugins: [
astroVitePlugin({ config: astroConfig, devServer }),
markdownVitePlugin({ config: astroConfig, devServer }),
jsxVitePlugin({ config: astroConfig, logging }),
astroPostprocessVitePlugin({ config: astroConfig, devServer }),
fetchVitePlugin(),
],
publicDir: fileURLToPath(astroConfig.public),
root: fileURLToPath(astroConfig.projectRoot),
server: {
/** disable HMR for test */
hmr: process.env.NODE_ENV === 'test' || process.env.NODE_ENV === 'production' ? false : undefined,
/** handle Vite URLs */
proxy: {
// add proxies here
},
},
vite.mergeConfig(viteConfig, astroConfig.vite || {}) // merge in user vite settings
);
/** Note: SSR API is in beta (https://vitejs.dev/guide/ssr.html) */
ssr: {
external: [...external, ...ALWAYS_EXTERNAL],
noExternal: [...noExternal],
},
};
// Add in Astro renderers, which will extend the base config
for (const name of astroConfig.renderers) {
try {
const { default: renderer } = await import(name);
if (!renderer) continue;
// if a renderer provides viteConfig(), call it and pass in results
if (renderer.viteConfig) {
if (typeof renderer.viteConfig !== 'function') {
throw new Error(`${name}: viteConfig(options) must be a function! Got ${typeof renderer.viteConfig}.`);
}
const rendererConfig = await renderer.viteConfig({ mode: inlineConfig.mode, command: inlineConfig.mode === 'production' ? 'build' : 'serve' }); // is this command true?
viteConfig = vite.mergeConfig(viteConfig, rendererConfig) as vite.InlineConfig;
}
} catch (err) {
throw new Error(`${name}: ${err}`);
}
}
// Add in user settings last, followed by any Vite configuration passed in from the parent function (overrides)
viteConfig = vite.mergeConfig(viteConfig, astroConfig.vite || {}); // merge in Vite config from astro.config.mjs
viteConfig = vite.mergeConfig(viteConfig, inlineConfig); // merge in inline Vite config
return viteConfig;
}
/** Try and automatically figure out Vite external & noExternal */
@ -165,23 +141,14 @@ async function viteSSRDeps(deps: string[]): Promise<{ external: Set<string>; noE
return;
}
// sort this package
let isExternal = true; // external by default
// ESM gets noExternal
if (packageJSON.type === 'module') isExternal = false;
// TODO: manual bugfixes for Vite
if (pkg.name === '@sveltejs/vite-plugin-svelte') isExternal = true;
if (pkg.name === 'micromark-util-events-to-acorn') isExternal = true;
if (pkg.name === 'unified') isExternal = true;
// TODO: add more checks here if needed
// add to list
if (isExternal === true) {
external.add(spec);
} else {
// if ESM, try noExternal
if (packageJSON.type === 'module') {
noExternal.add(spec);
}
// otherwise, assume external by default
else {
external.add(spec);
}
// recursively load dependencies for package (but not devDeps)
await Promise.all(Object.keys(packageJSON.dependencies || {}).map(sortPkg));

View file

@ -5,7 +5,7 @@ import type { LogOptions } from '../logger';
import type { HmrContext, ModuleNode } from '../vite';
import { fileURLToPath } from 'url';
import {promisify} from 'util';
import { promisify } from 'util';
import connect from 'connect';
import mime from 'mime';
import { performance } from 'perf_hooks';

View file

@ -1,8 +1,7 @@
import type { AstroComponentMetadata } from '../../@types/astro-core';
import type { AstroComponentMetadata, Renderer } from '../../@types/astro-core';
import type { SSRResult } from '../../@types/astro-runtime';
import type { TopLevelAstro } from '../../@types/astro-runtime';
import { pathToFileURL } from 'url';
import { valueToEstree } from 'estree-util-value-to-estree';
import * as astring from 'astring';
import shorthash from 'shorthash';
@ -210,14 +209,15 @@ export async function renderComponent(result: SSRResult, displayName: string, Co
metadata.componentUrl = hydration.componentUrl;
}
let renderer = null;
let renderer: Renderer | undefined;
for (const r of renderers) {
if (await r.ssr.check(Component, props, children)) {
renderer = r;
break;
}
}
if (renderer === null) {
if (!renderer) {
if (typeof Component === 'string') {
html = await renderAstroComponent(await render`<${Component}${spreadAttributes(props)}>${children}</${Component}>`);
} else {
@ -261,7 +261,7 @@ function createFetchContentFn(url: URL) {
...mod.frontmatter,
content: mod.metadata,
file: new URL(spec, url),
url: urlSpec.includes('/pages/') && urlSpec.replace(/^.*\/pages\//, '/').replace(/\.md$/, '')
url: urlSpec.includes('/pages/') && urlSpec.replace(/^.*\/pages\//, '/').replace(/\.md$/, ''),
};
})
.filter(Boolean);

View file

@ -40,7 +40,7 @@ export default function astro({ config, devServer }: AstroPluginOptions): vite.P
// 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",
as: isPage ? 'document' : 'fragment',
site: config.buildOptions.site,
sourcefile: id,
sourcemap: 'both',
@ -50,9 +50,9 @@ export default function astro({ config, devServer }: AstroPluginOptions): vite.P
const result = await transformWithVite(value, attrs, id, viteTransform);
if (!result) {
// TODO: compiler supports `null`, but types don't yet
return (result as any);
return result as any;
}
return { code: result.code, map: result.map?.toString() }
return { code: result.code, map: result.map?.toString() };
},
});
// Compile `.ts` to `.js`

View file

@ -18,6 +18,7 @@ function isSSR(options: undefined | boolean | { ssr: boolean }): boolean {
// This matches any JS-like file (that we know of)
// See https://regex101.com/r/Cgofir/1
const SUPPORTED_FILES = /\.(astro|svelte|vue|[cm]?js|jsx|[cm]?ts|tsx)$/;
const IGNORED_FILES = new Set(['astro/dist/runtime/server/index.js']);
const DEFINE_FETCH = `import fetch from 'node-fetch';\n`;
export default function pluginFetch(): Plugin {
@ -25,6 +26,11 @@ export default function pluginFetch(): Plugin {
name: '@astrojs/vite-plugin-fetch',
enforce: 'post',
async transform(code, id, opts) {
// Ignore internal files, etc.
for (const ignored of IGNORED_FILES) {
if (id.endsWith(ignored)) return null;
}
const ssr = isSSR(opts);
// If this isn't an SSR pass, `fetch` will already be available!
if (!ssr) {

View file

@ -41,7 +41,6 @@ function isSSR(options: undefined | boolean | { ssr: boolean }): boolean {
return false;
}
/** Use Astro config to allow for alternate or multiple JSX renderers (by default Vite will assume React) */
export default function jsx({ config, logging }: AstroPluginJSXOptions): Plugin {
return {
@ -69,13 +68,13 @@ export default function jsx({ config, logging }: AstroPluginJSXOptions): Plugin
}
}
// Attempt: Single JSX renderer
// Attempt: Single JSX renderer
// If we only have one renderer, we can skip a bunch of work!
if (JSX_RENDERERS.size === 1) {
// downlevel any non-standard syntax, but preserve JSX
const { code: jsxCode } = await esbuild.transform(code, {
loader: getLoader(path.extname(id)),
jsx: 'preserve'
jsx: 'preserve',
});
return transformJSX({ code: jsxCode, id, renderer: [...JSX_RENDERERS.values()][0], ssr });
}
@ -129,7 +128,7 @@ export default function jsx({ config, logging }: AstroPluginJSXOptions): Plugin
// downlevel any non-standard syntax, but preserve JSX
const { code: jsxCode } = await esbuild.transform(code, {
loader: getLoader(path.extname(id)),
jsx: 'preserve'
jsx: 'preserve',
});
return transformJSX({ code: jsxCode, id, renderer: JSX_RENDERERS.get(importSource) as Renderer, ssr });
}

View file

@ -1,7 +1,6 @@
import { expect } from 'chai';
import cheerio from 'cheerio';
import { loadFixture } from './test-utils.js';
import path from 'path';
describe('Custom Elements', () => {
let fixture;

View file

@ -1,2 +1 @@
globalThis.somePolyfillHere = '';
globalThis.somePolyfillHere = '';

View file

@ -6,5 +6,12 @@ export default {
],
hydrationPolyfills: [
'./hydration-polyfill.js'
]
],
viteConfig() {
return {
optimizeDeps: {
include: ['@astrojs/test-custom-element-renderer/polyfill.js', '@astrojs/test-custom-element-renderer/hydration-polyfill.js']
}
}
}
};

View file

@ -10,4 +10,4 @@
"./polyfill.js": "./polyfill.js",
"./hydration-polyfill.js": "./hydration-polyfill.js"
}
}
}

View file

@ -1,2 +1,2 @@
console.log('this is a polyfill');
export default {};
export default {};

View file

@ -29,4 +29,4 @@ function renderToStaticMarkup(component) {
export default {
check,
renderToStaticMarkup
};
};

View file

@ -25,4 +25,4 @@ globalThis.HTMLElement = class {
set innerHTML(val) {
this._innerHTML = val;
}
};
};

View file

@ -5,4 +5,4 @@
"dependencies": {
"@astrojs/test-custom-element-renderer": "0.0.1"
}
}
}

View file

@ -10,4 +10,4 @@ class MyElement extends HTMLElement {
customElements.define(tagName, MyElement);
export default MyElement;
export default MyElement;

View file

@ -12,4 +12,4 @@ const title = 'My App';
<my-element client:load></my-element>
</body>
</html>
</html>

View file

@ -10,4 +10,4 @@ export class MyElement extends LitElement {
}
}
customElements.define('my-element', MyElement);
customElements.define('my-element', MyElement);

View file

@ -9,4 +9,4 @@ import { MyElement } from '../components/my-element.js';
<body>
<MyElement foo="bar" />
</body>
</html>
</html>

View file

@ -1,5 +1,5 @@
/** @jsxImportSource preact */
export default function({}: object) {
return <div class="pragma-comment">Hello world</div>;
return <div class="pragma-comment-tsx">Hello world</div>;
}

View file

@ -1,6 +1,6 @@
---
import Hello from '../components/Hello.jsx';
import Later from '../components/Goodbye.vue'; // use different specifier
import Later from '../components/Goodbye.vue';
import ArrowFunction from '../components/ArrowFunction.jsx';
import PropsSpread from '../components/PropsSpread.jsx';
import {Research2} from '../components/Research.jsx';

View file

@ -1,12 +1,16 @@
/**
* UNCOMMENT: fix Vite SSR import of lit-element (TODO: update render API)
import { expect } from 'chai';
import cheerio from 'cheerio';
import { loadFixture } from './test-utils.js';
let fixture;
const NODE_VERSION = parseFloat(process.versions.node);
before(async () => {
// @lit-labs/ssr/ requires Node 13.9 or higher
if (NODE_VERSION < 13.9) {
return;
}
fixture = await loadFixture({
projectRoot: './fixtures/lit-element/',
renderers: ['@astrojs/renderer-lit'],
@ -16,8 +20,8 @@ before(async () => {
describe('LitElement test', () => {
it('Renders a custom element by tag name', async () => {
// lit SSR is not currently supported on Node.js < 13
if (process.versions.node <= '13') {
// @lit-labs/ssr/ requires Node 13.9 or higher
if (NODE_VERSION < 13.9) {
return;
}
const html = await fixture.readFile('/index.html');
@ -51,6 +55,3 @@ describe('LitElement test', () => {
}
});
});
*/
it.skip('is skipped', () => {});

View file

@ -1,5 +1,3 @@
/**
* UNCOMMENT: ???? (this is a really weird transform bug)
import { expect } from 'chai';
import cheerio from 'cheerio';
import { loadFixture } from './test-utils.js';
@ -7,7 +5,10 @@ import { loadFixture } from './test-utils.js';
let fixture;
before(async () => {
fixture = await loadFixture({ projectRoot: './fixtures/preact-component/' });
fixture = await loadFixture({
projectRoot: './fixtures/preact-component/',
renderers: ['@astrojs/renderer-preact'],
});
await fixture.build();
});
@ -20,7 +21,8 @@ describe('Preact component', () => {
expect($('#class-component')).to.have.lengthOf(1);
});
it('Can load function component', async () => {
// TODO: fix compiler bug (not interpreting <ArrowFunction /> as a component)
it.skip('Can load function component', async () => {
const html = await fixture.readFile('/fn/index.html');
const $ = cheerio.load(html);
@ -57,10 +59,12 @@ describe('Preact component', () => {
const $ = cheerio.load(html);
// test 1: rendered the PragmaComment component
expect($('.pragma-comment')).to.have.lengthOf(2);
expect($('.pragma-comment')).to.have.lengthOf(1);
expect($('.pragma-comment-tsx')).to.have.lengthOf(1);
});
it('Uses the new JSX transform', async () => {
// In moving over to Vite, the jsx-runtime import is now obscured. TODO: update the method of finding this.
it.skip('Uses the new JSX transform', async () => {
const html = await fixture.readFile('/pragma-comment/index.html');
// Grab the imports
@ -79,6 +83,3 @@ describe('Preact component', () => {
expect(jsxRuntime).to.be.ok;
});
});
*/
it.skip('is skipped', () => {});

View file

@ -1,5 +1,3 @@
/**
* UNCOMMENT: improve Vite automatic React support
import { expect } from 'chai';
import cheerio from 'cheerio';
import { loadFixture } from './test-utils.js';
@ -7,7 +5,10 @@ import { loadFixture } from './test-utils.js';
let fixture;
before(async () => {
fixture = await loadFixture({ projectRoot: './fixtures/react-component/' });
fixture = await loadFixture({
projectRoot: './fixtures/react-component/',
renderers: ['@astrojs/renderer-react', '@astrojs/renderer-vue'],
});
await fixture.build();
});
@ -22,8 +23,9 @@ describe('React Components', () => {
// test 2: no reactroot
expect($('#react-h2').attr('data-reactroot')).to.equal(undefined);
// TODO: fix compiler bug with arrow components
// test 3: Can use function components
expect($('#arrow-fn-component')).to.have.lengthOf(1);
// expect($('#arrow-fn-component')).to.have.lengthOf(1);
// test 4: Can use spread for components
expect($('#component-spread-props')).to.have.lengthOf(1);
@ -32,13 +34,14 @@ describe('React Components', () => {
expect($('#component-spread-props').text(), 'Hello world!');
// test 6: Can use TS components
expect($('.ts-component')).toHaveLength(1);
expect($('.ts-component')).to.have.lengthOf(1);
// test 7: Can use Pure components
expect($('#pure')).toHaveLength(1);
expect($('#pure')).to.have.lengthOf(1);
});
it('Includes reactroot on hydrating components', async () => {
// TODO: fix ocmpiler bug
it.skip('Includes reactroot on hydrating components', async () => {
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
@ -51,10 +54,11 @@ describe('React Components', () => {
expect(div.html()).to.equal('foo bar <!-- -->1');
});
it('Throws helpful error message on window SSR', async () => {
// TODO: Vite does not throw a helpful error message on window SSR
it.skip('Throws helpful error message on window SSR', async () => {
const html = await fixture.readFile('/window/index.html');
expect(html).to.include(
`[/window]
`[/window]
The window object is not available during server-side rendering (SSR).
Try using \`import.meta.env.SSR\` to write SSR-friendly code.
https://docs.astro.build/reference/api-reference/#importmeta`
@ -67,15 +71,16 @@ describe('React Components', () => {
expect($('#vue-h2').text()).to.equal('Hasta la vista, baby');
});
// TODO: fix
it('Can use a pragma comment', async () => {
const html = await fixture.fetch('/pragma-comment/index.html');
const html = await fixture.readFile('/pragma-comment/index.html');
const $ = cheerio.load(html);
// test 1: rendered the PragmaComment component
expect($('.pragma-comment')).to.have.lengthOf(2);
});
// note(drew): unsure how to update this test?
// In moving over to Vite, the jsx-runtime import is now obscured. TODO: update the method of finding this.
it.skip('uses the new JSX transform', async () => {
const html = await fixture.fetch('/index.html');
@ -95,6 +100,3 @@ describe('React Components', () => {
expect(jsxRuntime).to.be.ok;
});
});
*/
it.skip('is skipped', () => {});

View file

@ -6,7 +6,10 @@ describe('Vue component', () => {
let fixture;
before(async () => {
fixture = await loadFixture({ projectRoot: './fixtures/vue-component/' });
fixture = await loadFixture({
projectRoot: './fixtures/vue-component/',
renderers: ['@astrojs/renderer-vue'],
});
await fixture.build();
});

View file

@ -1,8 +1,34 @@
// NOTE: @lit-labs/ssr uses syntax incompatible with anything < Node v13.9.0.
// Throw an error if using that Node version.
const NODE_VERSION = parseFloat(process.versions.node);
if (NODE_VERSION < 13.9) {
throw new Error(`Package @lit-labs/ssr requires Node version v13.9 or higher. Please update Node to use @astrojs/renderer-lit`);
}
export default {
name: '@astrojs/renderer-lit',
server: './server.js',
external: ['lit', '@lit-labs/ssr/lib/install-global-dom-shim.js', '@lit-labs/ssr/lib/render-lit-html.js', '@lit-labs/ssr/lib/lit-element-renderer.js'],
polyfills: ['./client-shim.js'],
hydrationPolyfills: ['./hydration-support.js'],
knownEntrypoints: ['@astrojs/renderer-lit/client-shim.js', '@astrojs/renderer-lit/hydration-support.js', '@webcomponents/template-shadowroot/template-shadowroot.js'],
viteConfig() {
return {
optimizeDeps: {
include: [
'@astrojs/renderer-lit/client-shim.js',
'@astrojs/renderer-lit/hydration-support.js',
'@webcomponents/template-shadowroot/template-shadowroot.js',
'lit/experimental-hydrate-support.js',
],
},
ssr: {
external: [
'lit-element/lit-element.js',
'@lit-labs/ssr/lib/install-global-dom-shim.js',
'@lit-labs/ssr/lib/render-lit-html.js',
'@lit-labs/ssr/lib/lit-element-renderer.js',
],
},
};
},
};

View file

@ -41,7 +41,7 @@ function* render(tagName, attrs, children) {
yield* shadowContents;
yield '</template>';
}
yield children;
yield children || ''; // dont print “undefined” as string
yield `</${tagName}>`;
}

View file

@ -2,7 +2,6 @@ export default {
name: '@astrojs/renderer-preact',
client: './client.js',
server: './server.js',
knownEntrypoints: ['preact', 'preact/jsx-runtime', 'preact-render-to-string'],
jsxImportSource: 'preact',
jsxTransformOptions: async () => {
const {
@ -12,4 +11,14 @@ export default {
plugins: [jsx({}, { runtime: 'automatic', importSource: 'preact' })],
};
},
viteConfig() {
return {
optimizeDeps: {
include: ['@astrojs/renderer-preact/client.js', 'preact', 'preact/jsx-runtime', 'preact-render-to-string'],
},
ssr: {
external: ['preact-render-to-string'],
},
};
},
};

View file

@ -10,8 +10,8 @@
"./package.json": "./package.json"
},
"dependencies": {
"@babel/plugin-transform-react-jsx": "^7.14.5",
"preact": "^10.5.14",
"@babel/plugin-transform-react-jsx": "^7.14.9",
"preact": "^10.5.15",
"preact-render-to-string": "^5.1.19"
},
"engines": {

View file

@ -2,7 +2,6 @@ export default {
name: '@astrojs/renderer-react',
client: './client.js',
server: './server.js',
knownEntrypoints: ['react', 'react/jsx-runtime', 'react-dom', 'react-dom/server.js'],
jsxImportSource: 'react',
jsxTransformOptions: async () => {
const {
@ -12,4 +11,17 @@ export default {
plugins: [jsx({}, { runtime: 'automatic', importSource: 'react' })],
};
},
viteConfig() {
return {
optimizeDeps: {
include: ['@astrojs/renderer-react/client.js', 'react', 'react/jsx-runtime', 'react/jsx-dev-runtime', 'react-dom'],
},
resolve: {
dedupe: ['react', 'react-dom'],
},
ssr: {
external: ['react-dom/server.js'],
},
};
},
};

View file

@ -10,7 +10,7 @@
"./package.json": "./package.json"
},
"dependencies": {
"@babel/plugin-transform-react-jsx": "^7.14.5",
"@babel/plugin-transform-react-jsx": "^7.14.9",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},

View file

@ -1,5 +1,5 @@
import { Component as BaseComponent, createElement as h, PureComponent } from 'react';
import { renderToStaticMarkup as reactRenderToStaticMarkup, renderToString } from 'react-dom/server.js';
import React from 'react';
import ReactDOM from 'react-dom/server.js';
import StaticHtml from './static-html.js';
const reactTypeof = Symbol.for('react.element');
@ -8,7 +8,7 @@ function check(Component, props, children) {
if (typeof Component !== 'function') return false;
if (Component.prototype != null && typeof Component.prototype.render === 'function') {
return BaseComponent.isPrototypeOf(Component) || PureComponent.isPrototypeOf(Component);
return React.Component.isPrototypeOf(Component) || React.PureComponent.isPrototypeOf(Component);
}
let error = null;
@ -23,7 +23,7 @@ function check(Component, props, children) {
error = err;
}
return h('div');
return React.createElement('div');
}
renderToStaticMarkup(Tester, props, children, {});
@ -35,12 +35,16 @@ function check(Component, props, children) {
}
function renderToStaticMarkup(Component, props, children, metadata) {
const vnode = h(Component, { ...props, children: h(StaticHtml, { value: children }), innerHTML: children });
const vnode = React.createElement(Component, {
...props,
children: React.createElement(StaticHtml, { value: children }),
innerHTML: children,
});
let html;
if (metadata && metadata.hydrate) {
html = renderToString(vnode);
html = ReactDOM.renderToString(vnode);
} else {
html = reactRenderToStaticMarkup(vnode);
html = ReactDOM.renderToStaticMarkup(vnode);
}
return { html };
}

View file

@ -2,8 +2,6 @@ export default {
name: '@astrojs/renderer-solid',
client: './client.js',
server: './server.js',
external: ['solid-js/web/dist/server.js', 'solid-js/store/dist/server.js', 'solid-js/dist/server.js', 'babel-preset-solid'],
knownEntrypoints: ['solid-js', 'solid-js/web', 'solid-js/store', 'solid-js/html', 'solid-js/h'],
jsxImportSource: 'solid-js',
jsxTransformOptions: async ({ isSSR }) => {
const [{ default: solid }] = await Promise.all([import('babel-preset-solid')]);
@ -18,9 +16,9 @@ export default {
{
cwd: process.cwd(),
alias: {
'solid-js': 'solid-js/dist/server.js',
'solid-js/store': 'solid-js/store/dist/server.js',
'solid-js/web': 'solid-js/web/dist/server.js',
'solid-js': 'solid-js/dist/server.js',
},
},
]);
@ -28,4 +26,31 @@ export default {
return options;
},
viteConfig(options) {
// https://github.com/solidjs/vite-plugin-solid
// We inject the dev mode only if the user explicitely wants it or if we are in dev (serve) mode
const replaceDev = options.mode === 'development' || options.command === 'serve';
const nestedDeps = ['solid-js', 'solid-js/web', 'solid-js/store', 'solid-js/html', 'solid-js/h'];
return {
/**
* We only need esbuild on .ts or .js files.
* .tsx & .jsx files are handled by us
*/
esbuild: { include: /\.ts$/ },
resolve: {
conditions: ['solid', ...(replaceDev ? ['development'] : [])],
dedupe: nestedDeps,
alias: [{ find: /^solid-refresh$/, replacement: '/@solid-refresh' }],
},
optimizeDeps: {
include: nestedDeps,
},
ssr: {
external: ['solid-js/web/dist/server.js', 'solid-js/store/dist/server.js', 'solid-js/dist/server.js', 'babel-preset-solid'],
},
};
},
};

View file

@ -11,8 +11,8 @@
},
"dependencies": {
"babel-plugin-module-resolver": "^4.1.0",
"babel-preset-solid": "^1.1.1",
"solid-js": "^1.1.1"
"babel-preset-solid": "^1.1.7",
"solid-js": "^1.1.7"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"

View file

@ -1,4 +1,3 @@
import { createComponent } from 'solid-js';
import { renderToString, ssr, createComponent } from 'solid-js/web/dist/server.js';
function check(Component, props, children) {

View file

@ -4,10 +4,17 @@ export default {
name: '@astrojs/renderer-svelte',
client: './client.js',
server: './server.js',
vitePlugins: [
svelte({
emitCss: true,
compilerOptions: { hydratable: true },
}),
],
viteConfig() {
return {
optimizeDeps: {
include: ['@astrojs/renderer-svelte/client.js', 'svelte', 'svelte/internal'],
},
plugins: [
svelte({
emitCss: true,
compilerOptions: { hydratable: true },
}),
],
};
},
};

View file

@ -10,8 +10,8 @@
"./package.json": "./package.json"
},
"dependencies": {
"@sveltejs/vite-plugin-svelte": "^1.0.0-next.19",
"svelte": "^3.42.3"
"@sveltejs/vite-plugin-svelte": "^1.0.0-next.29",
"svelte": "^3.44.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"

View file

@ -4,6 +4,15 @@ export default {
name: '@astrojs/renderer-vue',
client: './client.js',
server: './server.js',
knownEntrypoints: ['vue', '@vue/server-renderer'],
vitePlugins: [vue()],
viteConfig() {
return {
optimizeDeps: {
include: ['@astrojs/renderer-vue/client.js', 'vue'],
},
plugins: [vue()],
ssr: {
external: ['@vue/server-renderer'],
},
};
},
};

View file

@ -10,10 +10,10 @@
"./package.json": "./package.json"
},
"dependencies": {
"@vitejs/plugin-vue": "^1.6.0",
"@vue/compiler-sfc": "^3.2.6",
"@vue/server-renderer": "^3.2.6",
"vue": "^3.2.6"
"@vitejs/plugin-vue": "^1.9.3",
"@vue/compiler-sfc": "^3.2.20",
"@vue/server-renderer": "^3.2.20",
"vue": "^3.2.20"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"

View file

@ -3,7 +3,7 @@ import { h, createSSRApp } from 'vue';
import StaticHtml from './static-html.js';
function check(Component) {
return Component['ssrRender'];
return !!Component['ssrRender'];
}
async function renderToStaticMarkup(Component, props, children) {

326
yarn.lock
View file

@ -428,7 +428,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-react-jsx@^7.14.5":
"@babel/plugin-transform-react-jsx@^7.14.9":
version "7.14.9"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c"
integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==
@ -470,7 +470,7 @@
debug "^4.1.0"
globals "^11.1.0"
"@babel/types@^7.0.0", "@babel/types@^7.11.5", "@babel/types@^7.12.7", "@babel/types@^7.14.9", "@babel/types@^7.15.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0":
"@babel/types@^7.0.0", "@babel/types@^7.11.5", "@babel/types@^7.12.7", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0":
version "7.15.6"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f"
integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==
@ -1750,10 +1750,10 @@
dotenv "^8.2.0"
dotenv-expand "^5.1.0"
"@sveltejs/vite-plugin-svelte@^1.0.0-next.19":
version "1.0.0-next.24"
resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.24.tgz#55033c27b5f428e804ff64f410a640baacff0333"
integrity sha512-b+n3jcLpk2j/25APQbk5ejCyd0faYTB2bOxR3gY0LX3MFGgdiL8zdf3/aawcPSxLdbL73YVlxNBIATGuvq03uQ==
"@sveltejs/vite-plugin-svelte@^1.0.0-next.29":
version "1.0.0-next.29"
resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.29.tgz#862fadcac164d8e90a45f3248289fbc65382c7df"
integrity sha512-awbeIB34ma/ytoVsG0lxKfFaJ4rjPaAsiepJ5I+dKe9jVjWmGoIMJ9sKD77/xvNdwgO+3v/vkwvIbEG4XRdmtg==
dependencies:
"@rollup/pluginutils" "^4.1.1"
debug "^4.3.2"
@ -2086,109 +2086,100 @@
resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
"@vitejs/plugin-vue@^1.6.0":
version "1.6.2"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-1.6.2.tgz#40dfe314cff610d4dd027a0b4ea2a93a257f3fc9"
integrity sha512-Pf+dqkT4pWPfziPm51VtDXsPwE74CEGRiK6Vgm5EDBewHw1EgcxG7V2ZI/Yqj5gcDy5nVtjgx0AbsTL+F3gddg==
"@vitejs/plugin-vue@^1.9.3":
version "1.9.3"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-1.9.3.tgz#93d61893ce6c723d0209af0483ec8b91a2cd811f"
integrity sha512-yW6H/q+4Mc2PcVjSOelcsMrg/k15DnMUz8jyCFsI04emc3aLwo4AoofUfGnjHUkgirrDxSJLVqQVGhonQ3yykA==
"@vue/compiler-core@3.2.12":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.12.tgz#23998d6986a45e1ab0424130cc0ad00e33da1101"
integrity sha512-IGJ0JmrAaAl5KBBegPAKkoXvsfDFgN/h7K1t/+0MxqpZF1fTDVUOp3tG7q9gWa7fwzGEaIsPhjtT5C3qztdLKg==
"@vue/compiler-core@3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.20.tgz#af5a3c5237818835b0d0be837eb5885a8d21c160"
integrity sha512-vcEXlKXoPwBXFP5aUTHN9GTZaDfwCofa9Yu9bbW2C5O/QSa9Esdt7OG4+0RRd3EHEMxUvEdj4RZrd/KpQeiJbA==
dependencies:
"@babel/parser" "^7.15.0"
"@babel/types" "^7.15.0"
"@vue/shared" "3.2.12"
"@vue/shared" "3.2.20"
estree-walker "^2.0.2"
source-map "^0.6.1"
"@vue/compiler-dom@3.2.12":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.12.tgz#d6ba00114e73adb8b18940c3ff18797cc2b0514f"
integrity sha512-MulvKilA2USm8ubPfvXvNY55HVTn+zHERsXeNg437TXrmM4FRCis6zjWW47QZ3ZyxEkCdqOmuiFCtXbpnuthyw==
"@vue/compiler-dom@3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.20.tgz#8e0ef354449c0faf41519b00bfc2045eae01dcb5"
integrity sha512-QnI77ec/JtV7R0YBbcVayYTDCRcI9OCbxiUQK6izVyqQO0658n0zQuoNwe+bYgtqnvGAIqTR3FShTd5y4oOjdg==
dependencies:
"@vue/compiler-core" "3.2.12"
"@vue/shared" "3.2.12"
"@vue/compiler-core" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/compiler-sfc@^3.2.6":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.12.tgz#39555550d96051508753ba934f7260dc5ee5211e"
integrity sha512-EjzeMQ7H2ICj+JRw2buSFXTocdCg8e5yWQTlNM/6h/u68sTwMbIfiOJBFEwBhG/wCG7Nb6Nnz888AfHTU3hdrA==
"@vue/compiler-sfc@3.2.20", "@vue/compiler-sfc@^3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.20.tgz#2d7668e76f066c566dd7c09c15c9acce4e876e0a"
integrity sha512-03aZo+6tQKiFLfunHKSPZvdK4Jsn/ftRCyaro8AQIWkuxJbvSosbKK6HTTn+D2c3nPScG155akJoxKENw7rftQ==
dependencies:
"@babel/parser" "^7.15.0"
"@babel/types" "^7.15.0"
"@types/estree" "^0.0.48"
"@vue/compiler-core" "3.2.12"
"@vue/compiler-dom" "3.2.12"
"@vue/compiler-ssr" "3.2.12"
"@vue/ref-transform" "3.2.12"
"@vue/shared" "3.2.12"
consolidate "^0.16.0"
"@vue/compiler-core" "3.2.20"
"@vue/compiler-dom" "3.2.20"
"@vue/compiler-ssr" "3.2.20"
"@vue/ref-transform" "3.2.20"
"@vue/shared" "3.2.20"
estree-walker "^2.0.2"
hash-sum "^2.0.0"
lru-cache "^5.1.1"
magic-string "^0.25.7"
merge-source-map "^1.1.0"
postcss "^8.1.10"
postcss-modules "^4.0.0"
postcss-selector-parser "^6.0.4"
source-map "^0.6.1"
"@vue/compiler-ssr@3.2.12":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.12.tgz#32e5d4bc31c371c125b43e9d07b8a8f70442b080"
integrity sha512-sY+VbLQ17FPr1CgirnqEgY+jbC7wI5c2Ma6u8le0+b4UKMYF9urI2pybAZc1nKz6O78FWA3OSnQFxTTLppe+9Q==
"@vue/compiler-ssr@3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.20.tgz#9cceb6261d9932cb5568202610c1c28f86c5e521"
integrity sha512-rzzVVYivm+EjbfiGQvNeyiYZWzr6Hkej97RZLZvcumacQlnKv9176Xo9rRyeWwFbBlxmtNdrVMslRXtipMXk2w==
dependencies:
"@vue/compiler-dom" "3.2.12"
"@vue/shared" "3.2.12"
"@vue/compiler-dom" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/reactivity@3.2.12":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.12.tgz#b482a737cbdc891f9b1ec3100f3c1804b56d080b"
integrity sha512-Lr5CTQjFm5mT/6DGnVNhptmba/Qg1DbD6eNWWmiHLMlpPt4q2ww9A2orEjVw0qNcdTJ04JLPEVAz5jhTZTCfIg==
"@vue/reactivity@3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.20.tgz#81fe1c368e7f20bc0ec1dec1045bbee253582de8"
integrity sha512-nSmoLojUTk+H8HNTAkrUduB4+yIUBK2HPihJo2uXVSH4Spry6oqN6lFzE5zpLK+F27Sja+UqR9R1+/kIOsHV5w==
dependencies:
"@vue/shared" "3.2.12"
"@vue/shared" "3.2.20"
"@vue/ref-transform@3.2.12":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/ref-transform/-/ref-transform-3.2.12.tgz#6f7fa46dd84447ddcf54adfb1b689b1cf4243de0"
integrity sha512-lS7TDda61iSf3ljokXVfN0VbOsQdmpST6MZLjxzBydFCECCJaEAr6o+K8VZ7NhUCSrl+gKXHpdXxmcvwdk66aQ==
"@vue/ref-transform@3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/ref-transform/-/ref-transform-3.2.20.tgz#2a59ec90caf8e5c7336776a0900bff0a8b81c090"
integrity sha512-Y42d3PGlYZ1lXcF3dbd3+qU/C/a3wYEZ949fyOI5ptzkjDWlkfU6vn74fmOjsLjEcjs10BXK2qO99FqQIK2r1Q==
dependencies:
"@babel/parser" "^7.15.0"
"@vue/compiler-core" "3.2.12"
"@vue/shared" "3.2.12"
"@vue/compiler-core" "3.2.20"
"@vue/shared" "3.2.20"
estree-walker "^2.0.2"
magic-string "^0.25.7"
"@vue/runtime-core@3.2.12":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.12.tgz#422662fd5b85f787222d2aea840264ba97e84a13"
integrity sha512-LO+ztgcmsomavYUaSq7BTteh8pmnUmvUnXUFVYdlcg3VCdYRS0ImlclpYsNHqjAk2gU+H09dr2PP0kL961xUfQ==
"@vue/runtime-core@3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.20.tgz#8f63e956a3f88fb772541443c45a7701211012cb"
integrity sha512-d1xfUGhZPfiZzAN7SatStD4vRtT8deJSXib2+Cz3x0brjMWKxe32asQc154FF1E2fFgMCHtnfd4A90bQEzV4GQ==
dependencies:
"@vue/reactivity" "3.2.12"
"@vue/shared" "3.2.12"
"@vue/reactivity" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/runtime-dom@3.2.12":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.12.tgz#d9fe865dca36f9ca33ba327afdeb89ae2aa03f4c"
integrity sha512-+NSDqivgihvoPYbKFDmzFu1tW7SOzwc7r0b7T8vsJtooVPGxwtfAFZ6wyLtteOXXrCpyTR3kpyTCIp31uY7aJg==
"@vue/runtime-dom@3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.20.tgz#8aa56ae6c30f9cd4a71ca0e9ec3c4bdc67148d15"
integrity sha512-4TCvZMLhESWCFHFYgqN4QmMA/onnINAlUovhopjlS8ST27G1A8Z0tyxPzLoXLa+b5JrOpbMPheEMPvdKExTJig==
dependencies:
"@vue/runtime-core" "3.2.12"
"@vue/shared" "3.2.12"
"@vue/runtime-core" "3.2.20"
"@vue/shared" "3.2.20"
csstype "^2.6.8"
"@vue/server-renderer@^3.2.6":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.12.tgz#633160c02a1176687ee4a56d3d1d0dae0b613bb1"
integrity sha512-UaCFshV/NfE0Z73+DuDMaHVBCipvitRo0myA3yO/nm4tyT7L6yz66qIwthR4m4HnBQh/vnEK/3c1v6sS3Q2auA==
"@vue/server-renderer@3.2.20", "@vue/server-renderer@^3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.20.tgz#705e07ae9425132b2b6227d308a51a13f4d4ec81"
integrity sha512-viIbZGep9XabnrRcaxWIi00cOh1x21QYm2upIL5W0zqzTJ54VdTzpI+zi1osNp+VfRQDTHpV2U7H3Kn4ljYJvg==
dependencies:
"@vue/compiler-ssr" "3.2.12"
"@vue/shared" "3.2.12"
"@vue/compiler-ssr" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/shared@3.2.12":
version "3.2.12"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.12.tgz#304064a4b56fc6c7b9169d80e9ee62ecb4bf0a1c"
integrity sha512-5CkaifUCJwcTuru7FDwKFacPJuEoGUTw0LKSa5bw40B23s0TS+MGlYR1285nbV/ju3QUGlA6d6PD+GJkWy7uFg==
"@vue/shared@3.2.20":
version "3.2.20"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.20.tgz#53746961f731a8ea666e3316271e944238dc31db"
integrity sha512-FbpX+hD5BvXCQerEYO7jtAGHlhAkhTQ4KIV73kmLWNlawWhTiVuQxizgVb0BOkX5oG9cIRZ42EG++d/k/Efp0w==
"@web/parse5-utils@^1.3.0":
version "1.3.0"
@ -2592,14 +2583,15 @@ axios@^0.21.1:
dependencies:
follow-redirects "^1.14.0"
babel-plugin-jsx-dom-expressions@^0.29.16:
version "0.29.16"
resolved "https://registry.yarnpkg.com/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.29.16.tgz#12715a418c593a409b1d21b19d1cc9a1bb490081"
integrity sha512-09bLfsWh+J0U0z8QNwmlxvow0yGAACKcuxN6VvAESmVJNn0V4AS3mQA4II795rhCKK0yW7KfYDkUv9fQxUd3OQ==
babel-plugin-jsx-dom-expressions@^0.29.19:
version "0.29.19"
resolved "https://registry.yarnpkg.com/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.29.19.tgz#95a46f2aac0d4c297006b854519edcb7fcc6f813"
integrity sha512-qg1N4S6E3S7I6rgqQE1xWH6p3eZpeDxrr+Al1Ptov0NjM69fKQQfeeAtyq1Q9DjdUOIhe9MGoCVA1X+TzXZzMA==
dependencies:
"@babel/helper-module-imports" "^7.10.4"
"@babel/plugin-syntax-jsx" "^7.10.4"
"@babel/types" "^7.11.5"
html-entities "2.3.2"
babel-plugin-module-resolver@^4.1.0:
version "4.1.0"
@ -2612,12 +2604,12 @@ babel-plugin-module-resolver@^4.1.0:
reselect "^4.0.0"
resolve "^1.13.1"
babel-preset-solid@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/babel-preset-solid/-/babel-preset-solid-1.1.3.tgz#0d4a4d6855c93ab2775bf929f86f2ed1e97d79ae"
integrity sha512-I27j40FJQ6T1Y4Is3E2XXXgW6uyl6EhOavon75eRuN8J0j5koSi7VhoslSjZffYCUixZLTIuM44/Bg2BJsT9hg==
babel-preset-solid@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/babel-preset-solid/-/babel-preset-solid-1.1.7.tgz#61a699ebcea34a19adfdd9f637f03861f0c3f90e"
integrity sha512-OzteGVVg/3m3DC7Mo589m8KyyBZ6qO7JFhLHRusC0G/Xi6VukfKJZOpUkXGI4P7RDyLIANG3jqGVvzsjoLnihw==
dependencies:
babel-plugin-jsx-dom-expressions "^0.29.16"
babel-plugin-jsx-dom-expressions "^0.29.19"
bail@^1.0.0:
version "1.0.5"
@ -2682,17 +2674,12 @@ bhttp@^1.2.1:
through2-spy "^1.2.0"
tough-cookie "^2.3.1"
big.js@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
bluebird@3.7.2, bluebird@^3.7.2:
bluebird@3.7.2:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@ -3399,13 +3386,6 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
consolidate@^0.16.0:
version "0.16.0"
resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16"
integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==
dependencies:
bluebird "^3.7.2"
content-disposition@~0.5.2:
version "0.5.3"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
@ -3990,11 +3970,6 @@ emoji-regex@^9.2.2:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
emojis-list@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
encodeurl@^1.0.2, encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@ -5067,13 +5042,6 @@ gauge@~2.7.3:
strip-ansi "^3.0.1"
wide-align "^1.1.0"
generic-names@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872"
integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==
dependencies:
loader-utils "^1.1.0"
gensync@^1.0.0-beta.1, 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"
@ -5397,11 +5365,6 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
hash-sum@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
hast-to-hyperscript@^10.0.0:
version "10.0.1"
resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-10.0.1.tgz#3decd7cb4654bca8883f6fcbd4fb3695628c4296"
@ -5586,7 +5549,7 @@ hsla-regex@^1.0.0:
resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
html-entities@^2.3.2:
html-entities@2.3.2, html-entities@^2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488"
integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==
@ -5749,16 +5712,6 @@ iconv-lite@^0.6.2:
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
icss-replace-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
icss-utils@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
ignore-walk@^3.0.3:
version "3.0.4"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335"
@ -6357,13 +6310,6 @@ json5@^0.5.1:
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
json5@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
dependencies:
minimist "^1.2.0"
json5@^2.1.2:
version "2.2.0"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
@ -6657,15 +6603,6 @@ load-yaml-file@^0.2.0:
pify "^4.0.1"
strip-bom "^3.0.0"
loader-utils@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
dependencies:
big.js "^5.2.2"
emojis-list "^3.0.0"
json5 "^1.0.1"
locate-character@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-2.0.5.tgz#f2d2614d49820ecb3c92d80d193b8db755f74c0f"
@ -6706,11 +6643,6 @@ lodash._reinterpolate@^3.0.0:
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
lodash.clonedeep@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
@ -7096,13 +7028,6 @@ meow@^8.0.0:
type-fest "^0.18.0"
yargs-parser "^20.2.3"
merge-source-map@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==
dependencies:
source-map "^0.6.1"
merge-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
@ -8691,48 +8616,6 @@ postcss-load-config@^3.1.0:
lilconfig "^2.0.3"
yaml "^1.10.2"
postcss-modules-extract-imports@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d"
integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==
postcss-modules-local-by-default@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c"
integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==
dependencies:
icss-utils "^5.0.0"
postcss-selector-parser "^6.0.2"
postcss-value-parser "^4.1.0"
postcss-modules-scope@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06"
integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==
dependencies:
postcss-selector-parser "^6.0.4"
postcss-modules-values@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c"
integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==
dependencies:
icss-utils "^5.0.0"
postcss-modules@^4.0.0:
version "4.2.2"
resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.2.2.tgz#5e7777c5a8964ea176919d90b2e54ef891321ce5"
integrity sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg==
dependencies:
generic-names "^2.0.1"
icss-replace-symbols "^1.1.0"
lodash.camelcase "^4.3.0"
postcss-modules-extract-imports "^3.0.0"
postcss-modules-local-by-default "^4.0.0"
postcss-modules-scope "^3.0.0"
postcss-modules-values "^4.0.0"
string-hash "^1.1.1"
postcss-nested@5.0.6:
version "5.0.6"
resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc"
@ -8740,7 +8623,7 @@ postcss-nested@5.0.6:
dependencies:
postcss-selector-parser "^6.0.6"
postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6:
postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6:
version "6.0.6"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea"
integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==
@ -8783,10 +8666,10 @@ preact-render-to-string@^5.1.19:
dependencies:
pretty-format "^3.8.0"
preact@^10.5.14:
version "10.5.14"
resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.14.tgz#0b14a2eefba3c10a57116b90d1a65f5f00cd2701"
integrity sha512-KojoltCrshZ099ksUZ2OQKfbH66uquFoxHSbnwKbTJHeQNvx42EmC7wQVWNuDt6vC5s3nudRHFtKbpY4ijKlaQ==
preact@^10.5.15:
version "10.5.15"
resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.15.tgz#6df94d8afecf3f9e10a742fd8c362ddab464225f"
integrity sha512-5chK29n6QcJc3m1lVrKQSQ+V7K1Gb8HeQY6FViQ5AxCAEGu3DaHffWNDkC9+miZgsLvbvU9rxbV1qinGHMHzqA==
preferred-pm@^3.0.0:
version "3.0.3"
@ -9868,10 +9751,10 @@ socks@^2.3.3, socks@^2.6.1:
ip "^1.1.5"
smart-buffer "^4.1.0"
solid-js@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/solid-js/-/solid-js-1.1.4.tgz#ceba54d6b60f66692f8a072fb7419e94cfbcdd65"
integrity sha512-u3rvemWTQQ1ab9YrrRR+bUi7Daq5ZRVlR6gEDsHrRYC5uYFkFGGRt/ibjo+OsBxjbPRxGzy7jel3mfTZiiuNzA==
solid-js@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/solid-js/-/solid-js-1.1.7.tgz#e9518be0447678344e92e902cbca5311299b66b8"
integrity sha512-+zZOdR++hFJ/dEmAaHjyI5/tPqRdItOVKsnLuBOKajCqG0n/Bs3uc8xWf8CiYTI7OIwSt5A6ASM8KDoKehfs6w==
sort-keys@^2.0.0:
version "2.0.0"
@ -10079,11 +9962,6 @@ strict-uri-encode@^2.0.0:
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
string-hash@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@ -10314,10 +10192,10 @@ svelte-hmr@^0.14.7:
resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.14.7.tgz#7fa8261c7b225d9409f0a86f3b9ea5c3ca6f6607"
integrity sha512-pDrzgcWSoMaK6AJkBWkmgIsecW0GChxYZSZieIYfCP0v2oPyx2CYU/zm7TBIcjLVUPP714WxmViE9Thht4etog==
svelte@^3.42.3:
version "3.42.6"
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.42.6.tgz#45a534d76fcdb551a2f23abf2cfee648fa248d03"
integrity sha512-lAcryr9Do2PeGtbodspX5I4kWj4yWYAa2WGpDCwzNkP3y8WZTxigMd4/TMO1rBZEOkMYGn4ZXrbAlSEGhK6q3w==
svelte@^3.44.0:
version "3.44.0"
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.44.0.tgz#e6176cb3ad93846ddb4140e93f43098136b23f3b"
integrity sha512-zWACSJBSncGiDvFfYOMFGNV5zDLOlyhftmO5yOZ0lEtQMptpElaRtl39MWz1+lYCpwUq4F3Q2lTzI9TrTL+eMA==
tailwindcss@^2.2.17:
version "2.2.17"
@ -11238,14 +11116,16 @@ vscode-uri@^3.0.2:
resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0"
integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA==
vue@^3.2.6:
version "3.2.12"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.12.tgz#b44f55506fb6a7c4b65635e609deb5f9368aa2ce"
integrity sha512-VV14HtubmB56uuQaSvLkJZgoocPiN8CJI3zZA9y8h7q/Z5hcknDIFkbq5d8ku0ukZ6AJPQqMsZWcq0qryF0jgg==
vue@^3.2.20:
version "3.2.20"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.20.tgz#940f8aa8bf3e3be78243ca582bad41fcd45ae3e6"
integrity sha512-81JjEP4OGk9oO8+CU0h2nFPGgJBm9mNa3kdCX2k6FuRdrWrC+CNe+tOnuIeTg8EWwQuI+wwdra5Q7vSzp7p4Iw==
dependencies:
"@vue/compiler-dom" "3.2.12"
"@vue/runtime-dom" "3.2.12"
"@vue/shared" "3.2.12"
"@vue/compiler-dom" "3.2.20"
"@vue/compiler-sfc" "3.2.20"
"@vue/runtime-dom" "3.2.20"
"@vue/server-renderer" "3.2.20"
"@vue/shared" "3.2.20"
wait-on@6.0.0:
version "6.0.0"