Fix Windows CSS bundling bug (#1840)

* Fix Windows CSS bundling bug

JS components’ styles accidentally left out of final build on Windows

* Review feedback
This commit is contained in:
Drew Powers 2021-11-16 13:59:41 -07:00 committed by GitHub
parent d9265df0e9
commit 3cd1458aa7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 297 additions and 247 deletions

View file

@ -0,0 +1,10 @@
---
'astro': patch
'@astrojs/renderer-preact': patch
'@astrojs/renderer-react': patch
'@astrojs/renderer-solid': patch
'@astrojs/renderer-svelte': patch
'@astrojs/renderer-vue': patch
---
Bugfix: Bundled CSS missing files on Windows

View file

@ -1,15 +1,18 @@
import type vite from '../../../vendor/vite';
import { fileURLToPath } from 'url';
import path from 'path';
import slash from 'slash';
// https://vitejs.dev/guide/features.html#css-pre-processors
export const STYLE_EXTENSIONS = new Set(['.css', '.pcss', '.scss', '.sass', '.styl', '.stylus', '.less']);
/** find unloaded styles */
export function getStylesForID(id: string, viteServer: vite.ViteDevServer): Set<string> {
export function getStylesForURL(filePath: URL, viteServer: vite.ViteDevServer): Set<string> {
const css = new Set<string>();
const { idToModuleMap } = viteServer.moduleGraph;
const moduleGraph = idToModuleMap.get(id);
const rootID = slash(fileURLToPath(filePath)); // Vite fix: Windows URLs must have forward slashes
const moduleGraph = idToModuleMap.get(rootID);
if (!moduleGraph) return css;
// recursively crawl module graph to get all style files imported by parent id
@ -27,7 +30,7 @@ export function getStylesForID(id: string, viteServer: vite.ViteDevServer): Set<
scanned.add(importedModule.id);
}
}
crawlCSS(id);
crawlCSS(rootID);
return css;
}

View file

