diff --git a/.bluprintrc b/.bluprintrc index e99d0af..217a4bb 100644 --- a/.bluprintrc +++ b/.bluprintrc @@ -56,7 +56,7 @@ "assetinfo.json", "jsconfig.json", "package.json", - "svelte.config.cjs" + "svelte.config.js" ] }, "mergeJson": true diff --git a/.eslintrc.cjs b/.eslintrc.cjs index e2a15d7..aefef38 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,5 +1,6 @@ module.exports = { root: true, + ignorePatterns: ['svelte.config.js'], extends: ['standard'], plugins: ['svelte3'], env: { diff --git a/.svelte-kit/dev/components/error.svelte b/.svelte-kit/dev/components/error.svelte new file mode 100644 index 0000000..6d507d9 --- /dev/null +++ b/.svelte-kit/dev/components/error.svelte @@ -0,0 +1,25 @@ + + + + +

{status}

+ +

{error.message}

+ + +{#if error.stack} +
{error.stack}
+{/if} diff --git a/.svelte-kit/dev/components/layout.svelte b/.svelte-kit/dev/components/layout.svelte new file mode 100644 index 0000000..4fa864c --- /dev/null +++ b/.svelte-kit/dev/components/layout.svelte @@ -0,0 +1 @@ + diff --git a/.svelte-kit/dev/generated/manifest.js b/.svelte-kit/dev/generated/manifest.js new file mode 100644 index 0000000..8f734e3 --- /dev/null +++ b/.svelte-kit/dev/generated/manifest.js @@ -0,0 +1,26 @@ +const c = [ + () => import('../components/layout.svelte'), + () => import('../components/error.svelte'), + () => import('../../../pages/index.svelte'), + () => import('../../../pages/embed-previewer/index.svelte'), + () => import('../../../pages/embeds/en/chart.svelte'), + () => import('../../../pages/embeds/en/page.svelte'), +]; + +const d = decodeURIComponent; + +export const routes = [ + // pages/index.svelte + [/^\/$/, [c[0], c[2]], [c[1]]], + + // pages/embed-previewer/index.svelte + [/^\/embed-previewer\/?$/, [c[0], c[3]], [c[1]]], + + // pages/embeds/en/chart.svelte + [/^\/embeds\/en\/chart\/?$/, [c[0], c[4]], [c[1]]], + + // pages/embeds/en/page.svelte + [/^\/embeds\/en\/page\/?$/, [c[0], c[5]], [c[1]]], +]; + +export const fallback = [c[0](), c[1]()]; diff --git a/.svelte-kit/dev/generated/root.svelte b/.svelte-kit/dev/generated/root.svelte new file mode 100644 index 0000000..3afad68 --- /dev/null +++ b/.svelte-kit/dev/generated/root.svelte @@ -0,0 +1,66 @@ + + + + + {#if components[1]} + + {#if components[2]} + + {/if} + + {/if} + + +{#if mounted} +
+ {#if navigated} + {title} + {/if} +
+{/if} + + diff --git a/.svelte-kit/dev/runtime/app/env.js b/.svelte-kit/dev/runtime/app/env.js new file mode 100644 index 0000000..4e7330c --- /dev/null +++ b/.svelte-kit/dev/runtime/app/env.js @@ -0,0 +1,16 @@ +export { prerendering } from '../env.js'; + +/** + * @type {import('$app/env').browser} + */ +const browser = !import.meta.env.SSR; +/** + * @type {import('$app/env').dev} + */ +const dev = !!import.meta.env.DEV; +/** + * @type {import('$app/env').amp} + */ +const amp = !!import.meta.env.VITE_SVELTEKIT_AMP; + +export { amp, browser, dev }; diff --git a/.svelte-kit/dev/runtime/app/navigation.js b/.svelte-kit/dev/runtime/app/navigation.js new file mode 100644 index 0000000..3cea837 --- /dev/null +++ b/.svelte-kit/dev/runtime/app/navigation.js @@ -0,0 +1,59 @@ +import { router } from '../internal/singletons.js'; +import { g as get_base_uri } from '../chunks/utils.js'; + +/** + * @param {string} name + */ +function guard(name) { + return () => { + throw new Error(`Cannot call ${name}(...) on the server`); + }; +} + +const goto = import.meta.env.SSR ? guard('goto') : goto_; +const invalidate = import.meta.env.SSR ? guard('invalidate') : invalidate_; +const prefetch = import.meta.env.SSR ? guard('prefetch') : prefetch_; +const prefetchRoutes = import.meta.env.SSR + ? guard('prefetchRoutes') + : prefetchRoutes_; + +/** + * @type {import('$app/navigation').goto} + */ +async function goto_(href, opts) { + return router.goto(href, opts, []); +} + +/** + * @type {import('$app/navigation').invalidate} + */ +async function invalidate_(resource) { + const { href } = new URL(resource, location.href); + return router.renderer.invalidate(href); +} + +/** + * @type {import('$app/navigation').prefetch} + */ +function prefetch_(href) { + return router.prefetch(new URL(href, get_base_uri(document))); +} + +/** + * @type {import('$app/navigation').prefetchRoutes} + */ +async function prefetchRoutes_(pathnames) { + const matching = pathnames + ? router.routes.filter((route) => + pathnames.some((pathname) => route[0].test(pathname)) + ) + : router.routes; + + const promises = matching.map( + (r) => r.length !== 1 && Promise.all(r[1].map((load) => load())) + ); + + await Promise.all(promises); +} + +export { goto, invalidate, prefetch, prefetchRoutes }; diff --git a/.svelte-kit/dev/runtime/app/paths.js b/.svelte-kit/dev/runtime/app/paths.js new file mode 100644 index 0000000..7ed4fff --- /dev/null +++ b/.svelte-kit/dev/runtime/app/paths.js @@ -0,0 +1 @@ +export { assets, base } from '../paths.js'; diff --git a/.svelte-kit/dev/runtime/app/stores.js b/.svelte-kit/dev/runtime/app/stores.js new file mode 100644 index 0000000..60ffc0d --- /dev/null +++ b/.svelte-kit/dev/runtime/app/stores.js @@ -0,0 +1,89 @@ +import { getContext } from 'svelte'; + +// const ssr = (import.meta as any).env.SSR; +const ssr = typeof window === 'undefined'; // TODO why doesn't previous line work in build? + +// TODO remove this (for 1.0? after 1.0?) +let warned = false; +function stores() { + if (!warned) { + console.error('stores() is deprecated; use getStores() instead'); + warned = true; + } + return getStores(); +} + +/** + * @type {import('$app/stores').getStores} + */ +const getStores = () => { + const stores = getContext('__svelte__'); + + return { + page: { + subscribe: stores.page.subscribe, + }, + navigating: { + subscribe: stores.navigating.subscribe, + }, + // @ts-ignore - deprecated, not part of type definitions, but still callable + get preloading() { + console.error( + 'stores.preloading is deprecated; use stores.navigating instead' + ); + return { + subscribe: stores.navigating.subscribe, + }; + }, + session: stores.session, + }; +}; + +/** @type {typeof import('$app/stores').page} */ +const page = { + /** @param {(value: any) => void} fn */ + subscribe(fn) { + const store = getStores().page; + return store.subscribe(fn); + }, +}; + +/** @type {typeof import('$app/stores').navigating} */ +const navigating = { + /** @param {(value: any) => void} fn */ + subscribe(fn) { + const store = getStores().navigating; + return store.subscribe(fn); + }, +}; + +/** @param {string} verb */ +const error = (verb) => { + throw new Error( + ssr + ? `Can only ${verb} session store in browser` + : `Cannot ${verb} session store before subscribing` + ); +}; + +/** @type {typeof import('$app/stores').session} */ +const session = { + subscribe(fn) { + const store = getStores().session; + + if (!ssr) { + session.set = store.set; + session.update = store.update; + } + + return store.subscribe(fn); + }, + set: (value) => { + error('set'); + }, + update: (updater) => { + error('update'); + }, +}; + +export { getStores, navigating, page, session, stores }; diff --git a/.svelte-kit/dev/runtime/chunks/utils.js b/.svelte-kit/dev/runtime/chunks/utils.js new file mode 100644 index 0000000..0accb73 --- /dev/null +++ b/.svelte-kit/dev/runtime/chunks/utils.js @@ -0,0 +1,13 @@ +/** @param {HTMLDocument} doc */ +function get_base_uri(doc) { + let baseURI = doc.baseURI; + + if (!baseURI) { + const baseTags = doc.getElementsByTagName('base'); + baseURI = baseTags.length ? baseTags[0].href : doc.URL; + } + + return baseURI; +} + +export { get_base_uri as g }; diff --git a/.svelte-kit/dev/runtime/env.js b/.svelte-kit/dev/runtime/env.js new file mode 100644 index 0000000..61d0f99 --- /dev/null +++ b/.svelte-kit/dev/runtime/env.js @@ -0,0 +1,8 @@ +let prerendering = false; + +/** @param {boolean} value */ +function set_prerendering(value) { + prerendering = value; +} + +export { prerendering, set_prerendering }; diff --git a/.svelte-kit/dev/runtime/internal/singletons.js b/.svelte-kit/dev/runtime/internal/singletons.js new file mode 100644 index 0000000..15eed78 --- /dev/null +++ b/.svelte-kit/dev/runtime/internal/singletons.js @@ -0,0 +1,20 @@ +/** @type {import('./router').Router} */ +let router; + +/** @type {string} */ +let base = ''; + +/** @type {string} */ +let assets = '/.'; + +/** @param {import('./router').Router} _ */ +function init(_) { + router = _; +} + +/** @param {{ base: string, assets: string }} paths */ +function set_paths(paths) { + ({ base, assets } = paths); +} + +export { assets, base, init, router, set_paths }; diff --git a/.svelte-kit/dev/runtime/internal/start.js b/.svelte-kit/dev/runtime/internal/start.js new file mode 100644 index 0000000..266582b --- /dev/null +++ b/.svelte-kit/dev/runtime/internal/start.js @@ -0,0 +1,1099 @@ +import Root from '../../generated/root.svelte'; +import { routes, fallback } from '../../generated/manifest.js'; +import { g as get_base_uri } from '../chunks/utils.js'; +import { writable } from 'svelte/store'; +import { init } from './singletons.js'; +import { set_paths } from '../paths.js'; + +function scroll_state() { + return { + x: pageXOffset, + y: pageYOffset, + }; +} + +/** + * @param {Node} node + * @returns {HTMLAnchorElement | SVGAElement} + */ +function find_anchor(node) { + while (node && node.nodeName.toUpperCase() !== 'A') node = node.parentNode; // SVG elements have a lowercase name + return /** @type {HTMLAnchorElement | SVGAElement} */ (node); +} + +class Router { + /** @param {{ + * base: string; + * routes: import('types/internal').CSRRoute[]; + * }} opts */ + constructor({ base, routes }) { + this.base = base; + this.routes = routes; + } + + /** @param {import('./renderer').Renderer} renderer */ + init(renderer) { + /** @type {import('./renderer').Renderer} */ + this.renderer = renderer; + renderer.router = this; + + this.enabled = true; + + if ('scrollRestoration' in history) { + history.scrollRestoration = 'manual'; + } + + // Adopted from Nuxt.js + // Reset scrollRestoration to auto when leaving page, allowing page reload + // and back-navigation from other pages to use the browser to restore the + // scrolling position. + addEventListener('beforeunload', () => { + history.scrollRestoration = 'auto'; + }); + + // Setting scrollRestoration to manual again when returning to this page. + addEventListener('load', () => { + history.scrollRestoration = 'manual'; + }); + + // There's no API to capture the scroll location right before the user + // hits the back/forward button, so we listen for scroll events + + /** @type {NodeJS.Timeout} */ + let scroll_timer; + addEventListener('scroll', () => { + clearTimeout(scroll_timer); + scroll_timer = setTimeout(() => { + // Store the scroll location in the history + // This will persist even if we navigate away from the site and come back + const new_state = { + ...(history.state || {}), + 'sveltekit:scroll': scroll_state(), + }; + history.replaceState(new_state, document.title, window.location.href); + }, 50); + }); + + /** @param {MouseEvent} event */ + const trigger_prefetch = (event) => { + const a = find_anchor(/** @type {Node} */ (event.target)); + if (a && a.href && a.hasAttribute('sveltekit:prefetch')) { + this.prefetch(new URL(/** @type {string} */ (a.href))); + } + }; + + /** @type {NodeJS.Timeout} */ + let mousemove_timeout; + + /** @param {MouseEvent} event */ + const handle_mousemove = (event) => { + clearTimeout(mousemove_timeout); + mousemove_timeout = setTimeout(() => { + trigger_prefetch(event); + }, 20); + }; + + addEventListener('touchstart', trigger_prefetch); + addEventListener('mousemove', handle_mousemove); + + /** @param {MouseEvent} event */ + addEventListener('click', (event) => { + if (!this.enabled) return; + + // Adapted from https://github.com/visionmedia/page.js + // MIT license https://github.com/visionmedia/page.js#license + if (event.button || event.which !== 1) return; + if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) + return; + if (event.defaultPrevented) return; + + const a = find_anchor(/** @type {Node} */ (event.target)); + if (!a) return; + + if (!a.href) return; + + // check if link is inside an svg + // in this case, both href and target are always inside an object + const svg = + typeof a.href === 'object' && + a.href.constructor.name === 'SVGAnimatedString'; + const href = String( + svg ? /** @type {SVGAElement} */ (a).href.baseVal : a.href + ); + + if (href === location.href) { + if (!location.hash) event.preventDefault(); + return; + } + + // Ignore if tag has + // 1. 'download' attribute + // 2. 'rel' attribute includes external + const rel = a.getAttribute('rel')?.split(/\s+/); + + if (a.hasAttribute('download') || (rel && rel.includes('external'))) { + return; + } + + // Ignore if has a target + if (svg ? /** @type {SVGAElement} */ (a).target.baseVal : a.target) + return; + + const url = new URL(href); + + // Don't handle hash changes + if (url.pathname === location.pathname && url.search === location.search) + return; + + const noscroll = a.hasAttribute('sveltekit:noscroll'); + history.pushState({}, '', url.href); + this._navigate(url, noscroll ? scroll_state() : null, [], url.hash); + event.preventDefault(); + }); + + addEventListener('popstate', (event) => { + if (event.state && this.enabled) { + const url = new URL(location.href); + this._navigate(url, event.state['sveltekit:scroll'], []); + } + }); + + // make it possible to reset focus + document.body.setAttribute('tabindex', '-1'); + + // create initial history entry, so we can return here + history.replaceState(history.state || {}, '', location.href); + } + + /** + * @param {URL} url + * @returns {import('./types').NavigationInfo} + */ + parse(url) { + if (url.origin !== location.origin) return null; + if (!url.pathname.startsWith(this.base)) return null; + + const path = decodeURIComponent( + url.pathname.slice(this.base.length) || '/' + ); + + const routes = this.routes.filter(([pattern]) => pattern.test(path)); + + const query = new URLSearchParams(url.search); + const id = `${path}?${query}`; + + return { id, routes, path, query }; + } + + /** + * @param {string} href + * @param {{ noscroll?: boolean, replaceState?: boolean }} opts + * @param {string[]} chain + */ + async goto(href, { noscroll = false, replaceState = false } = {}, chain) { + if (this.enabled) { + const url = new URL(href, get_base_uri(document)); + + history[replaceState ? 'replaceState' : 'pushState']({}, '', href); + return this._navigate( + url, + noscroll ? scroll_state() : null, + chain, + url.hash + ); + } + + location.href = href; + return new Promise(() => { + /* never resolves */ + }); + } + + enable() { + this.enabled = true; + } + + disable() { + this.enabled = false; + } + + /** + * @param {URL} url + * @returns {Promise} + */ + async prefetch(url) { + return this.renderer.load(this.parse(url)); + } + + /** + * @param {URL} url + * @param {{ x: number, y: number }} scroll + * @param {string[]} chain + * @param {string} [hash] + */ + async _navigate(url, scroll, chain, hash) { + const info = this.parse(url); + + this.renderer.notify({ + path: info.path, + query: info.query, + }); + + // remove trailing slashes + if (location.pathname.endsWith('/') && location.pathname !== '/') { + history.replaceState( + {}, + '', + `${location.pathname.slice(0, -1)}${location.search}` + ); + } + + await this.renderer.update(info, chain, false); + + document.body.focus(); + + const deep_linked = hash && document.getElementById(hash.slice(1)); + if (scroll) { + scrollTo(scroll.x, scroll.y); + } else if (deep_linked) { + // scroll is an element id (from a hash), we need to compute y + scrollTo(0, deep_linked.getBoundingClientRect().top + scrollY); + } else { + scrollTo(0, 0); + } + } +} + +/** + * @param {import('types/page').LoadOutput} loaded + * @returns {import('types/internal').NormalizedLoadOutput} + */ +function normalize(loaded) { + // TODO should this behaviour be dev-only? + + if (loaded.error) { + const error = + typeof loaded.error === 'string' ? new Error(loaded.error) : loaded.error; + const status = loaded.status; + + if (!(error instanceof Error)) { + return { + status: 500, + error: new Error( + `"error" property returned from load() must be a string or instance of Error, received type "${typeof error}"` + ), + }; + } + + if (!status || status < 400 || status > 599) { + console.warn( + '"error" returned from load() without a valid status code — defaulting to 500' + ); + return { status: 500, error }; + } + + return { status, error }; + } + + if (loaded.redirect) { + if (!loaded.status || Math.floor(loaded.status / 100) !== 3) { + return { + status: 500, + error: new Error( + '"redirect" property returned from load() must be accompanied by a 3xx status code' + ), + }; + } + + if (typeof loaded.redirect !== 'string') { + return { + status: 500, + error: new Error( + '"redirect" property returned from load() must be a string' + ), + }; + } + } + + return /** @type {import('types/internal').NormalizedLoadOutput} */ (loaded); +} + +/** @param {any} value */ +function page_store(value) { + const store = writable(value); + let ready = true; + + function notify() { + ready = true; + store.update((val) => val); + } + + /** @param {any} new_value */ + function set(new_value) { + ready = false; + store.set(new_value); + } + + /** @param {(value: any) => void} run */ + function subscribe(run) { + /** @type {any} */ + let old_value; + return store.subscribe((new_value) => { + if (old_value === undefined || (ready && new_value !== old_value)) { + run((old_value = new_value)); + } + }); + } + + return { notify, set, subscribe }; +} + +/** + * @param {RequestInfo} resource + * @param {RequestInit} opts + */ +function initial_fetch(resource, opts) { + const url = typeof resource === 'string' ? resource : resource.url; + const script = document.querySelector( + `script[type="svelte-data"][url="${url}"]` + ); + if (script) { + const { body, ...init } = JSON.parse(script.textContent); + return Promise.resolve(new Response(body, init)); + } + + return fetch(resource, opts); +} + +/** @typedef {import('types/internal').CSRComponent} CSRComponent */ + +class Renderer { + /** @param {{ + * Root: CSRComponent; + * fallback: [CSRComponent, CSRComponent]; + * target: Node; + * session: any; + * host: string; + * }} opts */ + constructor({ Root, fallback, target, session, host }) { + this.Root = Root; + this.fallback = fallback; + this.host = host; + + /** @type {import('./router').Router} */ + this.router = null; + + this.target = target; + + this.started = false; + + this.session_id = 1; + this.invalid = new Set(); + this.invalidating = null; + + /** @type {import('./types').NavigationState} */ + this.current = { + page: null, + session_id: null, + branch: [], + }; + + /** @type {Map} */ + this.cache = new Map(); + + this.loading = { + id: null, + promise: null, + }; + + this.stores = { + page: page_store({}), + navigating: writable(null), + session: writable(session), + }; + + this.$session = null; + + this.root = null; + + let ready = false; + this.stores.session.subscribe(async (value) => { + this.$session = value; + + if (!ready) return; + this.session_id += 1; + + const info = this.router.parse(new URL(location.href)); + this.update(info, [], true); + }); + ready = true; + } + + /** + * @param {{ + * status: number; + * error: Error; + * nodes: Array>; + * page: import('types/page').Page; + * }} selected + */ + async start({ status, error, nodes, page }) { + /** @type {import('./types').BranchNode[]} */ + const branch = []; + + /** @type {Record} */ + let context = {}; + + /** @type {import('./types').NavigationResult} */ + let result; + + /** @type {number} */ + let new_status; + + /** @type {Error} new_error */ + let new_error; + + try { + for (let i = 0; i < nodes.length; i += 1) { + const is_leaf = i === nodes.length - 1; + + const node = await this._load_node({ + module: await nodes[i], + page, + context, + status: is_leaf && status, + error: is_leaf && error, + }); + + branch.push(node); + + if (node && node.loaded) { + if (node.loaded.error) { + if (error) throw node.loaded.error; + new_status = node.loaded.status; + new_error = node.loaded.error; + } else if (node.loaded.context) { + context = { + ...context, + ...node.loaded.context, + }; + } + } + } + + result = await this._get_navigation_result_from_branch({ page, branch }); + } catch (e) { + if (error) throw e; + + new_status = 500; + new_error = e; + } + + if (new_error) { + result = await this._load_error({ + status: new_status, + error: new_error, + path: page.path, + query: page.query, + }); + } + + if (result.redirect) { + // this is a real edge case — `load` would need to return + // a redirect but only in the browser + location.href = new URL(result.redirect, location.href).href; + return; + } + + this._init(result); + } + + /** @param {{ path: string, query: URLSearchParams }} destination */ + notify({ path, query }) { + dispatchEvent(new CustomEvent('sveltekit:navigation-start')); + + if (this.started) { + this.stores.navigating.set({ + from: { + path: this.current.page.path, + query: this.current.page.query, + }, + to: { + path, + query, + }, + }); + } + } + + /** + * @param {import('./types').NavigationInfo} info + * @param {string[]} chain + * @param {boolean} no_cache + */ + async update(info, chain, no_cache) { + const token = (this.token = {}); + let navigation_result = await this._get_navigation_result(info, no_cache); + + // abort if user navigated during update + if (token !== this.token) return; + + this.invalid.clear(); + + if (navigation_result.redirect) { + if (chain.length > 10 || chain.includes(info.path)) { + navigation_result = await this._load_error({ + status: 500, + error: new Error('Redirect loop'), + path: info.path, + query: info.query, + }); + } else { + if (this.router) { + this.router.goto(navigation_result.redirect, { replaceState: true }, [ + ...chain, + info.path, + ]); + } else { + location.href = new URL( + navigation_result.redirect, + location.href + ).href; + } + + return; + } + } + + if (navigation_result.reload) { + location.reload(); + } else if (this.started) { + this.current = navigation_result.state; + + this.root.$set(navigation_result.props); + this.stores.navigating.set(null); + + await 0; + } else { + this._init(navigation_result); + } + + dispatchEvent(new CustomEvent('sveltekit:navigation-end')); + this.loading.promise = null; + this.loading.id = null; + + const leaf_node = + navigation_result.state.branch[navigation_result.state.branch.length - 1]; + if (leaf_node && leaf_node.module.router === false) { + this.router.disable(); + } else { + this.router.enable(); + } + } + + /** + * @param {import('./types').NavigationInfo} info + * @returns {Promise} + */ + load(info) { + this.loading.promise = this._get_navigation_result(info, false); + this.loading.id = info.id; + + return this.loading.promise; + } + + /** @param {string} href */ + invalidate(href) { + this.invalid.add(href); + + if (!this.invalidating) { + this.invalidating = Promise.resolve().then(async () => { + const info = this.router.parse(new URL(location.href)); + await this.update(info, [], true); + + this.invalidating = null; + }); + } + + return this.invalidating; + } + + /** @param {import('./types').NavigationResult} result */ + _init(result) { + this.current = result.state; + + const style = document.querySelector('style[data-svelte]'); + if (style) style.remove(); + + this.root = new this.Root({ + target: this.target, + props: { + stores: this.stores, + ...result.props, + }, + hydrate: true, + }); + + this.started = true; + } + + /** + * @param {import('./types').NavigationInfo} info + * @param {boolean} no_cache + * @returns {Promise} + */ + async _get_navigation_result(info, no_cache) { + if (this.loading.id === info.id) { + return this.loading.promise; + } + + for (let i = 0; i < info.routes.length; i += 1) { + const route = info.routes[i]; + + if (route.length === 1) { + return { reload: true }; + } + + // load code for subsequent routes immediately, if they are as + // likely to match the current path/query as the current one + let j = i + 1; + while (j < info.routes.length) { + const next = info.routes[j]; + if (next[0].toString() === route[0].toString()) { + if (next.length !== 1) next[1].forEach((loader) => loader()); + j += 1; + } else { + break; + } + } + + const result = await this._load( + { + route, + path: info.path, + query: info.query, + }, + no_cache + ); + if (result) return result; + } + + return await this._load_error({ + status: 404, + error: new Error(`Not found: ${info.path}`), + path: info.path, + query: info.query, + }); + } + + /** + * + * @param {{ + * page: import('types/page').Page; + * branch: import('./types').BranchNode[] + * }} opts + */ + async _get_navigation_result_from_branch({ page, branch }) { + const filtered = branch.filter(Boolean); + + /** @type {import('./types').NavigationResult} */ + const result = { + state: { + page, + branch, + session_id: this.session_id, + }, + props: { + components: filtered.map((node) => node.module.default), + }, + }; + + for (let i = 0; i < filtered.length; i += 1) { + if (filtered[i].loaded) + result.props[`props_${i}`] = await filtered[i].loaded.props; + } + + if ( + !this.current.page || + page.path !== this.current.page.path || + page.query.toString() !== this.current.page.query.toString() + ) { + result.props.page = page; + } + + const leaf = filtered[filtered.length - 1]; + const maxage = leaf.loaded && leaf.loaded.maxage; + + if (maxage) { + const key = `${page.path}?${page.query}`; + let ready = false; + + const clear = () => { + if (this.cache.get(key) === result) { + this.cache.delete(key); + } + + unsubscribe(); + clearTimeout(timeout); + }; + + const timeout = setTimeout(clear, maxage * 1000); + + const unsubscribe = this.stores.session.subscribe(() => { + if (ready) clear(); + }); + + ready = true; + + this.cache.set(key, result); + } + + return result; + } + + /** + * + * @param {{ + * status?: number; + * error?: Error; + * module: CSRComponent; + * page: import('types/page').Page; + * context: Record; + * }} options + * @returns + */ + async _load_node({ status, error, module, page, context }) { + /** @type {import('./types').BranchNode} */ + const node = { + module, + uses: { + params: new Set(), + path: false, + query: false, + session: false, + context: false, + dependencies: [], + }, + loaded: null, + context, + }; + + /** @type {Record} */ + const params = {}; + for (const key in page.params) { + Object.defineProperty(params, key, { + get() { + node.uses.params.add(key); + return page.params[key]; + }, + enumerable: true, + }); + } + + const session = this.$session; + + if (module.load) { + const { started } = this; + + /** @type {import('types/page').LoadInput | import('types/page').ErrorLoadInput} */ + const load_input = { + page: { + host: page.host, + params, + get path() { + node.uses.path = true; + return page.path; + }, + get query() { + node.uses.query = true; + return page.query; + }, + }, + get session() { + node.uses.session = true; + return session; + }, + get context() { + node.uses.context = true; + return { ...context }; + }, + fetch(resource, info) { + const url = typeof resource === 'string' ? resource : resource.url; + const { href } = new URL(url, new URL(page.path, document.baseURI)); + node.uses.dependencies.push(href); + + return started + ? fetch(resource, info) + : initial_fetch(resource, info); + }, + }; + + if (error) { + /** @type {import('types/page').ErrorLoadInput} */ (load_input).status = status; + /** @type {import('types/page').ErrorLoadInput} */ (load_input).error = error; + } + + const loaded = await module.load.call(null, load_input); + + // if the page component returns nothing from load, fall through + if (!loaded) return; + + node.loaded = normalize(loaded); + if (node.loaded.context) node.context = node.loaded.context; + } + + return node; + } + + /** + * @param {import('./types').NavigationCandidate} selected + * @param {boolean} no_cache + * @returns {Promise} + */ + async _load({ route, path, query }, no_cache) { + const key = `${path}?${query}`; + + if (!no_cache && this.cache.has(key)) { + return this.cache.get(key); + } + + const [pattern, a, b, get_params] = route; + const params = get_params ? get_params(pattern.exec(path)) : {}; + + const changed = this.current.page && { + path: path !== this.current.page.path, + params: Object.keys(params).filter( + (key) => this.current.page.params[key] !== params[key] + ), + query: query.toString() !== this.current.page.query.toString(), + session: this.session_id !== this.current.session_id, + }; + + /** @type {import('types/page').Page} */ + const page = { host: this.host, path, query, params }; + + /** @type {import('./types').BranchNode[]} */ + const branch = []; + + /** @type {Record} */ + let context = {}; + let context_changed = false; + + /** @type {number} */ + let status = 200; + + /** @type {Error} */ + let error = null; + + // preload modules + a.forEach((loader) => loader()); + + load: for (let i = 0; i < a.length; i += 1) { + /** @type {import('./types').BranchNode} */ + let node; + + try { + if (!a[i]) continue; + + const module = await a[i](); + const previous = this.current.branch[i]; + + const changed_since_last_render = + !previous || + module !== previous.module || + (changed.path && previous.uses.path) || + changed.params.some((param) => previous.uses.params.has(param)) || + (changed.query && previous.uses.query) || + (changed.session && previous.uses.session) || + previous.uses.dependencies.some((dep) => this.invalid.has(dep)) || + (context_changed && previous.uses.context); + + if (changed_since_last_render) { + node = await this._load_node({ + module, + page, + context, + }); + + const is_leaf = i === a.length - 1; + + if (node && node.loaded) { + if (node.loaded.error) { + status = node.loaded.status; + error = node.loaded.error; + } + + if (node.loaded.redirect) { + return { + redirect: node.loaded.redirect, + }; + } + + if (node.loaded.context) { + context_changed = true; + } + } else if (is_leaf && module.load) { + // if the leaf node has a `load` function + // that returns nothing, fall through + return; + } + } else { + node = previous; + } + } catch (e) { + status = 500; + error = e; + } + + if (error) { + while (i--) { + if (b[i]) { + let error_loaded; + + /** @type {import('./types').BranchNode} */ + let node_loaded; + let j = i; + while (!(node_loaded = branch[j])) { + j -= 1; + } + + try { + error_loaded = await this._load_node({ + status, + error, + module: await b[i](), + page, + context: node_loaded.context, + }); + + if (error_loaded.loaded.error) { + continue; + } + + branch.push(error_loaded); + break load; + } catch (e) { + continue; + } + } + } + + return await this._load_error({ + status, + error, + path, + query, + }); + } else { + if (node && node.loaded && node.loaded.context) { + context = { + ...context, + ...node.loaded.context, + }; + } + + branch.push(node); + } + } + + return await this._get_navigation_result_from_branch({ page, branch }); + } + + /** + * @param {{ + * status: number; + * error: Error; + * path: string; + * query: URLSearchParams + * }} opts + */ + async _load_error({ status, error, path, query }) { + const page = { + host: this.host, + path, + query, + params: {}, + }; + + const node = await this._load_node({ + module: await this.fallback[0], + page, + context: {}, + }); + + const branch = [ + node, + await this._load_node({ + status, + error, + module: await this.fallback[1], + page, + context: node && node.loaded && node.loaded.context, + }), + ]; + + return await this._get_navigation_result_from_branch({ page, branch }); + } +} + +// @ts-ignore + +/** @param {{ + * paths: { + * assets: string; + * base: string; + * }, + * target: Node; + * session: any; + * host: string; + * route: boolean; + * spa: boolean; + * hydrate: { + * status: number; + * error: Error; + * nodes: Array>; + * page: import('types/page').Page; + * }; + * }} opts */ +async function start({ paths, target, session, host, route, spa, hydrate }) { + if (import.meta.env.DEV && !target) { + throw new Error( + 'Missing target element. See https://kit.svelte.dev/docs#configuration-target' + ); + } + + const router = + route && + new Router({ + base: paths.base, + routes, + }); + + const renderer = new Renderer({ + Root, + fallback, + target, + session, + host, + }); + + init(router); + set_paths(paths); + + if (hydrate) await renderer.start(hydrate); + if (route) router.init(renderer); + + if (spa) router.goto(location.href, { replaceState: true }, []); + + dispatchEvent(new CustomEvent('sveltekit:start')); +} + +if (import.meta.env.VITE_SVELTEKIT_SERVICE_WORKER) { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.register( + /** @type {string} */ (import.meta.env.VITE_SVELTEKIT_SERVICE_WORKER) + ); + } +} + +export { start }; diff --git a/.svelte-kit/dev/runtime/paths.js b/.svelte-kit/dev/runtime/paths.js new file mode 100644 index 0000000..ff24e1d --- /dev/null +++ b/.svelte-kit/dev/runtime/paths.js @@ -0,0 +1,12 @@ +/** @type {string} */ +let base = ''; + +/** @type {string} */ +let assets = '/.'; + +/** @param {{ base: string, assets: string }} paths */ +function set_paths(paths) { + ({ base, assets } = paths); +} + +export { assets, base, set_paths }; diff --git a/CLIENT_README.txt b/CLIENT_README.txt new file mode 100644 index 0000000..d91319c --- /dev/null +++ b/CLIENT_README.txt @@ -0,0 +1 @@ +To embed this graphic in your CMS, use the embed code in the EMBED.txt file in this package. \ No newline at end of file diff --git a/package.json b/package.json index fcf3b22..a0a99cc 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,8 @@ }, "devDependencies": { "@reuters-graphics/eslint-config": "^0.0.2", - "@reuters-graphics/graphics-bin": "^0.0.14", - "@reuters-graphics/graphics-kit-publisher": "^0.0.12", + "@reuters-graphics/graphics-bin": "^0.0.16", + "@reuters-graphics/graphics-kit-publisher": "^0.0.17", "@rollup/plugin-dsv": "^2.0.1", "@sveltejs/kit": "next", "autoprefixer": "^10.2.5", @@ -46,7 +46,7 @@ "sass": "^1.0.0", "svelte": "^3.32.1", "svelte-preprocess": "^4.0.0", - "vite": "^2.1.0" + "vite": "^2.2.3" }, "engines": { "node": ">= 14.16.0" diff --git a/src/FutureGraphicsComponentsLib/SEO/analytics.js b/src/FutureGraphicsComponentsLib/SEO/analytics.js new file mode 100644 index 0000000..9bc5b26 --- /dev/null +++ b/src/FutureGraphicsComponentsLib/SEO/analytics.js @@ -0,0 +1,32 @@ +/* eslint-disable */ +const attachScript = function (i, s, o, g, r, a, m) { + i.GoogleAnalyticsObject = r; + (i[r] = + i[r] || + function () { + (i[r].q = i[r].q || []).push(arguments); + }), + (i[r].l = 1 * new Date()); + (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]); + a.async = 1; + a.src = g; + m.parentNode.insertBefore(a, m); +}; +/* eslint-enable */ + +export default (page, title) => { + attachScript( + window, + document, + 'script', + 'https://www.google-analytics.com/analytics.js', + 'ga' + ); + + window.ga('create', 'UA-41619329-3', { cookieDomain: 'auto' }); + window.ga('require', 'linkid', 'linkid.js'); + window.ga('send', 'pageview', { + page, + title, + }); +}; diff --git a/src/FutureGraphicsComponentsLib/SEO/index.svelte b/src/FutureGraphicsComponentsLib/SEO/index.svelte index 047f43f..f7a9ba1 100644 --- a/src/FutureGraphicsComponentsLib/SEO/index.svelte +++ b/src/FutureGraphicsComponentsLib/SEO/index.svelte @@ -1,104 +1,149 @@ + + - + {seoTitle} - - - - - - - - + + + + + + + + - - - + + + - + - - - - + + + + - - - - + + + + - {@html ''} - {@html ''} + {@html ''} + {@html ''} - - diff --git a/src/FutureGraphicsComponentsLib/SEO/publisherTags.js b/src/FutureGraphicsComponentsLib/SEO/publisherTags.js new file mode 100644 index 0000000..527d2ba --- /dev/null +++ b/src/FutureGraphicsComponentsLib/SEO/publisherTags.js @@ -0,0 +1,26 @@ +export default () => { + const googletag = window.googletag || {}; + googletag.cmd = googletag.cmd || []; + (function () { + const gads = document.createElement('script'); + gads.async = true; + gads.type = 'text/javascript'; + const useSSL = document.location.protocol === 'https:'; + gads.src = + (useSSL ? 'https:' : 'http:') + + '//www.googletagservices.com/tag/js/gpt.js'; + const node = document.getElementsByTagName('script')[0]; + node.parentNode.insertBefore(gads, node); + })(); + googletag.cmd.push(function () { + googletag + .defineSlot( + '/4735792/reuters_investigates', + [[300, 250]], + 'div-gpt-ad-1441822201033-0' + ) + .addService(googletag.pubads()); + googletag.pubads().enableSingleRequest(); + googletag.enableServices(); + }); +}; diff --git a/svelte.config.cjs b/svelte.config.cjs deleted file mode 100644 index eeafba7..0000000 --- a/svelte.config.cjs +++ /dev/null @@ -1,77 +0,0 @@ -const sveltePreprocess = require('svelte-preprocess'); -const pkg = require('./package.json'); -const url = require('url'); -const path = require('path'); -const dsv = require('@rollup/plugin-dsv'); -const svelteKitPagesPlugin = require('./bin/svelte-kit/plugins/svelte-kit-pages/index.cjs'); - -const getRootRelativePath = (homepageURL) => { - if (!homepageURL) return ''; - const page = new url.URL(homepageURL); - return homepageURL.replace(`${page.protocol}//${page.host}`, '').replace(/\/$/, ''); -}; - -module.exports = { - preprocess: sveltePreprocess({ - preserve: ['ld+json'], - scss: { - includePaths: ['src/', 'node_modules/bootstrap/scss/'], - importer: [ - (url) => { - // Redirect tilde-prefixed imports to node_modules - if (/^~/.test(url)) return { file: `node_modules/${url.replace('~', '')}` }; - return null; - }, - ], - }, - postcss: { - plugins: [require('autoprefixer')], - }, - }), - kit: { - appDir: '_app', - paths: { - assets: process.env.NODE_ENV === 'production' ? getRootRelativePath(process.env.PREVIEW ? pkg.reuters.preview : pkg.homepage) + '/cdn' : '', - base: process.env.NODE_ENV === 'production' ? getRootRelativePath(process.env.PREVIEW ? pkg.reuters.preview : pkg.homepage) : '', - }, - adapter: { - name: 'static-adapter', - async adapt(builder) { - builder.copy_static_files('dist/cdn'); - builder.copy_client_files('dist/cdn'); - await builder.prerender({ - all: true, - dest: 'dist', - fallback: null, - }); - }, - }, - files: { - assets: 'src/statics', - lib: 'src/lib', - routes: 'pages', - template: 'src/template.html', - }, - target: '#svelte-app', - vite: { - build: { target: 'es2015' }, - resolve: { - alias: { - $utils: path.resolve(__dirname, 'src/utils'), - $pkg: path.resolve(__dirname, 'package.json'), - $imgs: path.resolve(__dirname, 'src/statics/images/manifest.json'), - $locales: path.resolve(__dirname, 'locales'), - 'reuters-components': path.resolve(__dirname, 'src/FutureGraphicsComponentsLib'), - }, - }, - optimizeDeps: { - exclude: ['svelte-fa'], - include: ['marked', 'lodash-es'], - }, - plugins: [ - dsv(), - svelteKitPagesPlugin(), - ], - }, - }, -}; diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..a4327f9 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,91 @@ +import autoprefixer from 'autoprefixer'; +import dsv from '@rollup/plugin-dsv'; +import fs from 'fs-extra'; +import svelteKitPagesPlugin from './bin/svelte-kit/plugins/svelte-kit-pages/index.cjs'; +import sveltePreprocess from 'svelte-preprocess'; +import url from 'url'; + +const getRootRelativePath = (homepageURL) => { + if (!homepageURL) return ''; + const page = new url.URL(homepageURL); + return homepageURL + .replace(`${page.protocol}//${page.host}`, '') + .replace(/\/$/, ''); +}; + +const pkg = fs.readJSONSync(new URL('./package.json', import.meta.url)); + +process.env.VITE_DATELINE = new Date().toISOString(); + +export default { + preprocess: sveltePreprocess({ + preserve: ['ld+json'], + scss: { + includePaths: ['src/', 'node_modules/bootstrap/scss/'], + importer: [ + (url) => { + // Redirect tilde-prefixed imports to node_modules + if (/^~/.test(url)) + return { file: `node_modules/${url.replace('~', '')}` }; + return null; + }, + ], + }, + postcss: { + plugins: [autoprefixer], + }, + }), + kit: { + appDir: '_app', + paths: { + assets: + process.env.NODE_ENV === 'production' + ? getRootRelativePath( + process.env.PREVIEW ? pkg.reuters.preview : pkg.homepage + ) + '/cdn' + : '', + base: + process.env.NODE_ENV === 'production' + ? getRootRelativePath( + process.env.PREVIEW ? pkg.reuters.preview : pkg.homepage + ) + : '', + }, + adapter: { + name: 'static-adapter', + async adapt(builder) { + builder.copy_static_files('dist/cdn'); + builder.copy_client_files('dist/cdn'); + await builder.prerender({ + all: true, + dest: 'dist', + fallback: null, + }); + }, + }, + files: { + assets: 'src/statics', + lib: 'src/lib', + routes: 'pages', + template: 'src/template.html', + }, + target: '#svelte-app', + vite: { + build: { target: 'es2015' }, + resolve: { + alias: { + $utils: '/src/utils', + $pkg: '/package.json', + $imgs: '/src/statics/images/manifest.json', + $locales: '/locales', + 'reuters-components': '/src/FutureGraphicsComponentsLib', + }, + }, + optimizeDeps: { + exclude: ['svelte-fa'], + include: ['marked', 'lodash-es'], + }, + plugins: [dsv(), svelteKitPagesPlugin()], + }, + }, +}; diff --git a/yarn.lock b/yarn.lock index 86dd99e..f7c5141 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,12 +16,12 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/generator@^7.13.9": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" - integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== +"@babel/generator@^7.14.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.1.tgz#1f99331babd65700183628da186f36f63d615c93" + integrity sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.14.1" jsesc "^2.5.1" source-map "^0.5.0" @@ -48,24 +48,24 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.13.15", "@babel/parser@^7.7.0": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.15.tgz#8e66775fb523599acb6a289e12929fa5ab0954d8" - integrity sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ== +"@babel/parser@^7.12.13", "@babel/parser@^7.14.0", "@babel/parser@^7.7.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47" + integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q== "@babel/template@^7.12.13": version "7.12.13" @@ -77,26 +77,25 @@ "@babel/types" "^7.12.13" "@babel/traverse@^7.7.0": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.15.tgz#c38bf7679334ddd4028e8e1f7b3aa5019f0dada7" - integrity sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" + integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.9" + "@babel/generator" "^7.14.0" "@babel/helper-function-name" "^7.12.13" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.15" - "@babel/types" "^7.13.14" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.14.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.14", "@babel/types@^7.7.0": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d" - integrity sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ== +"@babel/types@^7.12.13", "@babel/types@^7.14.0", "@babel/types@^7.14.1", "@babel/types@^7.7.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db" + integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" "@dabh/diagnostics@^2.0.2": @@ -123,28 +122,33 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@formatjs/ecma402-abstract@1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.5.tgz#ab461b6a284278ffe051ddd817537be4092e71be" - integrity sha512-dhRWSoPPw8PhB5tSOEP9Gi5XZNFC2IkfP95Va70ouIuED0wBlsU1WmO4jDHITL7/kSNqvzKFTT+2S+6jHPq6jw== +"@formatjs/ecma402-abstract@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.7.0.tgz#440b341ba18451d53d9172e3110d96ca420b3760" + integrity sha512-0IQF4oDZdO8ruyrNJZuRle3F/YiGgRwTNrZyMI1N1X8GERZusOrXU9Stw+j/lyyfDWaJK44b+Qnri/qfLPCtGQ== dependencies: tslib "^2.1.0" -"@formatjs/icu-messageformat-parser@1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-1.1.5.tgz#0c0dae9878329a26a4df6c74d1d3a59de08d4df9" - integrity sha512-TZC3Ac6zTZGlkPoOstJpllo0rkI60kYSOcyhv7zXcaqzAxgdY+6WK8D91x1O9Swy5Jk1PUQM1IAMdafxZoz+Zg== +"@formatjs/fast-memoize@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.1.1.tgz#3006b58aca1e39a98aca213356b42da5d173f26b" + integrity sha512-mIqBr5uigIlx13eZTOPSEh2buDiy3BCdMYUtewICREQjbb4xarDiVWoXSnrERM7NanZ+0TAHNXSqDe6HpEFQUg== + +"@formatjs/icu-messageformat-parser@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.0.tgz#a705da9c5040ebdee295147951cfaeb3e61a8ae0" + integrity sha512-NwbcVP6jtnL+4vpmlWJoBA2/vxrl57uw5jBq8Cb3bfYJLxdL01IRxh//hFBePvLi9cyTYJEC3ZfzIuEH4kyX+w== dependencies: - "@formatjs/ecma402-abstract" "1.6.5" - "@formatjs/icu-skeleton-parser" "1.1.2" + "@formatjs/ecma402-abstract" "1.7.0" + "@formatjs/icu-skeleton-parser" "1.2.1" tslib "^2.1.0" -"@formatjs/icu-skeleton-parser@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.1.2.tgz#b559f32a920ea6600df53735143b59e6cc087c1d" - integrity sha512-R0hxPsnq9oOW50HnqKjzuqzUOEUWRdSqqt2wvLCwlFMEx6+MsLW35yzbB9fnxfRZ6vVnYO69TxBfXvvsK2VoUw== +"@formatjs/icu-skeleton-parser@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.2.1.tgz#aa3204b941b436cb88fea9269a6bdf10610336aa" + integrity sha512-mTpmCozmksatv3gQ+6/9dwwtoR+r+DFms22X6D6GLS4TaeaFKIPmC3k/DlsMGZIr3Q+dT+is5IcexChrPBGmCg== dependencies: - "@formatjs/ecma402-abstract" "1.6.5" + "@formatjs/ecma402-abstract" "1.7.0" tslib "^2.1.0" "@fortawesome/fontawesome-common-types@^0.2.35": @@ -330,10 +334,10 @@ eslint-plugin-react-hooks "*" eslint-plugin-standard "*" -"@reuters-graphics/graphics-bin@^0.0.14": - version "0.0.14" - resolved "https://registry.yarnpkg.com/@reuters-graphics/graphics-bin/-/graphics-bin-0.0.14.tgz#47477fc1cec6dbcb722fd18cd6ef88a0052c245d" - integrity sha512-FF3RyxfKnoMhCH+z0h66jEElll2xTWgo6uA8hLZcSk8q57AWYmtZaSkMr2+lsSbyIlKPKXcsq7TACvWk6HbOyA== +"@reuters-graphics/graphics-bin@^0.0.16": + version "0.0.16" + resolved "https://registry.yarnpkg.com/@reuters-graphics/graphics-bin/-/graphics-bin-0.0.16.tgz#ad2d1c92259e9720d876ed9cd1979504019e01db" + integrity sha512-DznzwrSMbGX4pm0sfJPpTpEEfvg14+t3ITLH8F67mnHTZ/d5AZ8jzB8k3EOg5mr+dSos/B68CT1q1l8pMrma4Q== dependencies: "@newswire/doc-to-archieml" "^1.0.0" "@newswire/sheet-to-data" "^1.0.0" @@ -361,10 +365,10 @@ trello "^0.10.0" winston "^3.3.3" -"@reuters-graphics/graphics-kit-publisher@^0.0.12": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@reuters-graphics/graphics-kit-publisher/-/graphics-kit-publisher-0.0.12.tgz#fa47f142471eb2a71ee71735094c8f227e4e965b" - integrity sha512-nF6vTMUXPalYNSUoqc3H/3QWc5ajdfE14krAukpc+EZmmG9lnWRtuAzFhtqQlIbU5QLlXjT9s7FJw4+OpbZXsA== +"@reuters-graphics/graphics-kit-publisher@^0.0.17": + version "0.0.17" + resolved "https://registry.yarnpkg.com/@reuters-graphics/graphics-kit-publisher/-/graphics-kit-publisher-0.0.17.tgz#c13da14e897164a5c255177ee92e6d0529277618" + integrity sha512-GyYah8yXcQc8rC0JBFxOqfReg28Qs9vD6aGv8RzFS+WOzT8VyZk8ye5GHgLW2kbSJ+TfWNT+BkJLnxVGVT8lSQ== dependencies: "@reuters-graphics/server-client" "^1.2.2" archiver "^5.3.0" @@ -509,27 +513,27 @@ lodash.deburr "^4.1.0" "@sveltejs/kit@next": - version "1.0.0-next.90" - resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-1.0.0-next.90.tgz#4e8475672189c197c7452a5c21b442eb6f4c0340" - integrity sha512-aiK4K4hRIZrMVbE+J8+taMNYmK3TonVsi2kHclfXJMQremKFR811rm6vgQUQoJtmwFRFJPOoNmuZVluJr/qDJg== + version "1.0.0-next.101" + resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-1.0.0-next.101.tgz#ad3487343881deec515e0804cf26d9308c771668" + integrity sha512-SwUImLhFmyaDsq7LKRJXPJRIOPa06SWENG7heko5FTRRLMpI/UDFcijjT2ln0Fp+AL9XfSbTHO8QrOflCMbfiQ== dependencies: - "@sveltejs/vite-plugin-svelte" "^1.0.0-next.7" + "@sveltejs/vite-plugin-svelte" "^1.0.0-next.9" cheap-watch "^1.0.3" sade "^1.7.4" -"@sveltejs/vite-plugin-svelte@^1.0.0-next.7": - version "1.0.0-next.7" - resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.7.tgz#77e7649ab6fd1452b3ccddd2ad8456c4d63a6026" - integrity sha512-ENvKYY36jrvFP7h1G87k5uOoEh5UM1m8n40J2duqV/R3wHnxfW81SCR1aXo+5CVU8Prm3/jtS4TWs8CUTqO1fw== +"@sveltejs/vite-plugin-svelte@^1.0.0-next.9": + version "1.0.0-next.9" + resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.9.tgz#409e20c030298e968c71d71bef141665c06e7bd9" + integrity sha512-ySB/GJsZV3h3jqjq5WIiaxVFkJK6vqtG9gS7Iw6SfUH9ZiFNw5JjQF69g68j9cNep3q4yRIYiG5/pI3YIdXEuA== dependencies: "@rollup/pluginutils" "^4.1.0" - chalk "^4.1.0" + chalk "^4.1.1" debug "^4.3.2" hash-sum "^2.0.0" require-relative "^0.8.7" - slash "^3.0.0" + slash "^4.0.0" source-map "^0.7.3" - svelte-hmr "^0.14.0" + svelte-hmr "^0.14.2" "@szmarczak/http-timer@^1.1.2": version "1.1.2" @@ -583,9 +587,9 @@ "@types/node" "*" "@types/node@*": - version "15.0.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.1.tgz#ef34dea0881028d11398be5bf4e856743e3dc35a" - integrity sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA== + version "15.0.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.2.tgz#51e9c0920d1b45936ea04341aa3e2e58d339fb67" + integrity sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA== "@types/parse-json@^4.0.0": version "4.0.0" @@ -665,17 +669,7 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" - integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^8.0.5: +ajv@^8.0.1, ajv@^8.0.5: version "8.2.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.2.0.tgz#c89d3380a784ce81b2085f48811c4c101df4c602" integrity sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA== @@ -876,9 +870,9 @@ autoprefixer@^10.2.5: postcss-value-parser "^4.1.0" aws-sdk@^2.879.0: - version "2.897.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.897.0.tgz#cb3594639bd57badd4908870d7f77f814f6a3166" - integrity sha512-GnjnZ5kgmeGe1BW+wsfRJ8Hu5mU7py/GBLXikSgtNPbMmF66yTMfND99hpS5U7m3SSaHG0qBYGVySC7Z+U1AJA== + version "2.902.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.902.0.tgz#6e71f02b02ccbecf88e8e3c7f24e940ebdc6655e" + integrity sha512-tbX2DaaPwQyETCdYVImp7euTyF0bXLKUmicaD64Xb2v/firEG4t+yRFADiQ/ZetkmvOPN8O3jqXIAz6I6EbnuA== dependencies: buffer "4.9.2" events "1.1.1" @@ -1004,13 +998,13 @@ braces@^3.0.1, braces@~3.0.2: fill-range "^7.0.1" browserslist@^4.16.3: - version "4.16.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.4.tgz#7ebf913487f40caf4637b892b268069951c35d58" - integrity sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ== + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001208" + caniuse-lite "^1.0.30001219" colorette "^1.2.2" - electron-to-chromium "^1.3.712" + electron-to-chromium "^1.3.723" escalade "^3.1.1" node-releases "^1.1.71" @@ -1090,10 +1084,10 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001196, caniuse-lite@^1.0.30001208: - version "1.0.30001208" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz#a999014a35cebd4f98c405930a057a0d75352eb9" - integrity sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA== +caniuse-lite@^1.0.30001196, caniuse-lite@^1.0.30001219: + version "1.0.30001223" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001223.tgz#39b49ff0bfb3ee3587000d2f66c47addc6e14443" + integrity sha512-k/RYs6zc/fjbxTjaWZemeSmOjO0JJV+KguOBA3NwPup8uzxM1cMhR2BD9XmO86GuqaqTCO8CgkgH9Rz//vdDiA== chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" @@ -1112,7 +1106,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -1130,7 +1124,7 @@ cheap-watch@^1.0.3: resolved "https://registry.yarnpkg.com/cheap-watch/-/cheap-watch-1.0.3.tgz#3c4265718bcf8f1ae08f5e450f9f4693432e028e" integrity sha512-xC5CruMhLzjPwJ5ecUxGu1uGmwJQykUhqd2QrCrYbwvsFYdRyviu6jG9+pccwDXJR/OpmOTOJ9yLFunVgQu9wg== -cheerio-select@^1.3.0: +cheerio-select@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.4.0.tgz#3a16f21e37a2ef0f211d6d1aa4eff054bb22cdc9" integrity sha512-sobR3Yqz27L553Qa7cK6rtJlMDbiKPdNywtR95Sj/YgfpLfy0u6CGJuaBKe5YE/vTc23SCRKxWSdlon/w6I/Ew== @@ -1142,18 +1136,19 @@ cheerio-select@^1.3.0: domutils "^2.6.0" cheerio@^1.0.0-rc.6: - version "1.0.0-rc.6" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.6.tgz#a5ae81ab483aeefa1280c325543c601145506240" - integrity sha512-hjx1XE1M/D5pAtMgvWwE21QClmAEeGHOIDfycgmndisdNgI6PE1cGRQkMGBcsbUbmEQyWu5PJLUcAOjtQS8DWw== + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.9.tgz#a3ae6b7ce7af80675302ff836f628e7cb786a67f" + integrity sha512-QF6XVdrLONO6DXRF5iaolY+odmhj2CLj+xzNod7INPWMi/x9X4SOylH0S/vaPpX+AUU6t04s34SQNh7DbkuCng== dependencies: - cheerio-select "^1.3.0" + cheerio-select "^1.4.0" dom-serializer "^1.3.1" - domhandler "^4.1.0" + domhandler "^4.2.0" htmlparser2 "^6.1.0" parse5 "^6.0.1" parse5-htmlparser2-tree-adapter "^6.0.1" + tslib "^2.2.0" -"chokidar@>=2.0.0 <4.0.0": +"chokidar@>=3.0.0 <4.0.0": version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== @@ -1590,14 +1585,14 @@ d3-scale-chromatic@2: d3-interpolate "1 - 2" d3-scale@3, d3-scale@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.2.4.tgz#13d758d7cf4e4f1fc40196a63597d01f3ed81765" - integrity sha512-PG6gtpbPCFqKbvdBEswQcJcTzHC8VEd/XzezF5e68KlkT4/ggELw/nR1tv863jY6ufKTvDlzCMZvhe06codbbA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" + integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== dependencies: d3-array "^2.3.0" d3-format "1 - 2" d3-interpolate "1.2.0 - 2" - d3-time "1 - 2" + d3-time "^2.1.1" d3-time-format "2 - 3" d3-selection@1: @@ -1624,7 +1619,7 @@ d3-shape@2: dependencies: d3-time "1 - 2" -"d3-time@1 - 2", d3-time@2: +"d3-time@1 - 2", d3-time@2, d3-time@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== @@ -1659,9 +1654,9 @@ d3-zoom@2: d3-transition "2" d3@^6.2.0: - version "6.6.2" - resolved "https://registry.yarnpkg.com/d3/-/d3-6.6.2.tgz#5d2133298b7adbf065d8274b77b36b429f6da3ee" - integrity sha512-wvC9cZe05bUCo00VFKXLQJWmWhGv0U43Qv0gn+tkl144S7bV22E80Gnp06BEuJVuwVfa6+S8UOfl8H9Ru/cmgA== + version "6.7.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-6.7.0.tgz#adac458597b4a2cafe8e08cf30948af0c95cd61f" + integrity sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g== dependencies: d3-array "2" d3-axis "2" @@ -1863,7 +1858,7 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== -domhandler@^4.0.0, domhandler@^4.1.0, domhandler@^4.2.0: +domhandler@^4.0.0, domhandler@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== @@ -1898,10 +1893,10 @@ ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: dependencies: safe-buffer "^5.0.1" -electron-to-chromium@^1.3.712: - version "1.3.717" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz#78d4c857070755fb58ab64bcc173db1d51cbc25f" - integrity sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ== +electron-to-chromium@^1.3.723: + version "1.3.727" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" + integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== emoji-regex@^6.1.3: version "6.5.1" @@ -2158,9 +2153,9 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3 integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@^7.24.0: version "7.25.0" @@ -2313,11 +2308,6 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-memoize@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" - integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== - fast-safe-stringify@^2.0.4: version "2.0.7" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" @@ -2570,9 +2560,9 @@ glob-parent@^5.0.0, glob-parent@~5.1.0: is-glob "^4.0.1" glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2969,12 +2959,12 @@ internmap@^1.0.0: integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== intl-messageformat@^9.3.15: - version "9.6.7" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.6.7.tgz#ce38c8c8903106cce37f0d7ad9595b4e552303e2" - integrity sha512-31+sJcg3txHZSCwTxGXAPXaOxFv+VVvNI42YKBBUHVKmdneEpoXBwqGyUYzzsz9Z10umpUKGEVL3P9DzXO+gOg== + version "9.6.12" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.6.12.tgz#4794aa6b7beb74ec7dc7bffe7487bcf432c6cb87" + integrity sha512-4oLEiYRWq+GAYETFxYOaGPWb9CT7j9F5UavhXIvBdbcsLIbaQFAa3LQBJh/9/NgV0Y8ZTzX2z+A1sf2AzslWxw== dependencies: - "@formatjs/icu-messageformat-parser" "1.1.5" - fast-memoize "^2.5.2" + "@formatjs/fast-memoize" "1.1.1" + "@formatjs/icu-messageformat-parser" "2.0.0" tslib "^2.1.0" is-arrayish@^0.2.1: @@ -2988,9 +2978,9 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== is-binary-path@~2.1.0: version "2.1.0" @@ -3019,16 +3009,16 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887" + integrity sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw== dependencies: has "^1.0.3" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.3.tgz#4c0802ae9c8097939ea8001eaae3c502f3dbe72f" + integrity sha512-tDpEUInNcy2Yw3lNSepK3Wdw1RnXLcIVienz6Ou631Acl15cJyRWK4dgA1vCmOEgIbtOV0W7MHg+AR2Gdg1NXQ== is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" @@ -3392,11 +3382,11 @@ lint-staged@>=10: stringify-object "^3.3.0" listr2@^3.2.2: - version "3.7.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.7.1.tgz#ff0c410b10eb1c5c76735e4814128ec8f7d2b983" - integrity sha512-cNd368GTrk8351/ov/IV+BSwyf9sJRgI0UIvfORonCZA1u9UHAtAlqSEv9dgafoQIA1CgB3nu4No79pJtK2LHw== + version "3.8.2" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.8.2.tgz#99b138ad1cfb08f1b0aacd422972e49b2d814b99" + integrity sha512-E28Fw7Zd3HQlCJKzb9a8C8M0HtFWQeucE+S8YrSrqZObuCLPRHMRrR8gNmYt65cU9orXYHwvN5agXC36lYt7VQ== dependencies: - chalk "^4.1.0" + chalk "^4.1.1" cli-truncate "^2.1.0" figures "^3.2.0" indent-string "^4.0.0" @@ -3486,7 +3476,7 @@ lodash.union@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= -lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3905,9 +3895,9 @@ p-cancelable@^1.0.0: integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== p-cancelable@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.0.tgz#4d51c3b91f483d02a0d300765321fca393d758dd" - integrity sha512-HAZyB3ZodPo+BDpb4/Iu7Jv4P6cSazBz9ZM0ChhEXp70scx834aWCEjQRwgt41UzzejUAPdbqqONfRWTPYrPAQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== p-limit@^1.1.0: version "1.3.0" @@ -4102,9 +4092,9 @@ postcss-value-parser@^4.1.0: integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== postcss@^8.2.1: - version "8.2.10" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.10.tgz#ca7a042aa8aff494b334d0ff3e9e77079f6f702b" - integrity sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw== + version "8.2.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.14.tgz#dcf313eb8247b3ce8078d048c0e8262ca565ad2b" + integrity sha512-+jD0ZijcvyCqPQo/m/CW0UcARpdFylq04of+Q7RKX6f/Tu+dvpUI/9Sp81+i6/vJThnOBX09Quw0ZLOVwpzX3w== dependencies: colorette "^1.2.2" nanoid "^3.1.22" @@ -4453,9 +4443,9 @@ rimraf@^3.0.2: glob "^7.1.3" rollup@^2.38.5: - version "2.45.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.45.2.tgz#8fb85917c9f35605720e92328f3ccbfba6f78b48" - integrity sha512-kRRU7wXzFHUzBIv0GfoFFIN3m9oteY4uAsKllIpQDId5cfnkWF2J130l+27dzDju0E6MScKiV0ZM5Bw8m4blYQ== + version "2.47.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.47.0.tgz#9d958aeb2c0f6a383cacc0401dff02b6e252664d" + integrity sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg== optionalDependencies: fsevents "~2.3.1" @@ -4494,11 +4484,11 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass@^1.0.0: - version "1.32.8" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.8.tgz#f16a9abd8dc530add8834e506878a2808c037bdc" - integrity sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ== + version "1.32.12" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.12.tgz#a2a47ad0f1c168222db5206444a30c12457abb9f" + integrity sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA== dependencies: - chokidar ">=2.0.0 <4.0.0" + chokidar ">=3.0.0 <4.0.0" sax@0.5.x: version "0.5.8" @@ -4650,10 +4640,10 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slice-ansi@^3.0.0: version "3.0.0" @@ -4674,9 +4664,9 @@ slice-ansi@^4.0.0: is-fullwidth-code-point "^3.0.0" slugify@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.5.0.tgz#5f3c8e2a84105b54eb51486db1b468a599b3c9b8" - integrity sha512-Q2UPZ2udzquy1ElHfOLILMBMqBEXkiD3wE75qtBvV+FsDdZZjUqPZ44vqLTejAVq+wLLHacOMcENnP8+ZbzmIA== + version "1.5.1" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.5.1.tgz#ef268872982a3a3b18f213ddee8cd1a28ac7a130" + integrity sha512-54gP60qIkxaUCFXORn/u+tNPqdTsqvqonB2nxjQV52wWTCuJJ4kbfU7URkpn8646Lr2T3CSh8ecDzzBK/dD9jA== source-map@^0.5.0: version "0.5.7" @@ -4919,10 +4909,10 @@ svelte-fa@^2.2.0: resolved "https://registry.yarnpkg.com/svelte-fa/-/svelte-fa-2.2.0.tgz#2b2282ee83e550ab29317a1955bdef53321e9110" integrity sha512-PN1H8AWDh+OwhwjJKTv4/zXvKvmvOEVSCVhIhji6Onx8XEw+CGf8BDR0BVUIp87IEX+DEqIo9pbyhgz8EoYZyA== -svelte-hmr@^0.14.0: - version "0.14.2" - resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.14.2.tgz#458e02627505e72e8baf2bfb887a3c00822ddeb4" - integrity sha512-aVIRSCRpOFGuLqjg12Z5hBhvjrrlqkJVMMGEK14iVD0kXI4l5dkpHCj35AEyieWNvyYTMtlyhZlpKPrIjFpxxQ== +svelte-hmr@^0.14.2: + version "0.14.3" + resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.14.3.tgz#b6a6781bc923352e3c257ccd7d87d01821ea2d95" + integrity sha512-N56xX405zLMw2tpGHKRx5h+kmdeZwxI21pvyC6OyBHJDCF6DlwWBm9TifdQmSD4dloWSmpDPzHWYa3CSjfopUg== svelte-i18n@^3.3.9: version "3.3.9" @@ -4936,16 +4926,16 @@ svelte-i18n@^3.3.9: tiny-glob "^0.2.6" svelte-markdown@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/svelte-markdown/-/svelte-markdown-0.1.6.tgz#270aba681d40a8c68323119298144b04d9c9c622" - integrity sha512-oUZyPqglQtrYySlnjctjtPZ0WiJP2xU9VcRWKYWjhbpTU4b7i7UPjF4FEmnDM8dMvLC5/aFC3kULKwOaW0gzug== + version "0.1.8" + resolved "https://registry.yarnpkg.com/svelte-markdown/-/svelte-markdown-0.1.8.tgz#bd1b7f712de16a51a9afa0f1fd6f8a317a32ad86" + integrity sha512-QceqoS3LM3srpNzjB9EKfJYSCRLLmATdpqXuK7YoDj+Lnpbf7AhZ5Doq9OvNfOSFY00EJv8tT1j9QSFRubVe4A== dependencies: marked "^2.0.0" svelte-preprocess@^4.0.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.7.0.tgz#10a0acf1a8b1afdd7e0aff3769f4175eb77776fe" - integrity sha512-iNrY4YGqi0LD2e6oT9YbdSzOKntxk8gmzfqso1z/lUJOZh4o6fyIqkirmiZ8/dDJFqtIE1spVgDFWgkfhLEYlw== + version "4.7.3" + resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.7.3.tgz#454fa059c2400b15e7a3caeca18993cff9df0e96" + integrity sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA== dependencies: "@types/pug" "^2.0.4" "@types/sass" "^1.16.0" @@ -4953,24 +4943,21 @@ svelte-preprocess@^4.0.0: strip-indent "^3.0.0" svelte@^3.32.1: - version "3.37.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.37.0.tgz#dc7cd24bcc275cdb3f8c684ada89e50489144ccd" - integrity sha512-TRF30F4W4+d+Jr2KzUUL1j8Mrpns/WM/WacxYlo5MMb2E5Qy2Pk1Guj6GylxsW9OnKQl1tnF8q3hG/hQ3h6VUA== + version "3.38.2" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.38.2.tgz#55e5c681f793ae349b5cc2fe58e5782af4275ef5" + integrity sha512-q5Dq0/QHh4BLJyEVWGe7Cej5NWs040LWjMbicBGZ+3qpFWJ1YObRmUDZKbbovddLC9WW7THTj3kYbTOFmU9fbg== table@^6.0.4: - version "6.1.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.1.0.tgz#676a0cfb206008b59e783fcd94ef8ba7d67d966c" - integrity sha512-T4G5KMmqIk6X87gLKWyU5exPpTjLjY5KyrFWaIjv3SvgaIUGXV7UEzGEnZJdTA38/yUS6f9PlKezQ0bYXG3iIQ== + version "6.7.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.0.tgz#26274751f0ee099c547f6cb91d3eff0d61d155b2" + integrity sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw== dependencies: ajv "^8.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" lodash.clonedeep "^4.5.0" - lodash.flatten "^4.4.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" tar-fs@^2.0.0, tar-fs@^2.1.1: version "2.1.1" @@ -5077,7 +5064,7 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0: +tslib@^2.1.0, tslib@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== @@ -5112,9 +5099,9 @@ type-fest@^0.8.1: integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== type-fest@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.0.2.tgz#3f9c39982859f385c77c38b7e5f1432b8a3661c6" - integrity sha512-a720oz3Kjbp3ll0zkeN9qjRhO7I34MKMhPGQiQJAmaZQZQ1lo+NWThK322f7sXV+kTg9B1Ybt16KgBXWgteT8w== + version "1.1.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.1.0.tgz#e7eba55da6a46d5c23c05021de5f5af30d1d7978" + integrity sha512-FOsvVPp1WTW495bqemynRS6f6Izea0hKSuDGCxkisBi6KIFaIc8r+ZCs20VT8bySbjh3J9kmnu2eHG4NoZArMw== type-of-is@^3.4.0: version "3.5.1" @@ -5249,10 +5236,10 @@ validator@^13.0.0, validator@^13.6.0: resolved "https://registry.yarnpkg.com/validator/-/validator-13.6.0.tgz#1e71899c14cdc7b2068463cb24c1cc16f6ec7059" integrity sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg== -vite@^2.1.0: - version "2.1.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-2.1.5.tgz#4857da441c62f7982c83cbd5f42a00330f20c9c1" - integrity sha512-tYU5iaYeUgQYvK/CNNz3tiJ8vYqPWfCE9IQ7K0iuzYovWw7lzty7KRYGWwV3CQPh0NKxWjOczAqiJsCL0Xb+Og== +vite@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.2.4.tgz#8f9cc85aacab04c850085894b086c8717f12ed16" + integrity sha512-vnIwSNci+phFMp6krhy+FbYzKL0R67Sdt9mVZ96S27AewrApSJjTqncJcalk8sf60BgcbW4+1C6DFIWkxquO9g== dependencies: esbuild "^0.9.3" postcss "^8.2.1"