@ -6,9 +6,11 @@ import type { LogOptions } from '../logger';
import fs from 'fs';
import path from 'path';
import slash from 'slash';
import { fileURLToPath } from 'url';
import { renderPage, renderSlot } from '../../runtime/server/index.js';
import { canonicalURL as getCanonicalURL, codeFrame, resolveDependency, viteifyPath } from '../util.js';
import { getStylesForID } from './css.js';
import { getStylesForURL } from './css.js';
import { injectTags } from './html.js';
import { generatePaginateFunction } from './paginate.js';
import { getParams, validateGetStaticPathsModule, validateGetStaticPathsResult } from './routing.js';
@ -215,7 +217,7 @@ export async function render(renderers: Renderer[], mod: ComponentInstance, ssrO
}
// inject CSS
[...getStylesForID(filePath.pathname, viteServer)].forEach((href) => {
[...getStylesForURL(filePath, viteServer)].forEach((href) => {
tags.push({
tag: 'link',
attrs: {
@ -232,7 +234,8 @@ export async function render(renderers: Renderer[], mod: ComponentInstance, ssrO
// run transformIndexHtml() in dev to run Vite dev transformations
if (mode === 'development') {
html = await viteServer.transformIndexHtml(filePath.pathname, html, pathname);
const viteFilePath = slash(fileURLToPath(filePath)); // Vite Windows fix: URLs on Windows have forward slashes (not .pathname, which has a leading '/' on Windows)
html = await viteServer.transformIndexHtml(viteFilePath, html, pathname);
}
return html;

View file

@ -73,5 +73,5 @@ export function resolveDependency(dep: string, astroConfig: AstroConfig) {
}
export function viteifyPath(pathname: string): string {
return `/@fs${pathname}`;
return `/@fs/${pathname.replace(/^\//, '')}`;
}

View file

@ -33,11 +33,13 @@ function isSSR(options: undefined | boolean | { ssr: boolean }): boolean {
/** Transform .astro files for Vite */
export default function astro({ config, devServer }: AstroPluginOptions): vite.Plugin {
let platform: NodeJS.Platform;
let viteTransform: TransformHook;
return {
name: '@astrojs/vite-plugin-astro',
enforce: 'pre', // run transforms before other plugins can
configResolved(resolvedConfig) {
platform = os.platform(); // TODO: remove macOS hack
viteTransform = getViteTransform(resolvedConfig);
},
// note: dont claim .astro files with resolveId() — it prevents Vite from transpiling the final JS (import.meta.globEager, etc.)
@ -82,7 +84,7 @@ export default function astro({ config, devServer }: AstroPluginOptions): vite.P
});
// macOS fix: remove null chars generated by compiler
if (os.platform() === 'darwin') {
if (platform === 'darwin') {
tsResult.code = tsResult.code.replace(/\x00/g, '');
}

View file

@ -5,6 +5,7 @@ import adapter from 'parse5/lib/tree-adapters/default.js';
const hashedLinkRels = ['stylesheet', 'preload'];
const linkRels = [...hashedLinkRels, 'icon', 'manifest', 'apple-touch-icon', 'mask-icon'];
const windowsPathRE = /^[A-Z]:\//;
function getSrcSetUrls(srcset: string) {
if (!srcset) {
@ -54,6 +55,10 @@ function isAsset(node: Element) {
if (!path) {
return false;
}
// Windows fix: if path starts with C:/, avoid URL parsing
if (windowsPathRE.test(path)) {
return true;
}
try {
new URL(path);
return false;

View file

@ -8,6 +8,8 @@ import srcsetParse from 'srcset-parse';
import * as npath from 'path';
import { promises as fs } from 'fs';
import { getAttribute, hasAttribute, getTagName, insertBefore, remove, createScript, createElement, setAttribute } from '@web/parse5-utils';
import slash from 'slash';
import { fileURLToPath } from 'url';
import { addRollupInput } from './add-rollup-input.js';
import { findAssets, findExternalScripts, findInlineScripts, findInlineStyles, getTextContent, isStylesheetLink } from './extract-assets.js';
import { render as ssrRender } from '../core/ssr/index.js';
@ -26,7 +28,12 @@ const ASTRO_EMPTY = '@astro-empty';
const tagsWithSrcSet = new Set(['img', 'source']);
const isAstroInjectedLink = (node: parse5.Element) => isStylesheetLink(node) && getAttribute(node, 'data-astro-injected') === '';
const isBuildableLink = (node: parse5.Element, srcRoot: string) => isAstroInjectedLink(node) || getAttribute(node, 'href')?.startsWith(srcRoot);
const isBuildableLink = (node: parse5.Element, srcRoot: string) => {
if (isAstroInjectedLink(node)) return true;
const href = getAttribute(node, 'href');
if (typeof href !== 'string' || !href.length) return false;
return href.startsWith(srcRoot) || `/${href}`.startsWith(srcRoot); // Windows fix: some paths are missing leading "/"
};
const isBuildableImage = (node: parse5.Element, srcRoot: string) => getTagName(node) === 'img' && getAttribute(node, 'src')?.startsWith(srcRoot);
const hasSrcSet = (node: parse5.Element) => tagsWithSrcSet.has(getTagName(node)) && !!getAttribute(node, 'srcset');
const isHoistedScript = (node: parse5.Element) => getTagName(node) === 'script' && hasAttribute(node, 'hoist');

View file

@ -2,136 +2,141 @@ import { expect } from 'chai';
import cheerio from 'cheerio';
import { loadFixture } from './test-utils.js';
let fixture;
let index$;
let bundledCSS;
before(async () => {
fixture = await loadFixture({
projectRoot: './fixtures/astro-styles-ssr/',
renderers: ['@astrojs/renderer-react', '@astrojs/renderer-svelte', '@astrojs/renderer-vue'],
});
await fixture.build();
// get bundled CSS (will be hashed, hence DOM query)
const html = await fixture.readFile('/index.html');
index$ = cheerio.load(html);
const bundledCSSHREF = index$('link[rel=stylesheet][href^=assets/]').attr('href');
bundledCSS = await fixture.readFile(bundledCSSHREF.replace(/^\/?/, '/'));
});
describe('Styles SSR', () => {
let fixture;
describe('Astro styles', () => {
it('HTML and CSS scoped correctly', async () => {
const $ = index$;
before(async () => {
fixture = await loadFixture({ projectRoot: './fixtures/astro-styles-ssr/' });
await fixture.build();
});
const el1 = $('#dynamic-class');
const el2 = $('#dynamic-vis');
const classes = $('#class').attr('class').split(' ');
const scopedClass = classes.find((name) => /^astro-[A-Za-z0-9-]+/.test(name));
it('Has <link> tags', async () => {
const MUST_HAVE_LINK_TAGS = ['assets/index'];
// 1. check HTML
expect(el1.attr('class')).to.equal(`blue ${scopedClass}`);
expect(el2.attr('class')).to.equal(`visible ${scopedClass}`);
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
for (const href of [...$('link[rel="stylesheet"]')].map((el) => el.attribs.href)) {
const hasTag = MUST_HAVE_LINK_TAGS.some((mustHaveHref) => href.includes(mustHaveHref));
expect(hasTag).to.equal(true);
}
});
it('Has correct CSS classes', async () => {
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
const MUST_HAVE_CLASSES = {
'#react-css': 'react-title',
'#react-modules': 'title', // ⚠️ this should be transformed
'#vue-css': 'vue-title',
'#vue-modules': 'title', // ⚠️ this should also be transformed
'#vue-scoped': 'vue-title', // also has data-v-* property
'#svelte-scoped': 'svelte-title', // also has additional class
};
for (const [selector, className] of Object.entries(MUST_HAVE_CLASSES)) {
const el = $(selector);
if (selector === '#react-modules' || selector === '#vue-modules') {
// this will generate differently on Unix vs Windows. Here we simply test that it has transformed
expect(el.attr('class')).to.match(new RegExp(`^_${className}_[A-Za-z0-9-_]+`)); // className should be transformed, surrounded by underscores and other stuff
} else {
// if this is not a CSS module, it should remain as expected
expect(el.attr('class')).to.include(className);
}
// addl test: Vue Scoped styles should have data-v-* attribute
if (selector === '#vue-scoped') {
const { attribs } = el.get(0);
const scopeId = Object.keys(attribs).find((k) => k.startsWith('data-v-'));
expect(scopeId).to.be.ok;
}
// addl test: Svelte should have another class
if (selector === '#svelte-title') {
expect(el.attr('class')).not.to.equal(className);
}
}
});
it('CSS scoped support in .astro', async () => {
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
const href = '/' + $('link').attr('href');
const raw = await fixture.readFile(href);
let scopedClass;
// test 1: <style> tag in <head> is transformed
const css = raw.replace(/\.astro-[A-Za-z0-9-]+/, (match) => {
scopedClass = match; // get class hash from result
return match;
// 2. check CSS
expect(bundledCSS).to.include(`.blue.${scopedClass}{color:#b0e0e6}.color\\:blue.${scopedClass}{color:#b0e0e6}.visible.${scopedClass}{display:block}`);
});
expect(css).to.include(`.wrapper${scopedClass}{margin-left:auto;margin-right:auto;max-width:1200px}.outer${scopedClass}{color:red}`);
it('No <style> skips scoping', async () => {
const $ = index$;
// test 2: element received .astro-XXXXXX class (this selector will succeed if transformed correctly)
const wrapper = $(`.wrapper${scopedClass}`);
expect(wrapper).to.have.lengthOf(1);
// Astro component without <style> should not include scoped class
expect($('#no-scope').attr('class')).to.equal(undefined);
});
it('Child inheritance', async () => {
const $ = index$;
expect($('#passed-in').attr('class')).to.match(/outer astro-[A-Z0-9]+ astro-[A-Z0-9]+/);
});
it('Using hydrated components adds astro-root styles', async () => {
expect(bundledCSS).to.include('display:contents');
});
});
it('Astro scoped styles', async () => {
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
describe('JSX', () => {
it('CSS', async () => {
const $ = index$;
const el = $('#react-css');
const el1 = $('#dynamic-class');
const el2 = $('#dynamic-vis');
// 1. check HTML
expect(el.attr('class')).to.include('react-title');
let scopedClass;
// 2. check CSS
expect(bundledCSS).to.include('.react-title{');
});
$('#class')
.attr('class')
.replace(/astro-[A-Za-z0-9-]+/, (match) => {
scopedClass = match;
return match;
});
it('CSS Modules', async () => {
const $ = index$;
const el = $('#react-modules');
const classes = el.attr('class').split(' ');
const moduleClass = classes.find((name) => /^_title_[A-Za-z0-9-_]+/.test(name));
// test 1: Astro component has some scoped class
expect(scopedClass).to.be.ok;
// 1. check HTML
expect(el.attr('class')).to.include(moduleClass);
// test 23: children get scoped class
expect(el1.attr('class')).to.equal(`blue ${scopedClass}`);
expect(el2.attr('class')).to.equal(`visible ${scopedClass}`);
const href = '/' + $('link').attr('href');
const css = await fixture.readFile(href);
// test 4: CSS generates as expected
expect(css).to.include(`.blue.${scopedClass}{color:#b0e0e6}.color\\:blue.${scopedClass}{color:#b0e0e6}.visible.${scopedClass}{display:block}`);
// 2. check CSS
expect(bundledCSS).to.include(`.${moduleClass}{`);
});
});
it('Astro scoped styles skipped without <style>', async () => {
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
describe('Vue', () => {
it('CSS', async () => {
const $ = index$;
const el = $('#vue-css');
// test 1: Astro component without <style> should not include scoped class
expect($('#no-scope').attr('class')).to.equal(undefined);
// 1. check HTML
expect(el.attr('class')).to.include('vue-title');
// 2. check CSS
expect(bundledCSS).to.include('.vue-title{');
});
// TODO: fix Vue scoped styles in build bug
it.skip('Scoped styles', async () => {
const $ = index$;
const el = $('#vue-scoped');
// find data-v-* attribute (how Vue CSS scoping works)
const { attribs } = el.get(0);
const scopeId = Object.keys(attribs).find((k) => k.startsWith('data-v-'));
expect(scopeId).to.be.ok;
// 1. check HTML
expect(el.attr('class')).to.include('vue-scoped');
// 2. check CSS
expect(bundledCSS).to.include(`.vue-scoped[${scopeId}]`);
});
it('CSS Modules', async () => {
const $ = index$;
const el = $('#vue-modules');
const classes = el.attr('class').split(' ');
const moduleClass = classes.find((name) => /^_title_[A-Za-z0-9-_]+/.test(name));
// 1. check HTML
expect(el.attr('class')).to.include(moduleClass);
// 2. check CSS
expect(bundledCSS).to.include(`${moduleClass}{`);
});
});
it('Astro scoped styles can be passed to child components', async () => {
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
describe('Svelte', () => {
it('Scoped styles', async () => {
const $ = index$;
const el = $('#svelte-scoped');
const classes = el.attr('class').split(' ');
const scopedClass = classes.find((name) => /^s-[A-Za-z0-9-]+/.test(name));
expect($('#passed-in').attr('class')).to.match(/outer astro-[A-Z0-9]+ astro-[A-Z0-9]+/);
});
// 1. check HTML
expect(el.attr('class')).to.include('svelte-title');
it('Using hydrated components adds astro-root styles', async () => {
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
const href = '/' + $('link').attr('href');
const css = await fixture.readFile(href);
expect(css).to.include('display:contents');
// 2. check CSS
expect(bundledCSS).to.include(`.svelte-title.${scopedClass}`);
});
});
});

View file

@ -1,9 +1,9 @@
<style scoped>
.vue-title {
.vue-scoped {
font-family: cursive;
}
</style>
<template>
<h1 id="vue-scoped" class="vue-title">Vue Scoped CSS</h1>
<h1 id="vue-scoped" class="vue-scoped">Vue Scoped CSS</h1>
</template>

View file

@ -1,7 +1,6 @@
import { expect } from 'chai';
import cheerio from 'cheerio';
import eol from 'eol';
import os from 'os';
import { loadFixture } from './test-utils.js';
const PREFIXED_CSS = `{-webkit-appearance:none;-moz-appearance:none;appearance:none}`;
@ -36,20 +35,14 @@ describe('PostCSS', () => {
});
it('works in JSX', () => {
// TODO: fix in Windows
if (os.platform() === 'win32') return;
expect(bundledCSS).to.match(new RegExp(`.solid${PREFIXED_CSS}`));
});
it('works in Vue', () => {
// TODO: fix in Windows
if (os.platform() === 'win32') return;
expect(bundledCSS).to.match(new RegExp(`.vue${PREFIXED_CSS}`));
});
it('works in Svelte', () => {
// TODO: fix in Windows
if (os.platform() === 'win32') return;
expect(bundledCSS).to.match(new RegExp(`.svelte.s[^{]+${PREFIXED_CSS}`));
});

View file

@ -11,7 +11,7 @@
"./package.json": "./package.json"
},
"dependencies": {
"@babel/plugin-transform-react-jsx": "^7.14.9",
"@babel/plugin-transform-react-jsx": "^7.16.0",
"preact": "^10.5.15",
"preact-render-to-string": "^5.1.19"
},

View file

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

View file

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

View file

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

View file

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

240
yarn.lock
View file

@ -230,12 +230,12 @@
jsesc "^2.5.1"
source-map "^0.5.0"
"@babel/helper-annotate-as-pure@^7.14.5":
version "7.15.4"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835"
integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==
"@babel/helper-annotate-as-pure@^7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d"
integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==
dependencies:
"@babel/types" "^7.15.4"
"@babel/types" "^7.16.0"
"@babel/helper-compilation-targets@^7.15.4":
version "7.15.4"
@ -277,13 +277,20 @@
dependencies:
"@babel/types" "^7.15.4"
"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4":
"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.15.4":
version "7.15.4"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f"
integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==
dependencies:
"@babel/types" "^7.15.4"
"@babel/helper-module-imports@^7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3"
integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==
dependencies:
"@babel/types" "^7.16.0"
"@babel/helper-module-transforms@^7.12.1":
version "7.15.7"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226"
@ -407,13 +414,20 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-jsx@^7.10.4", "@babel/plugin-syntax-jsx@^7.14.5":
"@babel/plugin-syntax-jsx@^7.10.4":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201"
integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-jsx@^7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1"
integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-object-rest-spread@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
@ -428,16 +442,16 @@
dependencies:
"@babel/helper-plugin-utils" "^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==
"@babel/plugin-transform-react-jsx@^7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz#55b797d4960c3de04e07ad1c0476e2bc6a4889f1"
integrity sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==
dependencies:
"@babel/helper-annotate-as-pure" "^7.14.5"
"@babel/helper-module-imports" "^7.14.5"
"@babel/helper-annotate-as-pure" "^7.16.0"
"@babel/helper-module-imports" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-jsx" "^7.14.5"
"@babel/types" "^7.14.9"
"@babel/plugin-syntax-jsx" "^7.16.0"
"@babel/types" "^7.16.0"
"@babel/runtime@^7.10.4", "@babel/runtime@^7.5.5":
version "7.15.4"
@ -470,7 +484,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.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.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==
@ -478,6 +492,14 @@
"@babel/helper-validator-identifier" "^7.14.9"
to-fast-properties "^2.0.0"
"@babel/types@^7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba"
integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==
dependencies:
"@babel/helper-validator-identifier" "^7.15.7"
to-fast-properties "^2.0.0"
"@changesets/apply-release-plan@^5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-5.0.1.tgz#ed3e30550f787ef1b72f0a51e29a54d244123109"
@ -1765,10 +1787,10 @@
dotenv "^8.2.0"
dotenv-expand "^5.1.0"
"@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==
"@sveltejs/vite-plugin-svelte@^1.0.0-next.30":
version "1.0.0-next.30"
resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.30.tgz#a6cd181bb406d590c1fa8d480c55950d567689f9"
integrity sha512-YQqdMxjL1VgSFk4/+IY3yLwuRRapPafPiZTiaGEq1psbJYSNYUWx9F1zMm32GMsnogg3zn99mGJOqe3ld3HZSg==
dependencies:
"@rollup/pluginutils" "^4.1.1"
debug "^4.3.2"
@ -2111,100 +2133,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.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==
"@vitejs/plugin-vue@^1.9.4":
version "1.9.4"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-1.9.4.tgz#4f48485432cbb986a9fb9d254dc33ce30ddccbfa"
integrity sha512-0CZqaCoChriPTTtGkERy1LGPcYjGFpi2uYRhBPIkqJqUGV5JnJFhQAgh6oH9j5XZHfrRaisX8W0xSpO4T7S78A==
"@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==
"@vue/compiler-core@3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.22.tgz#5e3d3b983cc7f430ddbc6a8773c872dcf410dc89"
integrity sha512-uAkovrVeTcjzpiM4ECmVaMrv/bjdgAaLzvjcGqQPBEyUrcqsCgccT9fHJ/+hWVGhyMahmBwLqcn4guULNx7sdw==
dependencies:
"@babel/parser" "^7.15.0"
"@vue/shared" "3.2.20"
"@vue/shared" "3.2.22"
estree-walker "^2.0.2"
source-map "^0.6.1"
"@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==
"@vue/compiler-dom@3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.22.tgz#221cc358a6c0651c04e1dd22a8470b21e56ee1a5"
integrity sha512-VZdsw/VuO1ODs8K7NQwnMQzKITDkIFlYYC03SVnunuf6eNRxBPEonSyqbWNoo6qNaHAEBTG6VVcZC5xC9bAx1g==
dependencies:
"@vue/compiler-core" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/compiler-core" "3.2.22"
"@vue/shared" "3.2.22"
"@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==
"@vue/compiler-sfc@3.2.22", "@vue/compiler-sfc@^3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.22.tgz#ffd0e5e35479b6ade18d12fefec369cbaf2f7718"
integrity sha512-tWRQ5ge1tsTDhUwHgueicKJ8rYm6WUVAPTaIpFW3GSwZKcOEJ2rXdfkHFShNVGupeRALz2ET2H84OL0GeRxY0A==
dependencies:
"@babel/parser" "^7.15.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"
"@vue/compiler-core" "3.2.22"
"@vue/compiler-dom" "3.2.22"
"@vue/compiler-ssr" "3.2.22"
"@vue/ref-transform" "3.2.22"
"@vue/shared" "3.2.22"
estree-walker "^2.0.2"
magic-string "^0.25.7"
postcss "^8.1.10"
source-map "^0.6.1"
"@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==
"@vue/compiler-ssr@3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.22.tgz#23552c31b76b45baf5f244713c81d77ab59447d2"
integrity sha512-Cl6aoLJtXzzBkk1sKod8S0WBJLts3+ugVC91d22gGpbkw/64WnF12tOZi7Rg54PPLi1NovqyNWPsLH/SAFcu+w==
dependencies:
"@vue/compiler-dom" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/compiler-dom" "3.2.22"
"@vue/shared" "3.2.22"
"@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==
"@vue/reactivity@3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.22.tgz#88655c0b4febc561136e6550e329039f860caa0a"
integrity sha512-xNkLAItjI0xB+lFeDgKCrSItmrHTaAzSnt8LmdSCPQnDyarmzbi/u4ESQnckWvlL7lSRKiEaOvblaNyqAa7OnQ==
dependencies:
"@vue/shared" "3.2.20"
"@vue/shared" "3.2.22"
"@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==
"@vue/ref-transform@3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/ref-transform/-/ref-transform-3.2.22.tgz#16b03994eac71528cceff4cf76178ed9b44ac90a"
integrity sha512-qalVWbq5xWWxLZ0L9OroBg/JZhzavQuCcDXblfErxyDEH6Xc5gIJ4feo1SVCICFzhAUgLgQTdSFLpgjBawbFpw==
dependencies:
"@babel/parser" "^7.15.0"
"@vue/compiler-core" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/compiler-core" "3.2.22"
"@vue/shared" "3.2.22"
estree-walker "^2.0.2"
magic-string "^0.25.7"
"@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==
"@vue/runtime-core@3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.22.tgz#111f1bc97f20249e05ca2189856d99c82d72de32"
integrity sha512-e7WOC55wmHPvmoVUk9VBe/Z9k5bJfWJfVIlkUkiADJn0bOgQD29oh/GS14Kb3aEJXIHLI17Em6+HxNut1sIh7Q==
dependencies:
"@vue/reactivity" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/reactivity" "3.2.22"
"@vue/shared" "3.2.22"
"@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==
"@vue/runtime-dom@3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.22.tgz#c11d75dd51375ee4c74e339f6523ca05e37faa37"
integrity sha512-w7VHYJoliLRTLc5beN77wxuOjla4v9wr2FF22xpZFYBmH4U1V7HkYhoHc1BTuNghI15CXT1tNIMhibI1nrQgdw==
dependencies:
"@vue/runtime-core" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/runtime-core" "3.2.22"
"@vue/shared" "3.2.22"
csstype "^2.6.8"
"@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==
"@vue/server-renderer@3.2.22", "@vue/server-renderer@^3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.22.tgz#049c91a495cb0fcdac02dec485c31cb99410885f"
integrity sha512-jCwbQgKPXiXoH9VS9F7K+gyEvEMrjutannwEZD1R8fQ9szmOTqC+RRbIY3Uf2ibQjZtZ8DV9a4FjxICvd9zZlQ==
dependencies:
"@vue/compiler-ssr" "3.2.20"
"@vue/shared" "3.2.20"
"@vue/compiler-ssr" "3.2.22"
"@vue/shared" "3.2.22"
"@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==
"@vue/shared@3.2.22":
version "3.2.22"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.22.tgz#26dcbe5e530f6c1f2de5ca9aeab92ab00f523b41"
integrity sha512-qWVav014mpjEtbWbEgl0q9pEyrrIySKum8UVYjwhC6njrKzknLZPvfuYdQyVbApsqr94tf/3dP4pCuZmmjdCWQ==
"@web/parse5-utils@^1.3.0":
version "1.3.0"
@ -2598,10 +2620,10 @@ axios@^0.21.1:
dependencies:
follow-redirects "^1.14.0"
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==
babel-plugin-jsx-dom-expressions@^0.30.7:
version "0.30.7"
resolved "https://registry.yarnpkg.com/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.30.7.tgz#8afdd295aaec986cc1bb7a780ff907901ae0f2bb"
integrity sha512-WRBzOtsG6mGnJ1JPlycdDnHN9bO0iza20a86K3R9LN0uY12VlKjZvb47aUCPnzfwWf6H7QPXWj7WK8gQTZQEfg==
dependencies:
"@babel/helper-module-imports" "^7.10.4"
"@babel/plugin-syntax-jsx" "^7.10.4"
@ -2619,12 +2641,12 @@ babel-plugin-module-resolver@^4.1.0:
reselect "^4.0.0"
resolve "^1.13.1"
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==
babel-preset-solid@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/babel-preset-solid/-/babel-preset-solid-1.2.3.tgz#42c49ecc5bd35d465d3f0a4feb8a3ec6e71c37bf"
integrity sha512-GX9UorhcjFScZFl7MoYZbZoYnvafa+76R1vCiM38D5CduF1vNIni17ZlGXt+0PqCv7mlv2cppDFLXNTkvMQxmA==
dependencies:
babel-plugin-jsx-dom-expressions "^0.29.19"
babel-plugin-jsx-dom-expressions "^0.30.7"
bail@^1.0.0:
version "1.0.5"
@ -9829,10 +9851,10 @@ socks@^2.3.3, socks@^2.6.1:
ip "^1.1.5"
smart-buffer "^4.1.0"
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==
solid-js@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/solid-js/-/solid-js-1.2.3.tgz#5f1ef6559465d453d392b3f221b2f36f80ee0154"
integrity sha512-HQv7F23wSQRIuD0gNF3L1/0MHkTEia7J9Oc4VcEeLjAenkqz89tFkztBIp0PABDqK83fxzcixhSXx0xLv4lNAQ==
sort-keys@^2.0.0:
version "2.0.0"
@ -10267,10 +10289,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.44.0:
version "3.44.0"
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.44.0.tgz#e6176cb3ad93846ddb4140e93f43098136b23f3b"
integrity sha512-zWACSJBSncGiDvFfYOMFGNV5zDLOlyhftmO5yOZ0lEtQMptpElaRtl39MWz1+lYCpwUq4F3Q2lTzI9TrTL+eMA==
svelte@^3.44.1:
version "3.44.1"
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.44.1.tgz#5cc772a8340f4519a4ecd1ac1a842325466b1a63"
integrity sha512-4DrCEJoBvdR689efHNSxIQn2pnFwB7E7j2yLEJtHE/P8hxwZWIphCtJ8are7bjl/iVMlcEf5uh5pJ68IwR09vQ==
tailwindcss@^2.2.19:
version "2.2.19"
@ -11201,16 +11223,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.20:
version "3.2.20"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.20.tgz#940f8aa8bf3e3be78243ca582bad41fcd45ae3e6"
integrity sha512-81JjEP4OGk9oO8+CU0h2nFPGgJBm9mNa3kdCX2k6FuRdrWrC+CNe+tOnuIeTg8EWwQuI+wwdra5Q7vSzp7p4Iw==
vue@^3.2.22:
version "3.2.22"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.22.tgz#46e4dd89e98cc4b851ae1eb35f00ced413a34bb7"
integrity sha512-KD5nZpXVZquOC6926Xnp3zOvswrUyO9Rya7ZUoxWFQEjFDW4iACtwzubRB4Um2Om9kj6CaJOqAVRDSFlqLpdgw==
dependencies:
"@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"
"@vue/compiler-dom" "3.2.22"
"@vue/compiler-sfc" "3.2.22"
"@vue/runtime-dom" "3.2.22"
"@vue/server-renderer" "3.2.22"
"@vue/shared" "3.2.22"
wait-on@6.0.0:
version "6.0.0"