From d87cf5df8265b88777538f9cfc1fd26132bc8069 Mon Sep 17 00:00:00 2001 From: takurinton Date: Sat, 21 Oct 2023 10:07:36 +0900 Subject: [PATCH 1/9] maintenance (#195) feedf fix sentense remove prerender fix lint file update packages remove dependabot ... --- .github/dependabot.yml | 13 -- bun.lockb | Bin 121287 -> 131420 bytes package.json | 25 ++-- scripts/make-feed.js => plugins/feed/index.js | 21 ++- .../pre-build.js => plugins/sentence/index.js | 22 ++- public/index.html | 4 +- public/{index.tsx => index.js} | 9 -- public/{prerender.tsx => prerender.js} | 3 +- public/types.d.ts | 5 - scripts/prerender.js | 140 ------------------ tsconfig.json | 2 +- wmr.config.js | 13 ++ wmr.config.ts | 8 - 13 files changed, 63 insertions(+), 202 deletions(-) delete mode 100644 .github/dependabot.yml rename scripts/make-feed.js => plugins/feed/index.js (79%) rename scripts/pre-build.js => plugins/sentence/index.js (82%) rename public/{index.tsx => index.js} (70%) rename public/{prerender.tsx => prerender.js} (85%) delete mode 100644 public/types.d.ts delete mode 100644 scripts/prerender.js create mode 100644 wmr.config.js delete mode 100644 wmr.config.ts diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 97b6932..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "daily" - ignore: - - dependency-name: "*" - update-types: ["version-update:semver-patch"] - - dependency-name: "@types/node" - versions: ["18.x"] - reviewers: - - "takurinton" diff --git a/bun.lockb b/bun.lockb index ebc253db1642ceb8114ee787f50b99199678be75..eaf98e5242bb0c7bd558889804a5f0f3f7ade312 100755 GIT binary patch delta 32667 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 { +export default function feedPlugin({ plugins, cwd, prod }, opts) { + plugins.push(feed({ cwd, prod, ...opts })); +} + +function feed() { + return { + name: "feed", + async load() { + makeFeed(); + }, + }; +} + +function makeFeed() { const posts = JSON.parse( readFileSync(`${process.cwd()}/public/contents/posts.json`) ); @@ -29,7 +42,7 @@ import { writeFileSync, readFileSync, readdirSync } from "fs"; ${content.title} | たくりんとんのブログ https://blog.takurinton.dev/post/${content.id} ${new Date(content.created_at).toUTCString()} - ${content.content} + ${content.description} https://blog.takurinton.dev/post/${content.id} ` ) @@ -41,4 +54,4 @@ import { writeFileSync, readFileSync, readdirSync } from "fs"; if (err) throw err; console.log(`posts.json updated.`); }); -})(); +} diff --git a/scripts/pre-build.js b/plugins/sentence/index.js similarity index 82% rename from scripts/pre-build.js rename to plugins/sentence/index.js index f7dc778..5092506 100644 --- a/scripts/pre-build.js +++ b/plugins/sentence/index.js @@ -1,20 +1,34 @@ import { writeFileSync, readFileSync, readdirSync } from "fs"; import { marked } from "marked"; -const markdownToString = (markdown) => { +export default function sentensePlugin({ plugins, cwd, prod }, opts) { + plugins.push(sentense({ cwd, prod, ...opts })); +} + +function sentense() { + return { + name: "feed", + enforce: "pre", + configResolved() { + makeListObject(); + }, + }; +} + +function markdownToString(markdown) { const html = marked(markdown); const notTag = html.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, ""); const breakToSpace = notTag.replace(/(\r\n|\n|\r)/gm, " "); const removeTwitter = breakToSpace.replace(/@twitter\[.*\]/g, ""); const removeOg = removeTwitter.replace(/@og\[.*\]/g, ""); return removeOg; -}; +} const FRONTMATTER = /---\n([\s\S]*?)\n---\n\n([\s\S]*)/; const FRONTMATTER_LIST = /id:([\s\S]*)\ntitle:([\s\S]*)\ndescription:([\s\S]*)\ncreated_at:([\s\S]*)/; -(() => { +function makeListObject() { const files = readdirSync(`${process.cwd()}/public/contents`); const posts = files.filter((file) => file.match(/\.md$/)); const contents = posts.map((post) => { @@ -50,4 +64,4 @@ const FRONTMATTER_LIST = console.log(`posts.json updated.`); } ); -})(); +} diff --git a/public/index.html b/public/index.html index be5474a..df470a3 100644 --- a/public/index.html +++ b/public/index.html @@ -9,7 +9,7 @@ href="https://takurinton.dev/favicon.ico" type="image/x-icon" /> - + @@ -20,6 +20,6 @@ - + diff --git a/public/index.tsx b/public/index.js similarity index 70% rename from public/index.tsx rename to public/index.js index 7eb0c09..1dcf366 100644 --- a/public/index.tsx +++ b/public/index.js @@ -4,9 +4,6 @@ import Header from "./header"; import Home from "./pages/home"; import Post from "./pages/post"; -// eslint-disable-next-line no-unused-vars -import { h } from "preact"; - export function App() { return ( @@ -31,9 +28,3 @@ if (typeof window !== "undefined") { export async function prerender() { return (await import("./prerender.js")).prerender(); } - -// eslint-disable-next-line no-undef -const m: GlobalNodeModule = - // eslint-disable-next-line no-undef - typeof module !== "undefined" ? module : ({} as any); -if (m.hot) m.hot.accept((u) => hydrate(, document.body)); diff --git a/public/prerender.tsx b/public/prerender.js similarity index 85% rename from public/prerender.tsx rename to public/prerender.js index 50991e9..bb46fdc 100644 --- a/public/prerender.tsx +++ b/public/prerender.js @@ -1,8 +1,7 @@ import { prerender as ssr } from "preact-iso"; -import { VNode } from "preact"; import { toStatic } from "hoofd/preact"; -export async function prerender(vnode: VNode) { +export async function prerender(vnode) { const res = await ssr(vnode); const head = toStatic(); diff --git a/public/types.d.ts b/public/types.d.ts deleted file mode 100644 index ab00de8..0000000 --- a/public/types.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare type GlobalNodeModule = { - hot?: { - accept: (cb: (u: any) => void) => void; - }; -} & NodeModule; diff --git a/scripts/prerender.js b/scripts/prerender.js deleted file mode 100644 index b557885..0000000 --- a/scripts/prerender.js +++ /dev/null @@ -1,140 +0,0 @@ -import { Worker } from "worker_threads"; - -/** - * worker のコード - * 現状 build は wmr を使っているのでファイルや meta タグの取得のルールは wmr に乗っかっている - * build を rollup にするタイミングでここは書き直す - * @memo ファイルベースルーティングにしたい - */ -async function generateStaticFiles() { - const publicPath = `./public`; - - const path = require("path"); - const fs = require("fs").promises; - - const template = await fs.readFile( - path.resolve("./dist", "index.html"), - "utf-8" - ); - - const match = /]*?)?\s+src=(['"]?)([^>]*?)\1(?:\s[^>]*?)?>/g - .exec(template)[2] - .replace(publicPath, "") - .replace(/^(\.?\/)?/g, ""); - - // 最終的な script - // file splitting はしてないので単一ファイルでいい - const script = path.resolve("./dist", match); - - delete globalThis.fetch; - globalThis.fetch = async (url) => { - const text = () => - fs.readFile(`./dist/${String(url).replace(/^\//, "")}`, "utf-8"); - return { text, json: () => text().then(JSON.parse) }; - }; - - // prerender する時に location がないとエラーになるので仮の location を設定 - // パスは現在 prerender してるページのパス - globalThis.location = new URL("/", "http://localhost"); - // ユーザー定義の prerender 関数を import - const userPrerender = (await import("file:///" + script)).prerender; - - let routes = []; - // 初めに home を prerender - const res = await userPrerender({ - ssr: true, - url: "/", - route: [{ url: "/" }], - }); - const home = { path: "/", html: res.html, head: res.head }; - routes.push(home); - - // post を prerender - const postPaths = Array.from(res.links).filter((p) => p !== "/"); - for (const url of postPaths) { - globalThis.location = new URL(url, "http://localhost"); - const post = await userPrerender({ - ssr: true, - url, - route: [{ url }], - }); - - // 意図的に必要な情報だけ取得してる - const i = { path: url, html: post.html, head: post.head }; - routes.push(i); - } - - function headToString(element) { - // こういう形式: [{ type: "meta", props: { name: "...", content: "..." }}] - const { type, props } = element; - const properties = Object.keys(props) - .map((p) => `${p}="${props[p]}"`) - .join(" "); - - return `<${type} ${properties}>`; - } - - // html に書き出す - for (const route of routes) { - const { path: _path, html: _html, head } = route; - // hoofd/preact 経由で取得した情報をベースになる html に差し込む - let html = template; - - // title タグを置き換える - html = html.replace("", `${head.title}`); - - // head タグを置き換える - let headHtml = Array.from(head.elements).map(headToString).join(""); - html = html.replace("", `${headHtml}`); - - // body にコンテンツを差し込む - html = html.replace( - /]*?)?>[\s\S]*?<\/body>/, - `${_html}` - ); - - // JS をロードする - html = html.replace( - '', - `` - ); - - // 書き込む - const dir = path.resolve(`./dist${_path}`); - await fs.mkdir(dir, { recursive: true }); - await fs.writeFile(path.resolve(dir, "index.html"), html, "utf-8"); - } - - console.log("generated static html files"); - console.log('build finished in "dist" directory'); -} - -function prerender() { - const worker = new Worker( - `(${generateStaticFiles})(require('worker_threads').workerData) - .then(r => require('worker_threads').parentPort.postMessage([1,r])) - .catch(err => require('worker_threads').parentPort.postMessage([0,err && err.stack || err+'']))`, - { - eval: true, - stderr: true, - } - ); - - worker.stderr.on("data", (m) => { - if (!/^\(node:\d+\) ExperimentalWarning:/.test(m.toString("utf-8"))) - process.stderr.write(m); - }); - - return new Promise((resolve, reject) => { - const bubbleError = (error) => { - reject(error); - }; - worker.on("message", ([f, d]) => (f ? resolve(d) : bubbleError(d))); - worker.once("error", bubbleError); - worker.once("exit", resolve); - }); -} - -(async () => { - await prerender(); -})(); diff --git a/tsconfig.json b/tsconfig.json index 8724cad..e600ecf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,6 @@ "noEmit": true, "skipLibCheck": true }, - "include": ["./**/*.ts", "./**/*.tsx", "public/header/index.js"], + "include": ["./**/*.ts", "./**/*.tsx"], "exclude": ["node_modules", "dist"] } diff --git a/wmr.config.js b/wmr.config.js new file mode 100644 index 0000000..ca78312 --- /dev/null +++ b/wmr.config.js @@ -0,0 +1,13 @@ +import feedPlugin from "./plugins/feed/index.js"; +import sentensePlugin from "./plugins/sentence/index.js"; + +export default function (config) { + sentensePlugin(config); + feedPlugin(config); + + return { + alias: { + "src/*": "src", + }, + }; +} diff --git a/wmr.config.ts b/wmr.config.ts deleted file mode 100644 index cab051b..0000000 --- a/wmr.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -export default function () { - return { - alias: { - "src/*": "src", - }, - // customRoutes: ["/rss.xml"], - }; -} From 13b3cf47952516eaa118ff2c4e25b06de52bd120 Mon Sep 17 00:00:00 2001 From: takurinton Date: Sat, 21 Oct 2023 10:24:52 +0900 Subject: [PATCH 2/9] use jsdoc --- ...{useClientAssets.ts => useClientAssets.js} | 15 +++++---- src/hooks/{useMetas.ts => useMetas.js} | 13 ++++---- src/hooks/{usePost.ts => usePost.js} | 33 ++++++++----------- src/md/{getHtml.ts => getHtml.js} | 9 +++++ src/md/{index.ts => index.js} | 0 src/md/{markdown-init.ts => markdown-init.js} | 14 ++++---- src/md/{markdown.ts => markdown.js} | 8 ++++- src/md/{plugin.ts => plugin.js} | 4 +++ src/md/{renderer.ts => renderer.js} | 5 ++- ...upClientAssets.ts => setupClientAssets.js} | 3 ++ ...etupHighlightjs.ts => setupHighlightjs.js} | 5 +-- .../{setupTwitter.ts => setupTwitter.js} | 3 ++ tsconfig.json | 3 -- 13 files changed, 67 insertions(+), 48 deletions(-) rename src/hooks/{useClientAssets.ts => useClientAssets.js} (80%) rename src/hooks/{useMetas.ts => useMetas.js} (64%) rename src/hooks/{usePost.ts => usePost.js} (73%) rename src/md/{getHtml.ts => getHtml.js} (78%) rename src/md/{index.ts => index.js} (100%) rename src/md/{markdown-init.ts => markdown-init.js} (72%) rename src/md/{markdown.ts => markdown.js} (51%) rename src/md/{plugin.ts => plugin.js} (95%) rename src/md/{renderer.ts => renderer.js} (94%) rename src/utils/{setupClientAssets.ts => setupClientAssets.js} (98%) rename src/utils/{setupHighlightjs.ts => setupHighlightjs.js} (82%) rename src/utils/{setupTwitter.ts => setupTwitter.js} (91%) diff --git a/src/hooks/useClientAssets.ts b/src/hooks/useClientAssets.js similarity index 80% rename from src/hooks/useClientAssets.ts rename to src/hooks/useClientAssets.js index 16816ac..fa98e88 100644 --- a/src/hooks/useClientAssets.ts +++ b/src/hooks/useClientAssets.js @@ -3,13 +3,14 @@ import { setupClientAssets } from "src/utils/setupClientAssets"; import { setupHighlightjs } from "src/utils/setupHighlightjs"; import { setupTwitter } from "src/utils/setupTwitter"; -declare global { - // eslint-disable-next-line no-unused-vars - interface Window { - twttr: any; - } -} - +/** + * Perform client rendering when: + * 1. Call highlightjs when markdown code tag exists + * 2. Call widget when Twitter embed exists + * 3. Call renderer when OG embedding exists + * + * @param {string} content + */ export const useClientAssets = (content) => { useEffect(() => { if (/
.*/.test(content)) {
diff --git a/src/hooks/useMetas.ts b/src/hooks/useMetas.js
similarity index 64%
rename from src/hooks/useMetas.ts
rename to src/hooks/useMetas.js
index 38b7756..3e0432f 100644
--- a/src/hooks/useMetas.ts
+++ b/src/hooks/useMetas.js
@@ -1,12 +1,11 @@
 import { useTitle, useMeta } from "hoofd/preact";
 
-export const useMetas = ({
-  title = "",
-  description = "",
-}: {
-  title?: string;
-  description?: string;
-}) => {
+/**
+ * set meta tags when server rendering and client rendering
+ *
+ * @param {{title: string, description: string}} param
+ */
+export const useMetas = ({ title = "", description = "" }) => {
   useTitle(title);
   useMeta({ name: "og:title", content: `takurinton | ${title}` });
   useMeta({ property: "twitter:title", content: `takurinton | ${title}` });
diff --git a/src/hooks/usePost.ts b/src/hooks/usePost.js
similarity index 73%
rename from src/hooks/usePost.ts
rename to src/hooks/usePost.js
index 36acb79..5dc0b7b 100644
--- a/src/hooks/usePost.ts
+++ b/src/hooks/usePost.js
@@ -1,30 +1,25 @@
 import { useState } from "preact/hooks";
 import { markdown, MarkdownInit } from "src/md";
 
-type FetchPost = {
-  mdStr: string;
-  meta: {};
-};
-
-type Post = {
-  id: string;
-  title: string;
-  description: string;
-  createdAt: string;
-  content: string;
-};
-
-type Response = Post | Error;
-
 const CACHE = new Map();
 
-async function fetchPost(url?: string): Promise {
+/**
+ * @param {string | undefined} url
+ * @returns {Promise<{mdStr: string, meta: {}}>}
+ */
+async function fetchPost(url) {
   const mdStr = await fetch(url).then((res) => res.text());
   const meta = {};
   return { mdStr, meta };
 }
 
-export function usePost(id: string): Response {
+/**
+ * get post data from markdown file
+ *
+ * @param {number} id
+ * @returns
+ */
+export function usePost(id) {
   const url = `/contents/${id}.md`;
   const [, setPost] = useState(0);
   let post = CACHE.get(url);
@@ -32,7 +27,7 @@ export function usePost(id: string): Response {
     post = fetchPost(url);
     CACHE.set(url, post);
     post.then(
-      (value: FetchPost) => {
+      (value) => {
         const md = new MarkdownInit(value.mdStr);
         const title = md.getTitle();
         const createdAt = md.getCreatedAt();
@@ -41,7 +36,7 @@ export function usePost(id: string): Response {
         post.value = { id, title, description, createdAt, content };
         setPost(post);
       },
-      (error: any) => {
+      (error) => {
         post.error = error;
         setPost(post);
       }
diff --git a/src/md/getHtml.ts b/src/md/getHtml.js
similarity index 78%
rename from src/md/getHtml.ts
rename to src/md/getHtml.js
index 4e88794..51f2afc 100644
--- a/src/md/getHtml.ts
+++ b/src/md/getHtml.js
@@ -1,3 +1,7 @@
+/**
+ * @param {string} url
+ * @returns {Promise<{title: string, description: string, image: string}>}
+ */
 const getMetaTags = async (url) => {
   if (!url) {
     return {
@@ -11,6 +15,11 @@ const getMetaTags = async (url) => {
   return json;
 };
 
+/**
+ * @param {string} url
+ * @param {number} id
+ * @returns {Promise}
+ */
 export const getHtml = async (url, id) => {
   const { title, description, image } = await getMetaTags(url);
 
diff --git a/src/md/index.ts b/src/md/index.js
similarity index 100%
rename from src/md/index.ts
rename to src/md/index.js
diff --git a/src/md/markdown-init.ts b/src/md/markdown-init.js
similarity index 72%
rename from src/md/markdown-init.ts
rename to src/md/markdown-init.js
index e9535dd..7e12db7 100644
--- a/src/md/markdown-init.ts
+++ b/src/md/markdown-init.js
@@ -1,14 +1,12 @@
+/**
+ * @todo replace to some kind of interface or ...??
+ */
 export class MarkdownInit {
-  md: RegExpMatchArray;
-  frontmatter: string;
-  content: string;
-  frontmatterList: Array;
-
-  private FRONTMATTER = /---\n([\s\S]*?)\n---\n\n([\s\S]*)/;
-  private FRONTMATTER_LIST =
+  FRONTMATTER = /---\n([\s\S]*?)\n---\n\n([\s\S]*)/;
+  FRONTMATTER_LIST =
     /id:([\s\S]*)\ntitle:([\s\S]*)\ndescription:([\s\S]*)\ncreated_at:([\s\S]*)/;
 
-  constructor(md: string) {
+  constructor(md) {
     this.md = md.match(this.FRONTMATTER);
     this.frontmatter = this.md[1];
     this.content = this.md[2];
diff --git a/src/md/markdown.ts b/src/md/markdown.js
similarity index 51%
rename from src/md/markdown.ts
rename to src/md/markdown.js
index 57ab26b..6b84173 100644
--- a/src/md/markdown.ts
+++ b/src/md/markdown.js
@@ -2,7 +2,13 @@ import { marked } from "marked";
 import { renderer } from "./renderer";
 import { plugin } from "./plugin";
 
-export function markdown(md: string) {
+/**
+ * parse markdown string to html string using marked
+ *
+ * @param {string} md - markdown string
+ * @returns markdown string
+ */
+export function markdown(md) {
   marked.use({ renderer, ...plugin });
   return marked.parse(md);
 }
diff --git a/src/md/plugin.ts b/src/md/plugin.js
similarity index 95%
rename from src/md/plugin.ts
rename to src/md/plugin.js
index 220ccb8..1d94b40 100644
--- a/src/md/plugin.ts
+++ b/src/md/plugin.js
@@ -1,3 +1,7 @@
+/**
+ * marked plugin
+ * @see https://marked.js.org/using_pro#extensions
+ */
 export const plugin = {
   extensions: [
     {
diff --git a/src/md/renderer.ts b/src/md/renderer.js
similarity index 94%
rename from src/md/renderer.ts
rename to src/md/renderer.js
index 386fe5f..1366ef9 100644
--- a/src/md/renderer.ts
+++ b/src/md/renderer.js
@@ -1,3 +1,6 @@
+/**
+ * markdown renderer for marked
+ */
 export const renderer = {
   heading(text, level) {
     if (level === 1) {
@@ -13,7 +16,7 @@ export const renderer = {
         
       `;
   },
-  list(body: string, ordered: boolean, start: number) {
+  list(body, ordered, start) {
     if (ordered) {
       return `
           
    diff --git a/src/utils/setupClientAssets.ts b/src/utils/setupClientAssets.js similarity index 98% rename from src/utils/setupClientAssets.ts rename to src/utils/setupClientAssets.js index 2908432..a3f6bb8 100644 --- a/src/utils/setupClientAssets.ts +++ b/src/utils/setupClientAssets.js @@ -2,6 +2,9 @@ import { getHtml } from "src/md/getHtml"; const CACHE = new Map(); +/** + * Set external link card when OG embedding exists + */ export const setupClientAssets = () => { (async () => { const og = document.getElementsByClassName("og"); diff --git a/src/utils/setupHighlightjs.ts b/src/utils/setupHighlightjs.js similarity index 82% rename from src/utils/setupHighlightjs.ts rename to src/utils/setupHighlightjs.js index 47dea5f..d4c8c9b 100644 --- a/src/utils/setupHighlightjs.ts +++ b/src/utils/setupHighlightjs.js @@ -1,5 +1,6 @@ -// bundle に混ぜ込むと謎にエラーになるので、分ける -// この命令的なコードが俺の技術力の低さの証明になっている気がしてならない、こんなことしてないでバンドルチューニングをすればいいだけでは +/** + * Set highlightjs when markdown code tag exists + */ export const setupHighlightjs = () => { const highlightjs = document.getElementById("highlightjs"); const highlightcss = document.getElementById("highlightcss"); diff --git a/src/utils/setupTwitter.ts b/src/utils/setupTwitter.js similarity index 91% rename from src/utils/setupTwitter.ts rename to src/utils/setupTwitter.js index ee6bbf8..2d9d3bf 100644 --- a/src/utils/setupTwitter.ts +++ b/src/utils/setupTwitter.js @@ -1,3 +1,6 @@ +/** + * Setup Twitter widget when Twitter embed exists + */ export const setupTwitter = async () => { const script = Object.assign(document.createElement("script"), { innerHTML: `window.twttr = (function(d, s, id) { diff --git a/tsconfig.json b/tsconfig.json index e600ecf..2972919 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,6 @@ { "compilerOptions": { "baseUrl": "./", - "paths": { - "lib/*": ["foo/lib/*"] - }, "jsx": "react", "jsxFactory": "h", "lib": ["ES2022"], From b295721428eb552377d04fa3bd774d19a31951be Mon Sep 17 00:00:00 2001 From: takurinton Date: Tue, 19 Mar 2024 06:27:13 +0900 Subject: [PATCH 3/9] fix posts --- public/contents/posts.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/contents/posts.json b/public/contents/posts.json index ae7aff1..d64590b 100644 --- a/public/contents/posts.json +++ b/public/contents/posts.json @@ -1 +1 @@ -[{"id":"5","title":"OngaqJS触ってみた","description":"はじめに こんにちは ポートフォリオ(おふざけ入ってるあれです)にリンク貼ってあるOngaqJSについてのソースコードをまとめてみたので記事にしました。 #OngaqJSとはなんぞや? OngaqJSとは、JavaScriptで音楽が作成できるというAPIです。 Keyの取得はこちらから 有料枠と無料枠があり、使える楽器の種類などが異なる模様(有料会員になろうかな) ぽちぽちしていけば簡単に登録で...","created_at":"2020-04-24"},{"id":"6","title":"GWの過ごし方","description":"どうも 皆さん、コロナですがどうお過ごしでしょうか?僕はとっても暇です(ほんとは暇ではないのですがそこは割愛) まあ、今日はほんとに暑くて、気温が23度もあったらしくて、そんなことどうでもいいので本題に移りましょう。 散歩をしてきた 私は散歩がとっても好きで、音楽を爆音で流しながら散歩をします。 そこで、ふと思いついた、大学1年生の時Javaで素数の列挙書いたなあ、でも汚いコードだったなあ という...","created_at":"2020-05-01"},{"id":"8","title":"Djangoのすゝめ","description":"Djangoって知ってますか? Djangoって知ってます?DjangoはPythonで書かれているWeb開発フレームワークです。フレームワークとはなんぞやって人はこちらから。 DjangoはMTVモデルというもので構成されています。MTVモデルとは、Djangoに標準装備されているモデリングのことで、この概念はやっていくうちに理解していけばいいと思います。 ちなみにMTVはなんの略かというと ...","created_at":"2020-05-16"},{"id":"9","title":"ブログを引っ越した話","description":"はじめに こんにちは。疲れた。 てことで今回は僕がはじめてAWSを使ったときに詰まったところについてまとめたいと思います!!! また、この記事はQiitaにも全く同じことが書いてありますので、見やすい方がいいなと思ったら素直にQiitaに言ってください。 URLはこちらです 僕のレベル AWSって何???? まず最初に言っておきますが、私はこのレベルの人間です。AWSって言葉は知ってるけど中身は知...","created_at":"2020-06-10"},{"id":"12","title":"サポーターズの1on1面談に参加した話","description":"こんにちは こんばんは、先日サポーターズの1on1面談イベントに参加したので記事にしたいと思います。 簡単にまとめると、とっても楽しかったし充実した時間になったけど、その分周りのエンジニア志望の学生との差を痛感してとても刺激がもらえたイベントでした!!!! 1on1面談イベントってなんだよって思った方はこちらのリンクを参照してみてください。 #事前に準備したこと このイベントは、各ターンの最初に学...","created_at":"2020-06-11"},{"id":"14","title":"冷房壊れて2週間","description":"こんにちは ハローエブリワン! 先日この記事書いてたら割と書き進めたところで下書き保存せずにブラウザ閉じて書いたもの全部消えちゃったので今日になって泣く泣く書き直してます。(他にも泣きたいことはたくさんあるのですが今回は割愛) 冷房が壊れて2週間経ちますが、だいぶきついのでそろそろ大家さんに相談しようと思ってます。 さて、今日の記事はVOYAGE GROUPのサマーインターンのTreasure...","created_at":"2020-08-05"},{"id":"16","title":"冷房壊れて3週間","description":"こんにちは 前回に引き続き、Treasureについての記事を書きます。まだエアコンが壊れているので家の中は地獄です。(๑˃̵ᴗ˂̵) 2日目の今日はGolangについての講義がありました。 自分自身Golang知らんって感じの人間なので、ヒイヒイゼエゼエしてました。また、Golang以外にもテスト駆動開発についての話や認証についての話についての講義もあり死ぬかと思いました。(生きてて良かった)...","created_at":"2020-08-08"},{"id":"17","title":"Treasureに参加した話","description":"はじめに こんにちは。僕です。 以前の記事にも書きましたが、VOYAGE GROUPのTreasureというインターンに参加したのでまとめたいと思います。 結論から言うと最高のインターンでした!!(迷惑かけてばっかりだったけど) 来年以降インターンシップに行きたいと思ってる人はぜひTreasureにも申し込んでみてください! そもそもTreasureってなんだ TreasureとはVOYAGE G...","created_at":"2020-09-02"},{"id":"18","title":"Amebaでコード書いてた","description":"こんにちは どうも、僕です。 今回はサイバーエージェントの就業型インターンに参加して、Ameba事業本部という部署で少しだけコード書かせてもらったのでそのことについて記事にしたいと思います。 参加した経緯 これは遡ること2月、、、 僕が某企業のアドテクのインターンに参加して、楽しかったことを大学の先輩のYさんに報告しました。 僕「この前アドテクのインターンに参加して、DSP周りのコードを簡単に...","created_at":"2020-09-13"},{"id":"19","title":"楽天のインターンに参加した話","description":"こんにちは どうも、僕です。今回は夏の締めくくりに参加した楽天のインターンについて書きたいと思います。楽天のインターンはここまでのインターンの中で一番辛かったような気がします(言語的な問題)海外で仕事できる気がしませんでした。そんな感じでまとめていきます。 選考 インターンには選考がつきものです。選考内容はコーディングテストと面接で、両方とも1日で終わらせます。参加者全員。 コーディングテストはc...","created_at":"2020-09-25"},{"id":"21","title":"Skywayでビデオ通話","description":"はじめに こんにちは、ブログに MaterialUIを導入してルンルンの僕です。今回はSkyWayで1対1の音声通話、またそれを文字起こしをしてGASに投げる処理までを書いたのでまとめたいと思います。GitHub Pages でデプロイしたサイトはこちらになります。レポジトリはこちらになります。 SkyWayって何? SkyWayとは、Webでリアルタイムコミュニケーションを実現する標準技術、We...","created_at":"2020-10-09"},{"id":"22","title":"音声検索β","description":"こんにちは こんにちは。僕です。今日はブログに音声検索の機能を実装したのでつまづいたところ、うまく行ったところ、逆にうまくいかなくて現状では実装できていないところなどを書いていきたいと思います。 全体のコードはこちらにあります。 実装する 実装ですが、今回は文字起こしまでをフロントエンド、形態素解析と処理はバックエンドで実装しました。フロントエンドでも文字起こしはできたのですが、形態素解析から...","created_at":"2020-10-10"},{"id":"23","title":"Django + RDS","description":"こんにちは どうも、僕です。今回はAWSのEC2にデプロイしたDjangoのプロジェクトをRDSに接続する方法について書きたいと思います。Djangoを理解してればとても簡単。困ることなんてありません。ではいきます。 バックアップを取る DjangoではデフォルトのDBとしてプロジェクトを作成したときにsqlite3のテーブルがついてきます。しかし、RDSに乗り換えるときにはsqlite3のデータ...","created_at":"2020-10-15"},{"id":"26","title":"easyjsonを使ってみた","description":"こんにちは どうも、僕です。この記事は随分前のインターン期間中に自分のために書いた記事を転載してます。 GoでJSON使う時ってだいぶめんどくさいんですよね。まあ型による安心感がバケモンなのでやった方がいいんですけど。 GoでJSONを捌く時はstructを使用します。クラスとかはないのでこれでいきます。  Unmarshal 早速やってみます。 例えばこんな感じのjsonがくるとします。 v...","created_at":"2020-10-21"},{"id":"29","title":"4日間でポートフォリオを作り替えた","description":"こんにちは どうもこんにちは。僕です。最近あったことといえば、Vのインターン落ちて落ち込んでるところに人事の方からのなぐさめのDMがきてさらに泣きそうになったところでRからの内定もらってなんだかメンタルが忙しいことです。 今回は僕がポートフォリオを作り替えた話(需要あるのか?)について話していこうと思います。 なんで作り替えたの? まずここから作り替えた理由としては3つあります。 Nex...","created_at":"2020-11-14"},{"id":"30","title":"Goのdeferに注意する","description":"はじめに 今日開発してて遭遇したエラーについて話します。短めです。よろしくお願いします。 状況 GoでAPIサーバを開発してる時に、エラーハンドリングについての実装をしていた。現状の問題としては、DBと接続する時にアプリケーションサーバ(NginxやらGolangやら)が生きてる状態でDBサーバ(今で言うRDS)が死んでる時にDBのIPアドレスとポートがクライアント側に渡されてしまうという問題が起...","created_at":"2020-11-15"},{"id":"31","title":"DjangoでUser認証機能を作る","description":"こんにちは これですどうも、僕です。この記事はKITアドベントカレンダーの4日目の記事になります。今回はユーザー認証の機能を実装してみようと思います。 やり方 Djangoではデフォルトでユーザーモデルが定義されています。今回はそれを書き換えることでユーザー認証の仕組みを作成して行こうと思います。最近だと外部の認証に任せるパターンも増えていますが、こっちの方が楽だと感じることもちょこちょこある...","created_at":"2020-12-04"},{"id":"32","title":"DRFのすゝめ","description":"こんにちは こんにちは、こんばんは、あるいはおやすみなさい。僕です。今日はDRFを布教します。みんな使って欲しいなあ。 DRFとは? これです。 https://www.django-rest-framework.org/ みんな大好きDjangoでREST APIを実装することができるようにしたフレームワークです。通常のDjangoと比較すると以下のような感じになります。 models.py、...","created_at":"2020-11-19"},{"id":"33","title":"pyparsing触ってみた","description":"こんにちは こんにちは、僕です。最近、pyparsingというPythonのライブラリを使用していて、面白いなあと思ったので記事にしてみました。元々自分は言語解析などに興味があって(NLPとか)、今回は形式言語解析になりますがまとめたいと思います。 pyparsingとは? これです。ドキュメント The pyparsing module is an alternative approach ...","created_at":"2020-11-24"},{"id":"34","title":"DRFのViewについてまとめる","description":"こんにちは どうも、こんにちは、僕です。今日はDRFのなんちゃらAPIViewについてまとめたいと思います。自分の推しはAPIViewです。対戦お願いします! DRFとは? そんなもんは自分で調べてください(辛辣) 参考までにこれは前回の記事でさらっと書いてしまったAPIView周りの深堀りみたいなイメージで描いていきます。 今回使うモデル 今回使うモデルはとてもシンプルで、以下のよう...","created_at":"2020-11-27"},{"id":"35","title":"asgiをぽよってみた","description":"こんにちは どうも、僕です。今回はDjangoでasgiを使用してみたということでチュートリアルを自分なりにまとめたいと思います。最近のブログ暇つぶしみたいな感じだったので今回は久しぶりに新しい技術に触れたアウトプット感があって良きです。浅い asgiって何? まず最初にasgiについて説明したいと思います。そもそもPythonで鯖を立てるためにはwsgiとasgiの2種類があります。 ws...","created_at":"2020-11-27"},{"id":"36","title":"asgiをぽよってみたつづき","description":"どうも こんにちは、僕です。今回は前回の記事の続きを書いていきたいと思います。まだまだリファクタリングしないといけないのですが、現状動くものをのせる的な感じで。 前回なにしたか 前回はぽよりました。(適当)まあ、簡単にソケットでチャットを作りましょうみたいなことをしました。 今回はなにするか そこに今回はユーザーを定義してさらにチャットを保存していくみたいな実装をしました。簡単な実装しかしてい...","created_at":"2020-11-30"},{"id":"37","title":"puppeteer楽しい","description":"はじめに こんにちは、僕です。この記事はKITアドベントカレンダー11日目の記事になります。今日はpuppeteerで遊んだってだけの短い記事を書いていきます。これ面白いのでおすすめです。(今テスト勉強しながらコード読んでる)今回作成したやつのコードはこちら puppeteerとは何か puppeteerとは操り人形という意味を持っています(知らんかった)ちなみにコードはこれです。ブラウザを自動...","created_at":"2020-12-05"},{"id":"38","title":"Goの名前付き戻り値","description":"こんにちは どうも僕です。この記事はKITアドベントカレンダー11日目の記事になります。今回はGolangの名前付き戻り値について簡単にまとめてみました。 そもそも名前付き戻り値って何? まずこれですよね、僕も最初はわからんってなってましたし、今もよくわかってないです。簡単にいうと、戻り値に名前をつけておくことができます。比較は以下のコードで。 // 通常の関数 func nomalFun...","created_at":"2020-12-11"},{"id":"39","title":"アドテクって何?","description":"こんにちは どうも、僕です。この記事はKITアドベントカレンダー19日目の記事になります。 アドテクって? そもそもアドテクってなんなのでしょうか。アドテクは、インターネット上に広告を出したい「広告主」と、広告を出すことによって収益を得たい「メディア」が存在しており、アドテクによって「広告主」と「メディア」の両方の収益を最大化するような仕組みを作っています。また、ユーザーに対して価値の高い広告...","created_at":"2020-12-18"},{"id":"40","title":"フロントエンドの今","description":"こんにちは どうも、僕です。今日はフロントエンドについて書いて行こうと思います。(抽象的〜〜〜) 僕はフロントエンドの人間ではないのであまり詳しくはないのですが、そんな僕でも知っていることや最低限意識していることなどを簡単にですがまとめていきたいと思います。 最近のフロントエンド 最近はフロントエンドの進化が早く、バックエンド側まで侵食しかけている印象を受けます。SPAとはみたいなことを思うよ...","created_at":"2020-12-15"},{"id":"42","title":"2020年振り返り","description":"こんにちは どうも,僕です.これを書いているときはクリスマスで,TLのみんなはコード書いてるんだろうなって思いながら書いてます.今年一年,某病気にほぼ潰されてしまいましたが,個人的には充実した1年間になったと感じています.インターン,就職活動,技術的な成長,その他もろもろ人生の分岐点となるようなことが多かった気がします.それを割と雑に振り返っていきたいと思います. 2020年という年 今年は大...","created_at":"2020-12-25"},{"id":"49","title":"JWTについて学ぶ","description":"はじめに どうも,僕です.今日はGolangでJWTを実装したけどちょっとつまづいたことが多かったので記事にしたいと思います.これ実装したのだいぶ前なので思い出しながら頑張っていこうと思います. JWTについて そもそもJWTとはなんなのかについて簡単におさらいをしておきたいと思います.JWTとは,JSON Web Tokenの略で属性情報(Claim)をJSONの中に丸め込むことで個人を識別...","created_at":"2021-01-11"},{"id":"50","title":"Golangとの半年","description":"こんにちは どうも,僕です.2021年1月の時点でGolangと出会ってから半年が経ちました.この半年,様々なことを感じ,Golangを通して様々なことを学びました.その過程の振り返りと今後どうしていきたいかを自分自身の振り返りとして残していきたいと思います. また,この記事を通じてGolangを新しく学ぶ人や新しい言語を習得する人にとって何か力になれればいいなと思っています. 前提 前提...","created_at":"2021-01-14"},{"id":"52","title":"preactとfastifyでSSR","description":"こんにちは どうも,ぼくです.久しぶりにブログ書いてる,日本語死んでそう.今回はSSRについての記事です.頑張るぞ〜 前提 ここしっかり書いとかないと解釈違いとかで怒られそうなので書いておきます. この記事はSSRを理解するためのもの First Viewは初期表示のことをいう,細かい分類はしない,レンダリングした結果がブラウザに表示されたタイミングのこと preactとfastifyを使用して...","created_at":"2021-01-27"},{"id":"55","title":"仕事を始めて感じたこと","description":"こんにちは バレンタインなのにチョコレートもらえない非リアのみなさん.どうも,僕です.最近働き始めたので朝が辛いです.今回は最近働き出して感じたことを書いていきたいと思います. 前提 まずちょっと前提について話します.僕は労働は初めてではなく,一応サイバーエージェントさんでの就業型のインターンに参加して実務的なコードを書いたことはあります.その時のブログはこちらただ,あの時はそもそもな技術力が...","created_at":"2021-02-14"},{"id":"56","title":"マルコフ連鎖実装してみた","description":"こんにちは どうも,僕です.今回はみんな大好きマルコフ連鎖についてです.コードはこれ.与えられた文章をもとにして新しい文章を生成するやつを実装しました.ではやっていきます. マルコフ連鎖って何? マルコフ連鎖とはどうやら離散マルコフ過程の別称のようです.知らんかった.Twitterで見かけてググってみたら出てきてほへーってなりました.今回は文章を自動生成するためのマルコフ連鎖を実装していきます...","created_at":"2021-02-15"},{"id":"57","title":"Nuxt入門した","description":"はじめに どうも,僕です.Nuxtに入門しました.よくわからないバグで昨日1日溶かしましたがまああれも経験ということで(元々使おうとしてたライブラリが某アダルトサイトの非公式ライブラリだったのでどこかがおかしかったのかも)ということで元々作ろうとしてたものに比べてだいぶ簡単な構成になってしまいましたがNuxtデビューブログを書いていきます.あと今回内容薄いので許してください.あくまでも入門です. ...","created_at":"2021-02-27"},{"id":"58","title":"GraphQL入門","description":"はじめに こんにちは、僕です。 この記事は 技術メモ にまとめたものの総括みたいな感じです。 ということでGraphQL に入門したのでまとめます。ここでは Query と Mutation については触れますが Subscription については触れません。(これで入門したとか言うな)一応 Subscription については後日追記予定です。手を動かした時間で言うと10時間もないので...","created_at":"2021-05-17"},{"id":"59","title":"バンドルツール作る","description":"こんにちは どうも、僕です。最近バンドルツールを作った(というか作ってる途中)なのでその様子を記事にします。 まだ作ってる途中なのと、あまりきれいな構成ではないので多目に見てください。ではやっていきます。 技術選定 プログラムを実行するためのものと、バンドラーを作成するための補助として使うもののそれぞれを別に悩むことなく以下のように選定しました。 deno プログラムの実行に関してですが、...","created_at":"2021-06-05"},{"id":"67","title":"iframe のスクロール","description":"はじめに こんにちは、どうも僕です。Intersection Observer API を使ってスクロール率を用いてコンテンツの表示を操作するためにコードを書いていたのですが、ちょっとこけたのでまとめます。 Intersection Observer API とは Intersection Observer API とは、ターゲットとなる要素が指定した監視対象の要素が指定した viewport...","created_at":"2021-07-17"},{"id":"68","title":"日報?を作った","description":"こんにちは どうも、僕です。 今回は Twitter API を使って自分のツイートを自動で拾ってきてそれをもとに140文字以内の任意の文章を生成してツイートする bot を作成したのでその様子を記事にします。なお、@takurinton ではないアカウント(知ってる人は知ってる)なのでそこはご了承ください。 使用技術 JavaScript バンドルするのがめんどくさいので CommonJS べ...","created_at":"2021-07-21"},{"id":"71","title":"dumb-init とは","description":"はじめに こんにちは、どうも僕です。Dockerfile を読んだり書いたりしてる時に出てきた dumb-init を知らなくて気になったので調査しました。 dumb-init とは dumb-init とは Linux コンテナ用の最小限の init システムで、PID が 1 になるように作られています。最小限のコンテナとは、Docker などの小さめの環境のことを指していています。C で...","created_at":"2021-08-18"},{"id":"72","title":"インフラのパフォチュー","description":"はじめに どうも、僕です。先日、ISUCON に出場して、学生枠で6位、5位と2000点差で惜しくも本戦出場を逃しました。(チームメンバーに助けられまくってたので僕はなにもしてませんが) 普段はフロントエンドの実装をメインとしてやっているのですが、最近仕事で Docker や k8s 周りを触ることが多く、少しサーバサイドやインフラについて少し興味が出てきたときに出場した ISUCON だった...","created_at":"2021-08-29"},{"id":"74","title":"Preact の change event","description":"こんにちは どうも、僕です。先日、Preact を使用して、簡単なアプリケーションのプロトコーディングをしていて、input タグのイベントハンドラを呼ぼうとしたらうまく動かくてハマりました。 以下のように定義していたのですが、結論としては、onChange ではなくて onInput を使わなければならないようです。 const HogeComponent = (): JSX.Element...","created_at":"2021-09-19"},{"id":"75","title":"GraphQL の print と parse","description":"こんにちは どうも、僕です。最近、業務や趣味で GraphQL の AST や query を動的にいじるようなことをしていて、その中で print 関数や parse 関数を脳死で使っていたのですが、ふと中身がどうなっているのか気になったため、ちょっと調べてみました。なお、今回は、AST の見方などは書きません。 print と parse とは parse 関数 print 関数とは、Grap...","created_at":"2021-09-19"},{"id":"76","title":"社会人になったら〜♪","description":"こんにちは どうも、僕です。超ポエム記事です。 就職まであと半年くらい、多分東京に住み始めるまであと5ヶ月くらいになってきました。妙に就職についてリアルに考えるようになり、社会人になったら時間取れるかなとか、やりたいことできるかなといった不安があります。最近では、社会人の方と一緒に働かせてもらえることが多くて、色々な学びがありますが、みなさん輝いている方が多いです。OSS を積極的にやられてる...","created_at":"2021-09-20"},{"id":"77","title":"GraphQL の parse エディタ","description":"こんにちは どうも、僕です。シルバーウィークなのでこれまで書きたくても時間がなくて書けなかった記事をどんどん投下しています。今回は、最近作ってる GraphQL の DocumentNode を parse して作ったエディタから動的に query を生成する画面のプロトコーディングをしたのでそれを簡単にまとめます。 概要 このツイートの感じです。 https://twitter.com/taku...","created_at":"2021-09-20"},{"id":"78","title":"自サイトのアクセス可視化","description":"こんにちは どうも、僕です。1ヶ月ほど前からポートフォリオとブログのトラッキングを始めて、だいぶデータが溜まってきたのでどうしようかなと思っていました。ちょうど、昨日(9月23日)は祝日で、数日前に研究の中間発表も終わり(学部の研究発表なんてたかが知れてるだろという声はさておき)、たまには休日っぽいことでもするかと思っていたので、ポートフォリオとブログのログを可視化するというコードを書いてみました...","created_at":"2021-09-23"},{"id":"79","title":"自サイトのアクセス可視化2","description":"こんにちは どうも、僕です。この記事は 自サイトのアクセス可視化 の続きです。前回は AST をこねくり回して、form をいじる実装をしました。今回はそのアクセスごとの詳細画面を作成し、そこにグラフをつけて見やすくするみたいなことをしてみました。まだまだきれいではないのですが、これからきれいになります、きっと。 概要 前回、ちょっとだけ作っていた Detail.tsx を拡張します。詳細ページで...","created_at":"2021-09-25"},{"id":"81","title":"プレイドのインターン終了した","description":"こんにちは どうも、僕です。会社のブログ にも書いたのですが、プレイドのインターンを終了しました。理由としては、これから色々忙しくなるからであって、別にクビになったわけではないです。ここでは、なんというか、こんなこと感じたみたいなことを書きます。会社のブログは事実ベース、こっちのブログは感情ベースです。 あのブログに関して あのブログ、実は1ヶ月前くらいから書いていて、めちゃくちゃ時間かけました。...","created_at":"2021-09-30"},{"id":"83","title":"addEventListener の第3引数","description":"こんにちは どうも、僕です。addEventListener の第3引数って知ってますか。僕は知りませんでした。いや、厳密に言うと、存在は知ってたけど理解してませんでした。理解するために、DOMのイベントフローとともに見ていきたいと思います。 イベントフローとは まずはイベントフローとは何かについて考えます。イベントフローとは、DOM に対するイベントの委任(伝播)のことで、例えば以下のような...","created_at":"2021-10-13"},{"id":"84","title":"React のメモ化","description":"こんにちは どうも、僕です。プレイドのインターンで人生で初めて業務でフロントエンドを書いてから3ヶ月半が経ちました。プレイドでは Vue と Svelte を書いていて、最後の2週間くらいは React を書いていましたが、まだまだよくわからない点が多く、特に hooks 周りを自分はしっかり理解してませんでした。プレイドでは Vue と Svelte を書いていて、最後の2週間くらいは Reac...","created_at":"2021-10-13"},{"id":"87","title":"JPHACKS に出場した","description":"こんにちは どうも、僕です。人生初ハッカソン、出場しました。総合すると、毎日忙しかったものの、とても楽しくコードを書くことができたと思います。また、一緒に出てくれたメンバーや、今回のハッカソンに出場していた皆さん、また、開催してくれた方々には感謝しかありません、ありがとうございました。 作品 https://github.com/jphacks/F_2111 チームメンバー チームメンバーは、...","created_at":"2021-10-30"},{"id":"88","title":"forwardRef を習得した","description":"こんにちは どうも、僕です。最近色々あって、Material UI のコードを読んでいるのですが、forwardRef がさまざまな箇所で出てきて理解できないと辛いので勉強しました。 ref とは ref とは、簡単に言うと、dom であれば element、それ以外の要素であればその class のインスタンスに対してアタッチするためのものです。class component だと、要素 +...","created_at":"2021-11-01"},{"id":"90","title":"僕がサブスクを使わない理由","description":"こんにちは どうも、僕です。若干時代の流れに背くようなタイトルになっていますが、半分くらいは釣り です。僕が使っているサブスクのサービスは以下になります。 AWS Spotify Amazon prime Notion(学生なのでタダみたいなもん) 別に、使ってないわけではないですし、しっかり使ってる方なのではないかとか思っています。(ごめんなさい)そんな感じで僕がサブスクをあまり積極的...","created_at":"2021-11-04"},{"id":"92","title":"マリオのUX","description":"こんにちは どうも、僕です。最近、スーパーマリオブラザーズにハマっていて、昼夜問わずにゲームばかりしています。もともと、ゲームなんかするよりも小説読んだり、コード書いたりする方が楽しいだろみたいな思考回路をしていたので、こういうのは新鮮で没頭してしまいます。もう少しでラスボスを倒せるので非常に楽しみです。なんかマリオをやっていて、ゲームのUXって大事だなって思ったので記事にします。 UX UX...","created_at":"2021-11-08"},{"id":"93","title":"検索を作る","description":"こんにちは どうも、僕です。検索エンジンを自作しようとしてうまくは行きましたが、想定していた規模には耐えることができなかったという内容の記事です。実際、パフォーマンスにこだわると厳しい点が多かったり、検索結果が帰ってこなかったりしてだいぶしんどい実装になってしまいました。もっとうまくやる方法があったら教えてください。 今回の手法と想定する規模 今回は、転置インデックスを作成して戦います。転置イ...","created_at":"2021-11-15"},{"id":"94","title":"MySQL の FULLTEXT とは","description":"こんにちは どうも、僕です。MySQL(MariaDB)に搭載されてる最強な検索、FULLITEXT INDEX について書きます。前回のブログ で、検索をアプリケーション側で実装する方法について書きましたが、今回はそれのデータベース側からのアプローチです。このレイヤーでデータを操作するのは賛否が分かれる部分だとは思いますが、簡単に実装してみたのでやっていきます。 そもそも何 インデックスです。全...","created_at":"2021-11-16"},{"id":"103","title":"結合時のアルゴリズム","description":"こんにちは どうも、僕です。SQL アンチパターンを読んでいて、「外部結合をすると処理のコストが指数関数的に上がっていってしまいます」との記述があり、よくわからなかったので調べました。 JOIN アルゴリズム そもそも、 SQL の JOIN には、以下の3種類のアルゴリズムが使用されることが多いです。オラクルと、postges には全部使用されていますが、MySQL には nested loo...","created_at":"2021-12-18"},{"id":"105","title":"2021年振り返り","description":"こんにちは どうも、僕です。2021年もそろそろ終わります。2021年は色々なことがありましたが、簡単にまとめると、機会と出逢いに恵まれた1年だったと思っています。さまざまな優秀なエンジニアの方々と仕事をさせていただいたり、コミュニティへ招待していただいたりをしていました。自分自身の技術的な成長があったかどうかは微妙ですが、エンジニアとして少しずつ地に足がついてきた実感はあります。来年も頑張って行...","created_at":"2021-12-29"},{"id":"108","title":"Svelte と SPA","description":"こんにちは どうも、僕です。最近、Svelte が市民権を獲得してきているようで、フロントエンド開発において、選択肢に入ってくる機会が増えてきたと思います。また、Twitter などでも、React よりも Svelte!のような内容のものや、Svelte を勉強してみるといった内容のものが増えてきたように感じます。それ自体はいいことであり、Svelte が選択肢に入ってくることは面白いとは思うの...","created_at":"2022-01-14"},{"id":109,"title":"ブログをSSGにした","description":"こんにちは どうも、僕です。今回はブログを SSG にしてみたという話をします。年始に SSR をするような構成にしたばかりですが、色々あって(後述)作り替えてみました。 SSR にする記事は以下からどうぞ。 ブログを作り直した Rust で GraphQL server を書いてみた このブログのソースコードはこちらtakurinton/ssg-blog なぜ作り直したか そもそもなぜ作り直...","created_at":"2022-08-14"},{"id":110,"title":"wmr の prerender 時に明示的な fetch の定義が不要になる","description":"こんにちは どうも、僕です。 先日、ブログを新しくしました。=> ブログを SSG にしたwmr の prerender mode を使って SSG にしましたが、自分の実装したような wmr の prerender で .md ファイルを使ったブログを書くようなパターンだと、prerender 関数の中で fetch API をオーバーライドしてあげないとプロダクションビルドをする際に f...","created_at":"2022-09-26"},{"id":111,"title":"SHA-256 algorithm","description":"こんにちは どうも、僕です。今週猫がきます。 猫の名前について、友人と雑談をしていて、 名前なんて記号なんだから呼びやすくて聞こえが良ければなんでもいいよ と言われたので、記号だなんてそんなのハッシュではないかと思ったと同時に、ハッシュという名前はとてもいいなと思いました。ハッシュという名前にしっくりきたので名前はハッシュにしようと思ったものの、筆者はコンピュータサイエンスの学部を出ているのに...","created_at":"2022-10-10"},{"id":112,"title":"2022年振り返り","description":"こんにちは 今年は散々な年だったため書かなくて良いかなと思っていましたが、こういうのは後から見てみてこういうのもあったなーと振り返るものな気がするので一応書いておきます。 去年の振り返りはこちらです。 去年に倣って GitHub の草を載せるとこんな感じです、去年と比べるとあまりコードを書かなかった 1 年だったように感じます。 ざっくり時系列 1 月 卒論の提出期日を間違えてました。 とよ...","created_at":"2022-12-31"}] \ No newline at end of file +[{"id":"5","title":"OngaqJS触ってみた","description":"はじめに こんにちは ポートフォリオ(おふざけ入ってるあれです)にリンク貼ってあるOngaqJSについてのソースコードをまとめてみたので記事にしました。 #OngaqJSとはなんぞや? OngaqJSとは、JavaScriptで音楽が作成できるというAPIです。 Keyの取得はこちらから 有料枠と無料枠があり、使える楽器の種類などが異なる模様(有料会員になろうかな) ぽちぽちしていけば簡単に登録で...","created_at":"2020-04-24"},{"id":"9","title":"ブログを引っ越した話","description":"はじめに こんにちは。疲れた。 てことで今回は僕がはじめてAWSを使ったときに詰まったところについてまとめたいと思います!!! また、この記事はQiitaにも全く同じことが書いてありますので、見やすい方がいいなと思ったら素直にQiitaに言ってください。 URLはこちらです 僕のレベル AWSって何???? まず最初に言っておきますが、私はこのレベルの人間です。AWSって言葉は知ってるけど中身は知...","created_at":"2020-06-10"},{"id":"12","title":"サポーターズの1on1面談に参加した話","description":"こんにちは こんばんは、先日サポーターズの1on1面談イベントに参加したので記事にしたいと思います。 簡単にまとめると、とっても楽しかったし充実した時間になったけど、その分周りのエンジニア志望の学生との差を痛感してとても刺激がもらえたイベントでした!!!! 1on1面談イベントってなんだよって思った方はこちらのリンクを参照してみてください。 #事前に準備したこと このイベントは、各ターンの最初に学...","created_at":"2020-06-11"},{"id":"17","title":"Treasureに参加した話","description":"はじめに こんにちは。僕です。 以前の記事にも書きましたが、VOYAGE GROUPのTreasureというインターンに参加したのでまとめたいと思います。 結論から言うと最高のインターンでした!!(迷惑かけてばっかりだったけど) 来年以降インターンシップに行きたいと思ってる人はぜひTreasureにも申し込んでみてください! そもそもTreasureってなんだ TreasureとはVOYAGE G...","created_at":"2020-09-02"},{"id":"18","title":"サイバーエージェントのインターンに参加した話","description":"こんにちは どうも、僕です。 今回はサイバーエージェントの就業型インターンに参加して、Ameba事業本部という部署で少しだけコード書かせてもらったのでそのことについて記事にしたいと思います。 参加した経緯 これは遡ること2月、、、 僕が某企業のアドテクのインターンに参加して、楽しかったことを大学の先輩のYさんに報告しました。 僕「この前アドテクのインターンに参加して、DSP周りのコードを簡単に...","created_at":"2020-09-13"},{"id":"19","title":"楽天のインターンに参加した話","description":"こんにちは どうも、僕です。今回は夏の締めくくりに参加した楽天のインターンについて書きたいと思います。楽天のインターンはここまでのインターンの中で一番辛かったような気がします(言語的な問題)海外で仕事できる気がしませんでした。そんな感じでまとめていきます。 選考 インターンには選考がつきものです。選考内容はコーディングテストと面接で、両方とも1日で終わらせます。参加者全員。 コーディングテストはc...","created_at":"2020-09-25"},{"id":"21","title":"Skywayでビデオ通話","description":"はじめに こんにちは、ブログに MaterialUIを導入してルンルンの僕です。今回はSkyWayで1対1の音声通話、またそれを文字起こしをしてGASに投げる処理までを書いたのでまとめたいと思います。GitHub Pages でデプロイしたサイトはこちらになります。レポジトリはこちらになります。 SkyWayって何? SkyWayとは、Webでリアルタイムコミュニケーションを実現する標準技術、We...","created_at":"2020-10-09"},{"id":"23","title":"Django + RDS","description":"こんにちは どうも、僕です。今回はAWSのEC2にデプロイしたDjangoのプロジェクトをRDSに接続する方法について書きたいと思います。Djangoを理解してればとても簡単。困ることなんてありません。ではいきます。 バックアップを取る DjangoではデフォルトのDBとしてプロジェクトを作成したときにsqlite3のテーブルがついてきます。しかし、RDSに乗り換えるときにはsqlite3のデータ...","created_at":"2020-10-15"},{"id":"26","title":"easyjsonを使ってみた","description":"こんにちは どうも、僕です。この記事は随分前のインターン期間中に自分のために書いた記事を転載してます。 GoでJSON使う時ってだいぶめんどくさいんですよね。まあ型による安心感がバケモンなのでやった方がいいんですけど。 GoでJSONを捌く時はstructを使用します。クラスとかはないのでこれでいきます。  Unmarshal 早速やってみます。 例えばこんな感じのjsonがくるとします。 v...","created_at":"2020-10-21"},{"id":"29","title":"4日間でポートフォリオを作り替えた","description":"こんにちは どうもこんにちは。僕です。最近あったことといえば、Vのインターン落ちて落ち込んでるところに人事の方からのなぐさめのDMがきてさらに泣きそうになったところでRからの内定もらってなんだかメンタルが忙しいことです。 今回は僕がポートフォリオを作り替えた話(需要あるのか?)について話していこうと思います。 なんで作り替えたの? まずここから作り替えた理由としては3つあります。 Nex...","created_at":"2020-11-14"},{"id":"30","title":"Goのdeferに注意する","description":"はじめに 今日開発してて遭遇したエラーについて話します。短めです。よろしくお願いします。 状況 GoでAPIサーバを開発してる時に、エラーハンドリングについての実装をしていた。現状の問題としては、DBと接続する時にアプリケーションサーバ(NginxやらGolangやら)が生きてる状態でDBサーバ(今で言うRDS)が死んでる時にDBのIPアドレスとポートがクライアント側に渡されてしまうという問題が起...","created_at":"2020-11-15"},{"id":"31","title":"DjangoでUser認証機能を作る","description":"こんにちは これですどうも、僕です。この記事はKITアドベントカレンダーの4日目の記事になります。今回はユーザー認証の機能を実装してみようと思います。 やり方 Djangoではデフォルトでユーザーモデルが定義されています。今回はそれを書き換えることでユーザー認証の仕組みを作成して行こうと思います。最近だと外部の認証に任せるパターンも増えていますが、こっちの方が楽だと感じることもちょこちょこある...","created_at":"2020-12-04"},{"id":"33","title":"pyparsing触ってみた","description":"こんにちは こんにちは、僕です。最近、pyparsingというPythonのライブラリを使用していて、面白いなあと思ったので記事にしてみました。元々自分は言語解析などに興味があって(NLPとか)、今回は形式言語解析になりますがまとめたいと思います。 pyparsingとは? これです。ドキュメント The pyparsing module is an alternative approach ...","created_at":"2020-11-24"},{"id":"34","title":"DRFのViewについてまとめる","description":"こんにちは どうも、こんにちは、僕です。今日はDRFのなんちゃらAPIViewについてまとめたいと思います。自分の推しはAPIViewです。対戦お願いします! DRFとは? そんなもんは自分で調べてください(辛辣) 参考までにこれは前回の記事でさらっと書いてしまったAPIView周りの深堀りみたいなイメージで描いていきます。 今回使うモデル 今回使うモデルはとてもシンプルで、以下のよう...","created_at":"2020-11-27"},{"id":"35","title":"asgiを触ってみた","description":"こんにちは どうも、僕です。今回はDjangoでasgiを使用してみたということでチュートリアルを自分なりにまとめたいと思います。最近のブログ暇つぶしみたいな感じだったので今回は久しぶりに新しい技術に触れたアウトプット感があって良きです。浅い asgiって何? まず最初にasgiについて説明したいと思います。そもそもPythonで鯖を立てるためにはwsgiとasgiの2種類があります。 ws...","created_at":"2020-11-27"},{"id":"36","title":"asgiを触ってみたつづき","description":"どうも こんにちは、僕です。今回は前回の記事の続きを書いていきたいと思います。まだまだリファクタリングしないといけないのですが、現状動くものをのせる的な感じで。 前回なにしたか 前回はぽよりました。(適当)まあ、簡単にソケットでチャットを作りましょうみたいなことをしました。 今回はなにするか そこに今回はユーザーを定義してさらにチャットを保存していくみたいな実装をしました。簡単な実装しかしてい...","created_at":"2020-11-30"},{"id":"38","title":"Goの名前付き戻り値","description":"こんにちは どうも僕です。この記事はKITアドベントカレンダー11日目の記事になります。今回はGolangの名前付き戻り値について簡単にまとめてみました。 そもそも名前付き戻り値って何? まずこれですよね、僕も最初はわからんってなってましたし、今もよくわかってないです。簡単にいうと、戻り値に名前をつけておくことができます。比較は以下のコードで。 // 通常の関数 func nomalFun...","created_at":"2020-12-11"},{"id":"40","title":"フロントエンドの今","description":"こんにちは どうも、僕です。今日はフロントエンドについて書いて行こうと思います。(抽象的〜〜〜) 僕はフロントエンドの人間ではないのであまり詳しくはないのですが、そんな僕でも知っていることや最低限意識していることなどを簡単にですがまとめていきたいと思います。 最近のフロントエンド 最近はフロントエンドの進化が早く、バックエンド側まで侵食しかけている印象を受けます。SPAとはみたいなことを思うよ...","created_at":"2020-12-15"},{"id":"42","title":"2020年振り返り","description":"こんにちは どうも,僕です.これを書いているときはクリスマスで,TLのみんなはコード書いてるんだろうなって思いながら書いてます.今年一年,某病気にほぼ潰されてしまいましたが,個人的には充実した1年間になったと感じています.インターン,就職活動,技術的な成長,その他もろもろ人生の分岐点となるようなことが多かった気がします.それを割と雑に振り返っていきたいと思います. 2020年という年 今年は大...","created_at":"2020-12-25"},{"id":"49","title":"JWTについて学ぶ","description":"はじめに どうも,僕です.今日はGolangでJWTを実装したけどちょっとつまづいたことが多かったので記事にしたいと思います.これ実装したのだいぶ前なので思い出しながら頑張っていこうと思います. JWTについて そもそもJWTとはなんなのかについて簡単におさらいをしておきたいと思います.JWTとは,JSON Web Tokenの略で属性情報(Claim)をJSONの中に丸め込むことで個人を識別...","created_at":"2021-01-11"},{"id":"56","title":"マルコフ連鎖実装してみた","description":"こんにちは どうも,僕です.今回はみんな大好きマルコフ連鎖についてです.コードはこれ.与えられた文章をもとにして新しい文章を生成するやつを実装しました.ではやっていきます. マルコフ連鎖って何? マルコフ連鎖とはどうやら離散マルコフ過程の別称のようです.知らんかった.Twitterで見かけてググってみたら出てきてほへーってなりました.今回は文章を自動生成するためのマルコフ連鎖を実装していきます...","created_at":"2021-02-15"},{"id":"58","title":"GraphQL入門","description":"はじめに こんにちは、僕です。 この記事は 技術メモ にまとめたものの総括みたいな感じです。 ということでGraphQL に入門したのでまとめます。ここでは Query と Mutation については触れますが Subscription については触れません。(これで入門したとか言うな)一応 Subscription については後日追記予定です。手を動かした時間で言うと10時間もないので...","created_at":"2021-05-17"},{"id":"59","title":"バンドルツール作る","description":"こんにちは どうも、僕です。最近バンドルツールを作った(というか作ってる途中)なのでその様子を記事にします。 まだ作ってる途中なのと、あまりきれいな構成ではないので多目に見てください。ではやっていきます。 技術選定 プログラムを実行するためのものと、バンドラーを作成するための補助として使うもののそれぞれを別に悩むことなく以下のように選定しました。 deno プログラムの実行に関してですが、...","created_at":"2021-06-05"},{"id":"67","title":"iframe のスクロール","description":"はじめに こんにちは、どうも僕です。Intersection Observer API を使ってスクロール率を用いてコンテンツの表示を操作するためにコードを書いていたのですが、ちょっとこけたのでまとめます。 Intersection Observer API とは Intersection Observer API とは、ターゲットとなる要素が指定した監視対象の要素が指定した viewport...","created_at":"2021-07-17"},{"id":"68","title":"日報?を作った","description":"こんにちは どうも、僕です。 今回は Twitter API を使って自分のツイートを自動で拾ってきてそれをもとに140文字以内の任意の文章を生成してツイートする bot を作成したのでその様子を記事にします。なお、@takurinton ではないアカウント(知ってる人は知ってる)なのでそこはご了承ください。 使用技術 JavaScript バンドルするのがめんどくさいので CommonJS べ...","created_at":"2021-07-21"},{"id":"71","title":"dumb-init とは","description":"はじめに こんにちは、どうも僕です。Dockerfile を読んだり書いたりしてる時に出てきた dumb-init を知らなくて気になったので調査しました。 dumb-init とは dumb-init とは Linux コンテナ用の最小限の init システムで、PID が 1 になるように作られています。最小限のコンテナとは、Docker などの小さめの環境のことを指していています。C で...","created_at":"2021-08-18"},{"id":"72","title":"インフラのパフォチュー","description":"はじめに どうも、僕です。先日、ISUCON に出場して、学生枠で6位、5位と2000点差で惜しくも本戦出場を逃しました。(チームメンバーに助けられまくってたので僕はなにもしてませんが) 普段はフロントエンドの実装をメインとしてやっているのですが、最近仕事で Docker や k8s 周りを触ることが多く、少しサーバサイドやインフラについて少し興味が出てきたときに出場した ISUCON だった...","created_at":"2021-08-29"},{"id":"74","title":"Preact の change event","description":"こんにちは どうも、僕です。先日、Preact を使用して、簡単なアプリケーションのプロトコーディングをしていて、input タグのイベントハンドラを呼ぼうとしたらうまく動かくてハマりました。 以下のように定義していたのですが、結論としては、onChange ではなくて onInput を使わなければならないようです。 const HogeComponent = (): JSX.Element...","created_at":"2021-09-19"},{"id":"75","title":"GraphQL の print と parse","description":"こんにちは どうも、僕です。最近、業務や趣味で GraphQL の AST や query を動的にいじるようなことをしていて、その中で print 関数や parse 関数を脳死で使っていたのですが、ふと中身がどうなっているのか気になったため、ちょっと調べてみました。なお、今回は、AST の見方などは書きません。 print と parse とは parse 関数 print 関数とは、Grap...","created_at":"2021-09-19"},{"id":"77","title":"GraphQL の parse エディタ","description":"こんにちは どうも、僕です。シルバーウィークなのでこれまで書きたくても時間がなくて書けなかった記事をどんどん投下しています。今回は、最近作ってる GraphQL の DocumentNode を parse して作ったエディタから動的に query を生成する画面のプロトコーディングをしたのでそれを簡単にまとめます。 概要 このツイートの感じです。 https://twitter.com/taku...","created_at":"2021-09-20"},{"id":"78","title":"自サイトのアクセス可視化","description":"こんにちは どうも、僕です。1ヶ月ほど前からポートフォリオとブログのトラッキングを始めて、だいぶデータが溜まってきたのでどうしようかなと思っていました。ちょうど、昨日(9月23日)は祝日で、数日前に研究の中間発表も終わり(学部の研究発表なんてたかが知れてるだろという声はさておき)、たまには休日っぽいことでもするかと思っていたので、ポートフォリオとブログのログを可視化するというコードを書いてみました...","created_at":"2021-09-23"},{"id":"79","title":"自サイトのアクセス可視化2","description":"こんにちは どうも、僕です。この記事は 自サイトのアクセス可視化 の続きです。前回は AST をこねくり回して、form をいじる実装をしました。今回はそのアクセスごとの詳細画面を作成し、そこにグラフをつけて見やすくするみたいなことをしてみました。まだまだきれいではないのですが、これからきれいになります、きっと。 概要 前回、ちょっとだけ作っていた Detail.tsx を拡張します。詳細ページで...","created_at":"2021-09-25"},{"id":"81","title":"プレイドのインターン終了した","description":"こんにちは どうも、僕です。会社のブログ にも書いたのですが、プレイドのインターンを終了しました。理由としては、これから色々忙しくなるからであって、別にクビになったわけではないです。ここでは、なんというか、こんなこと感じたみたいなことを書きます。会社のブログは事実ベース、こっちのブログは感情ベースです。 あのブログに関して あのブログ、実は1ヶ月前くらいから書いていて、めちゃくちゃ時間かけました。...","created_at":"2021-09-30"},{"id":"83","title":"addEventListener の第3引数","description":"こんにちは どうも、僕です。addEventListener の第3引数って知ってますか。僕は知りませんでした。いや、厳密に言うと、存在は知ってたけど理解してませんでした。理解するために、DOMのイベントフローとともに見ていきたいと思います。 イベントフローとは まずはイベントフローとは何かについて考えます。イベントフローとは、DOM に対するイベントの委任(伝播)のことで、例えば以下のような...","created_at":"2021-10-13"},{"id":"84","title":"React のメモ化","description":"こんにちは どうも、僕です。プレイドのインターンで人生で初めて業務でフロントエンドを書いてから3ヶ月半が経ちました。プレイドでは Vue と Svelte を書いていて、最後の2週間くらいは React を書いていましたが、まだまだよくわからない点が多く、特に hooks 周りを自分はしっかり理解してませんでした。プレイドでは Vue と Svelte を書いていて、最後の2週間くらいは Reac...","created_at":"2021-10-13"},{"id":"87","title":"JPHACKS に出場した","description":"こんにちは どうも、僕です。人生初ハッカソン、出場しました。総合すると、毎日忙しかったものの、とても楽しくコードを書くことができたと思います。また、一緒に出てくれたメンバーや、今回のハッカソンに出場していた皆さん、また、開催してくれた方々には感謝しかありません、ありがとうございました。 作品 https://github.com/jphacks/F_2111 チームメンバー チームメンバーは、...","created_at":"2021-10-30"},{"id":"88","title":"forwardRef を習得した","description":"こんにちは どうも、僕です。最近色々あって、Material UI のコードを読んでいるのですが、forwardRef がさまざまな箇所で出てきて理解できないと辛いので勉強しました。 ref とは ref とは、簡単に言うと、dom であれば element、それ以外の要素であればその class のインスタンスに対してアタッチするためのものです。class component だと、要素 +...","created_at":"2021-11-01"},{"id":"93","title":"検索を作る","description":"こんにちは どうも、僕です。検索エンジンを自作しようとしてうまくは行きましたが、想定していた規模には耐えることができなかったという内容の記事です。実際、パフォーマンスにこだわると厳しい点が多かったり、検索結果が帰ってこなかったりしてだいぶしんどい実装になってしまいました。もっとうまくやる方法があったら教えてください。 今回の手法と想定する規模 今回は、転置インデックスを作成して戦います。転置イ...","created_at":"2021-11-15"},{"id":"94","title":"MySQL の FULLTEXT とは","description":"こんにちは どうも、僕です。MySQL(MariaDB)に搭載されてる最強な検索、FULLITEXT INDEX について書きます。前回のブログ で、検索をアプリケーション側で実装する方法について書きましたが、今回はそれのデータベース側からのアプローチです。このレイヤーでデータを操作するのは賛否が分かれる部分だとは思いますが、簡単に実装してみたのでやっていきます。 そもそも何 インデックスです。全...","created_at":"2021-11-16"},{"id":"103","title":"結合時のアルゴリズム","description":"こんにちは どうも、僕です。SQL アンチパターンを読んでいて、「外部結合をすると処理のコストが指数関数的に上がっていってしまいます」との記述があり、よくわからなかったので調べました。 JOIN アルゴリズム そもそも、 SQL の JOIN には、以下の3種類のアルゴリズムが使用されることが多いです。オラクルと、postges には全部使用されていますが、MySQL には nested loo...","created_at":"2021-12-18"},{"id":"105","title":"2021年振り返り","description":"こんにちは どうも、僕です。2021年もそろそろ終わります。2021年は色々なことがありましたが、簡単にまとめると、機会と出逢いに恵まれた1年だったと思っています。さまざまな優秀なエンジニアの方々と仕事をさせていただいたり、コミュニティへ招待していただいたりをしていました。自分自身の技術的な成長があったかどうかは微妙ですが、エンジニアとして少しずつ地に足がついてきた実感はあります。来年も頑張って行...","created_at":"2021-12-29"},{"id":"108","title":"Svelte と SPA","description":"こんにちは どうも、僕です。最近、Svelte が市民権を獲得してきているようで、フロントエンド開発において、選択肢に入ってくる機会が増えてきたと思います。また、Twitter などでも、React よりも Svelte!のような内容のものや、Svelte を勉強してみるといった内容のものが増えてきたように感じます。それ自体はいいことであり、Svelte が選択肢に入ってくることは面白いとは思うの...","created_at":"2022-01-14"},{"id":109,"title":"ブログをSSGにした","description":"こんにちは どうも、僕です。今回はブログを SSG にしてみたという話をします。年始に SSR をするような構成にしたばかりですが、色々あって(後述)作り替えてみました。 SSR にする記事は以下からどうぞ。 ブログを作り直した Rust で GraphQL server を書いてみた このブログのソースコードはこちらtakurinton/ssg-blog なぜ作り直したか そもそもなぜ作り直...","created_at":"2022-08-14"},{"id":110,"title":"wmr の prerender 時に明示的な fetch の定義が不要になる","description":"こんにちは どうも、僕です。 先日、ブログを新しくしました。=> ブログを SSG にしたwmr の prerender mode を使って SSG にしましたが、自分の実装したような wmr の prerender で .md ファイルを使ったブログを書くようなパターンだと、prerender 関数の中で fetch API をオーバーライドしてあげないとプロダクションビルドをする際に f...","created_at":"2022-09-26"},{"id":111,"title":"SHA-256 algorithm","description":"こんにちは どうも、僕です。今週猫がきます。 猫の名前について、友人と雑談をしていて、 名前なんて記号なんだから呼びやすくて聞こえが良ければなんでもいいよ と言われたので、記号だなんてそんなのハッシュではないかと思ったと同時に、ハッシュという名前はとてもいいなと思いました。ハッシュという名前にしっくりきたので名前はハッシュにしようと思ったものの、筆者はコンピュータサイエンスの学部を出ているのに...","created_at":"2022-10-10"},{"id":112,"title":"2022年振り返り","description":"こんにちは 今年は散々な年だったため書かなくて良いかなと思っていましたが、こういうのは後から見てみてこういうのもあったなーと振り返るものな気がするので一応書いておきます。 去年の振り返りはこちらです。 去年に倣って GitHub の草を載せるとこんな感じです、去年と比べるとあまりコードを書かなかった 1 年だったように感じます。 ざっくり時系列 1 月 卒論の提出期日を間違えてました。 とよ...","created_at":"2022-12-31"}] \ No newline at end of file From 7f170e620972733ab0d9ced36b3b6eaf50a2d43e Mon Sep 17 00:00:00 2001 From: takurinton Date: Tue, 19 Mar 2024 06:39:01 +0900 Subject: [PATCH 4/9] sync prerender --- public/prerender.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/prerender.js b/public/prerender.js index bb46fdc..a6418c0 100644 --- a/public/prerender.js +++ b/public/prerender.js @@ -1,8 +1,8 @@ import { prerender as ssr } from "preact-iso"; import { toStatic } from "hoofd/preact"; -export async function prerender(vnode) { - const res = await ssr(vnode); +export function prerender(vnode) { + const res = ssr(vnode); const head = toStatic(); const elements = new Set([ From 3e6e5b02dcd9b9853dee24a03e2e5f160d2e0742 Mon Sep 17 00:00:00 2001 From: takurinton Date: Tue, 19 Mar 2024 06:55:12 +0900 Subject: [PATCH 5/9] revert --- public/prerender.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/prerender.js b/public/prerender.js index a6418c0..bb46fdc 100644 --- a/public/prerender.js +++ b/public/prerender.js @@ -1,8 +1,8 @@ import { prerender as ssr } from "preact-iso"; import { toStatic } from "hoofd/preact"; -export function prerender(vnode) { - const res = ssr(vnode); +export async function prerender(vnode) { + const res = await ssr(vnode); const head = toStatic(); const elements = new Set([ From e503795da02155a7f69e1b3268c96fd04e0cf506 Mon Sep 17 00:00:00 2001 From: takurinton Date: Tue, 19 Mar 2024 07:29:05 +0900 Subject: [PATCH 6/9] fix build error (#196) --- bun.lockb | Bin 131420 -> 237035 bytes package.json | 3 +- preact-iso/.editorconfig | 22 + preact-iso/.gitignore | 29 + preact-iso/CHANGELOG.md | 135 ++ preact-iso/CODE_OF_CONDUCT.md | 46 + preact-iso/LICENSE | 21 + preact-iso/README.md | 147 ++ preact-iso/bun.lockb | Bin 0 -> 138621 bytes preact-iso/jsconfig.json | 10 + preact-iso/package.json | 57 + preact-iso/src/hydrate.d.ts | 3 + preact-iso/src/hydrate.js | 17 + preact-iso/src/index.d.ts | 4 + preact-iso/src/index.js | 7 + preact-iso/src/lazy.d.ts | 5 + preact-iso/src/lazy.js | 43 + preact-iso/src/prerender.d.ts | 16 + preact-iso/src/prerender.js | 60 + preact-iso/src/router.d.ts | 42 + preact-iso/src/router.js | 216 +++ preact-iso/test/match.test.js | 107 ++ preact-iso/test/router.test.js | 535 +++++++ preact-iso/yarn.lock | 2578 ++++++++++++++++++++++++++++++++ 24 files changed, 4102 insertions(+), 1 deletion(-) create mode 100644 preact-iso/.editorconfig create mode 100644 preact-iso/.gitignore create mode 100644 preact-iso/CHANGELOG.md create mode 100644 preact-iso/CODE_OF_CONDUCT.md create mode 100644 preact-iso/LICENSE create mode 100644 preact-iso/README.md create mode 100755 preact-iso/bun.lockb create mode 100644 preact-iso/jsconfig.json create mode 100644 preact-iso/package.json create mode 100644 preact-iso/src/hydrate.d.ts create mode 100644 preact-iso/src/hydrate.js create mode 100644 preact-iso/src/index.d.ts create mode 100644 preact-iso/src/index.js create mode 100644 preact-iso/src/lazy.d.ts create mode 100644 preact-iso/src/lazy.js create mode 100644 preact-iso/src/prerender.d.ts create mode 100644 preact-iso/src/prerender.js create mode 100644 preact-iso/src/router.d.ts create mode 100644 preact-iso/src/router.js create mode 100644 preact-iso/test/match.test.js create mode 100644 preact-iso/test/router.test.js create mode 100644 preact-iso/yarn.lock diff --git a/bun.lockb b/bun.lockb index eaf98e5242bb0c7bd558889804a5f0f3f7ade312..1853e532cb4770aa276db340e516a95f43d760b7 100755 GIT binary patch literal 237035 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

    C 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 delta 35379 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 accidentally un-rendering incoming routes that happen to resolve to the same component as the outgoing route. + +## 2.2.0 + +### Minor Changes + +- [`9a814a9`](https://github.com/preactjs/wmr/commit/9a814a95e76883254c3e9861170259ddd6d9ac0c) [#832](https://github.com/preactjs/wmr/pull/832) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Add support for partial route matching via `/foo/*` + +* [`439768e`](https://github.com/preactjs/wmr/commit/439768e6ef3e0a69fe872196f2b3f05bd3bbfcb6) [#835](https://github.com/preactjs/wmr/pull/835) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Add support for nested routes matching + +### Patch Changes + +- [`21bbeb9`](https://github.com/preactjs/wmr/commit/21bbeb9a9a58e2c3c59f9db2cec1c651e5bbf5f8) [#831](https://github.com/preactjs/wmr/pull/831) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Fix `preact-iso` intercepting `cmd/ctrl+click` and other native browser behaviors. + +## 2.1.0 + +### Minor Changes + +- [`c963fbe`](https://github.com/preactjs/wmr/commit/c963fbec5cac7d45a65ffa9cd05d937e56fc5aa6) [#586](https://github.com/preactjs/wmr/pull/586) Thanks [@developit](https://github.com/developit)! - Pass route paramters as props when no prop exists with that name. + +* [`095ddde`](https://github.com/preactjs/wmr/commit/095dddefbb5b56d0a897716513977a99f38665bf) [#824](https://github.com/preactjs/wmr/pull/824) Thanks [@developit](https://github.com/developit)! - - Bugfix for Router: "splat" parameters (`/:x*` and `/:y*`) should be passed in the `params` prop instead of directly on props + +## 2.0.3 + +### Patch Changes + +- [`62840d8`](https://github.com/preactjs/wmr/commit/62840d82eddf1bda9447c08750fe6886751edee7) [#665](https://github.com/preactjs/wmr/pull/665) Thanks [@rschristian](https://github.com/rschristian)! - Removing unused imports (and associated console warnings) in preact-iso + +## 2.0.2 + +### Patch Changes + +- [`c1f3f0e`](https://github.com/preactjs/wmr/commit/c1f3f0e42a053811fe894f91a7bd702247e550d5) [#608](https://github.com/preactjs/wmr/pull/608) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Fix `useRoute` missing in main entry exports + +## 2.0.1 + +### Patch Changes + +- [`79c7fd6`](https://github.com/preactjs/wmr/commit/79c7fd6a5cd46904779a630ac42207e9bf918f1c) [#594](https://github.com/preactjs/wmr/pull/594) Thanks [@developit](https://github.com/developit)! - Fixes a race condition in preact-iso `Router` by registering the link click handler immediately. + +## 2.0.0 + +### Major Changes + +- [`8e8690a`](https://github.com/preactjs/wmr/commit/8e8690afee44e6d2bb83201ec3b283a89331995b) [#557](https://github.com/preactjs/wmr/pull/557) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Fix route params being able to overwrite route context. This is a breaking change in that params no need to be pulled off a `params` object instead of accessing it directly + +### Patch Changes + +- [`8a44d75`](https://github.com/preactjs/wmr/commit/8a44d756ccb72d32c36e6ed03d618462dd8a6ba3) [#571](https://github.com/preactjs/wmr/pull/571) Thanks [@developit](https://github.com/developit)! - preact-iso: fix ErrorBoundary pushing invalid callback into commit queue + +* [`6f93a06`](https://github.com/preactjs/wmr/commit/6f93a06bb2065e5fef15eb4f2bfffbd07bcc616d) [#567](https://github.com/preactjs/wmr/pull/567) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Update preact/iso TypeScript types + +- [`c7ca0a4`](https://github.com/preactjs/wmr/commit/c7ca0a436bfe99ff9d8d15dbad6b111cae40f799) [#555](https://github.com/preactjs/wmr/pull/555) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Fix crash when passing dynamic arrays as children. This was caused by missing children normalization. + +## 1.2.0 + +### Minor Changes + +- [`a7e79c9`](https://github.com/preactjs/wmr/commit/a7e79c9759ec87983bceb83819b5c8387299c867) [#530](https://github.com/preactjs/wmr/pull/530) Thanks [@developit](https://github.com/developit)! - `` is now an async boundary (it handles `lazy()` descendants by itself), and supports cancellable + stacked route transitions. + +### Patch Changes + +- [`8d5d1d8`](https://github.com/preactjs/wmr/commit/8d5d1d82d98c7f2e2eaccb92ff6890cf1e2e6139) [#534](https://github.com/preactjs/wmr/pull/534) Thanks [@developit](https://github.com/developit)! - [preact-iso] Support setting a manual URL via `` + +## 1.1.1 + +### Patch Changes + +- [`2d0bb8a`](https://github.com/preactjs/wmr/commit/2d0bb8a64783c32cfdaad05563b6293649059ef9) [#504](https://github.com/preactjs/wmr/pull/504) Thanks [@developit](https://github.com/developit)! - Bugfix: fix route flashing for routes that render fragments + +* [`321dfce`](https://github.com/preactjs/wmr/commit/321dfced389800e661174e1e304fa8ecab593f96) [#496](https://github.com/preactjs/wmr/pull/496) Thanks [@developit](https://github.com/developit)! - [preact-iso] Router: reset page scroll position on forward navigations + +- [`c07c39f`](https://github.com/preactjs/wmr/commit/c07c39fba101e34e673997262f71f80a8488b6d6) [#505](https://github.com/preactjs/wmr/pull/505) Thanks [@developit](https://github.com/developit)! - [preact-iso] Prevent the router from intercepting clicks on anchor links + +* [`764830f`](https://github.com/preactjs/wmr/commit/764830fde981e60f67fbc74f7e5b46dcbc98d573) [#493](https://github.com/preactjs/wmr/pull/493) Thanks [@developit](https://github.com/developit)! - [preact-iso] Prevent the Router from intercepting clicks on links with an "external" target (`target="anything"`). + +## 1.1.0 + +### Minor Changes + +- [`44d5a83`](https://github.com/preactjs/wmr/commit/44d5a835aa08fc4e4497706045ce26ba13108b0a) [#461](https://github.com/preactjs/wmr/pull/461) Thanks [@piotr-cz](https://github.com/piotr-cz)! - Fix Eslint and Prettier suggestions + +* [`f7b5bd7`](https://github.com/preactjs/wmr/commit/f7b5bd77c3d0e599cff43226f903483cefad9539) [#422](https://github.com/preactjs/wmr/pull/422) Thanks [@rschristian](https://github.com/rschristian)! - Adds a new Route component export + +### Patch Changes + +- [`5ff2c55`](https://github.com/preactjs/wmr/commit/5ff2c559feb83ffed514ed67b5d7f3e2389ef5cc) [#459](https://github.com/preactjs/wmr/pull/459) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Add missing Route export + +* [`0833c4a`](https://github.com/preactjs/wmr/commit/0833c4ad25ceffae461d4d8f8643744cc0b7e080) [#408](https://github.com/preactjs/wmr/pull/408) Thanks [@piotr-cz](https://github.com/piotr-cz)! - Add type definitions to router onLoadEnd and onLoadStart + +- [`f320e3e`](https://github.com/preactjs/wmr/commit/f320e3e46cbd66c4d0580c6ec567e335b646ac5c) [#416](https://github.com/preactjs/wmr/pull/416) Thanks [@JoviDeCroock](https://github.com/JoviDeCroock)! - Fix routes with leading/trailing slashes + +* [`3db3696`](https://github.com/preactjs/wmr/commit/3db36964afc1f3158d3b5d377d06ccf32b6efadd) [#421](https://github.com/preactjs/wmr/pull/421) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Add missing types for `onError` prop of `ErrorBoundary` component + +- [`0bbb8cc`](https://github.com/preactjs/wmr/commit/0bbb8ccaafb1182b5a0f42ef6208a40d774c73f1) [#424](https://github.com/preactjs/wmr/pull/424) Thanks [@piotr-cz](https://github.com/piotr-cz)! - Set default value for push to true + +## 1.0.1 + +### Patch Changes + +- [`58f1bff`](https://github.com/preactjs/wmr/commit/58f1bffd108f45c1ac5759f744f484b5d6a8fcca) [#364](https://github.com/preactjs/wmr/pull/364) Thanks [@developit](https://github.com/developit)! - Fixes a bug introduced in 1.0.0 where Router would duplicate DOM when hydrating `lazy()` components. + +* [`ee75298`](https://github.com/preactjs/wmr/commit/ee752988a190ca3ac34c8614b7ac8c8d4d5a5062) [#368](https://github.com/preactjs/wmr/pull/368) Thanks [@piotr-cz](https://github.com/piotr-cz)! - Fix hydrate parent definition + +## 1.0.0 + +### Major Changes + +- [`c681137`](https://github.com/preactjs/wmr/commit/c681137b29ec521dcec050cba58ed24089629f1b) [#359](https://github.com/preactjs/wmr/pull/359) Thanks [@JoviDeCroock](https://github.com/JoviDeCroock)! - Remove deprecated `useLoc` export + +### Minor Changes + +- [`fab59f8`](https://github.com/preactjs/wmr/commit/fab59f88ecf2b6d2085941a4f92ccd3c78684738) [#354](https://github.com/preactjs/wmr/pull/354) Thanks [@JoviDeCroock](https://github.com/JoviDeCroock)! - Support route params and inject them into the rendered route, add the `useRoute` hook so we can retrieve route parameters from anywhere in the subtree. + +### Patch Changes + +- [`438be29`](https://github.com/preactjs/wmr/commit/438be293346c969384a57f3cfa31931f2722ea5a) [#337](https://github.com/preactjs/wmr/pull/337) Thanks [@cristianbote](https://github.com/cristianbote)! - Show the previous route only for the unresolved thrown routes diff --git a/preact-iso/CODE_OF_CONDUCT.md b/preact-iso/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..9e81e67 --- /dev/null +++ b/preact-iso/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@preactjs.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/preact-iso/LICENSE b/preact-iso/LICENSE new file mode 100644 index 0000000..ad648ac --- /dev/null +++ b/preact-iso/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 The Preact Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/preact-iso/README.md b/preact-iso/README.md new file mode 100644 index 0000000..503bbac --- /dev/null +++ b/preact-iso/README.md @@ -0,0 +1,147 @@ +# preact-iso + +Isomorphic async tools for Preact. + +- Lazy-load components using `lazy()` and ``, which also enables progressive hydration. +- Generate static HTML for your app using `prerender()`, waiting for `lazy()` components and data dependencies. +- Implement async-aware client and server-side routing using ``, including seamless async transitions. + +### `lazy.js` + +Make a lazily-loaded version of a Component. +`lazy()` takes an async function that resolves to a Component, and returns a wrapper version of that Component. The wrapper component can be rendered right away, even though the component is only loaded the first time it is rendered. + +```js +import { render } from 'preact'; +import { ErrorBoundary, lazy, Router } from 'preact-iso'; + +// Synchronous, not code-splitted: +// import Home from './routes/home.js'; +// import Profile from './routes/profile.js'; + +// Asynchronous, code-splitted: +const Home = lazy(() => import('./routes/home.js')); +const Profile = lazy(() => import('./routes/profile.js')); + +const App = () => ( + + + + + + +); + +render(, document.body); +``` + +### `prerender.js` + +`prerender()` renders a Virtual DOM tree to an HTML string using [preact-render-to-string](https://github.com/preactjs/preact-render-to-string). The difference is that it is asynchronous, and waits for any Promises thrown by components during rendering (Suspense-style) to resolve before returning the HTML. Nested promises also work, and the maximum depth can be controlled using the `maxDepth` option, which defaults to `10`. + +The Promise returned from `prerender()` resolves to an Object with `html` and `links[]` properties. The `html` property contains your pre-rendered static HTML markup, and `links` is an Array of any non-external URL strings found in links on the generated page. + +```js +import { ErrorBoundary, lazy, prerender } from 'preact-iso'; + +// Asynchronous (throws a promise) +const Foo = lazy(() => import('./foo.js')); + +const App = () => ( + + + +); + +const { html, links } = await prerender(, { maxDepth: 10 }); +``` + +### `hydrate.js` + +`hydrate()` is a thin wrapper around Preact's hydrate() method. It performs hydration when the HTML for the current page includes pre-rendered output from `prerender()`. It falls back to plain rendering in any other cases, which is useful if you're not pre-rendering during development. This method also checks to make sure its running in a browser context before attempting any rendering - if not, it does nothing. + +```js +import { hydrate } from 'preact-iso'; + +const App = () => ( +

    +

    Hello World

    +
    +); + +hydrate(); +``` + +### `router.js` + +A simple router for Preact with conventional and hooks-based APIs. The `` component is async-aware: when transitioning from one route to another, if the incoming route suspends (throws a Promise), the outgoing route is preserved until the new one becomes ready. + +```js +import { ErrorBoundary, lazy, LocationProvider, Router, useLocation } from 'preact-iso'; + +// Asynchronous (throws a promise) +const Home = lazy(() => import('./routes/home.js')); +const Profile = lazy(() => import('./routes/profile.js')); +const Profiles = lazy(() => import('./routes/profiles.js')); + +const App = () => ( + + + + + + + + + +); +``` + +During prerendering, the generated HTML includes our full `` and `` component output because it waits for the `lazy()`-wrapped `import()` to resolve. + +You can use the `useRoute` hook to get information of the route you are currently on. + +**Progressive Hydration:** When the app is hydrated on the client, the route (`Home` or `Profile` in this case) suspends. This causes hydration for that part of the page to be deferred until the route's `import()` is resolved, at which point that part of the page automatically finishes hydrating. + +**Seamless Routing:** Switch switching between routes on the client, the Router is aware of asynchronous dependencies in routes. Instead of clearing the current route and showing a loading spinner while waiting for the next route (or its data), the router preserves the current route in-place until the incoming route has finished loading, then they are swapped. + +### Nested Routing + +Nested routes are supported by using multiple `Router` components. Partially matched routes end with a wildcard `/*` and the remaining value will be past to continue matching with if there are any further routes. + +```jsx +import { ErrorBoundary, LocationProvider, Router, Route } from 'preact-iso'; + +function ProfileA() { + return

    A

    ; +} + +function ProfileB() { + return

    B

    ; +} + +function Profile() { + return ( +
    +

    Profile

    + + + + + + +
    + ); +} + +const App = () => ( + + + + + + + + +); +``` diff --git a/preact-iso/bun.lockb b/preact-iso/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..2525bb1609ddcf0189009de7aa3f450d405eb51e GIT binary patch literal 138621 zcmeFad0b9i+dh8bk_u%g(WFTViRO`{Ng5?(D4I+2pg~0`Axb1=Y!Ia)QWQ#rgb1l9 z8YB%087h(QdFopCz2E!uJhv-;fBins`FXdawe~uW^IYc|_S(Dd=M@!}-sI~eZR_G8 z?cm`rWV^|O9WE(1Pdisf7dHnfM^7Jj8$T)k1?;0~G@6c0Z^Ux$BYn97%41_@rC21+ zyD;v~-q9M(?LOU2PBo9a`LPv^W<69I|28FfVUqI{n|U&ZgK*?JEK2S z!8!J48{D4+_yfw=&K=6!*d7q$YllYI&fUe`LCW5i_6!Qx&m0H}5=LK90Wqv>zK-6=Fo0$I|C}3Q*fXJ7gKFq%YWxU@4WklB*!+!Gt!F8Cgn~kqC z#2o_{G!6SXt)*OiN!&Kj4)b8^V`GOC$&YWid>IhOaRLN`evP3W&hJHl=;y!XgZL%- z|IAAr=;6F#nK`W6DoCS=K=}d0kMZ_HJ>J(98tz9HqkkJ6eEpycG(;&oHIuyr9*=2&==V7w>K6kF06O^ic=|{=1U{4) zZa*ICkyj=;oL7-K!(}fiHy3voKUylITnP8E9hrBMbBFtz1NGQ%mU+YRm;<6;2O#@7 z_ym1rwBwQ*?#E6>e~&>K=bZ)cu^%Z6os08_+nol)dS3^3e+M5LZQg?6`XC!OHy0R! z2I=8^-37$?a2=2h+b)Y!2M#1axxqw6%ft&H-hN^Rpt22GU`5fSBiEKy1&)Xnz#S z(Dg7i(8YPR(HBM<{N7Zd(O@cvZBZR=?*zyLEG#X6Jumttt z_CbKSPD`O4_5YctzD2|R=vh3xudUV?9-n3?W89U1T!7aBvA@rtJuHQ=azN~NHt2E# z8Uu;})@cs!50X&E{tn5~XfVWKwSX{{!p;L?eK;TtS(phR3`v+YAjZcDh~v;HL!-ge z4SNWPdCFpx?O`5Zetqt?q2#9guyg>cs#>3<6>0#%9n9WaI8egKg*MqxB`!qklRe&MQY3 z4|}OiUbHi2!@6k0q#hPLLDyYXi`K%r0yD)GKAScw@JJ`eU!*kpdvrVIwLwg*j zVnB>j#%eg8SU}A0H^6CtLV)PE*m}5p3J~v~1|An6A52<|Phi8ae=k=jDSHPg_`|h)-P%0oLc_}zv{nZ#d)WOb?woGZq~qJ;?}k5~m>vG+;=URu`9z0m@ygh< z(&OmMLJMQn?oFO?D{*?2Qce1tm%BGDlhjvnY_2<05V=%xk?k%;j8tHNO@FKB)@L==B|L~ep9r0Y5Gu)w+x(kTtzA?xO~ z_mHl0FJG3l^r-km>w7kz%5J59_hB>IX~ zxa!DiUFGbLKJg9CmnT}*-!+oHkv8LQ8JDfMn7YPz zPNhedSyjtECBNP$y(UJyKwX*5Q|)%A>ESEA-h$sk@_0`t${RM_QJQ!(t0T-;sZqKt zbc&kH#Y=8az8_QEI?qgcZqlha-F@w{EQ`aWv&vt-NH?Ew(q8gtY-*nQ_t1yt-N)Ft zBpqTNka@h9+sdZs@?lXDcbEIkBbIMW@0D`Zv0N^DGgJLz>G`{p{D3RvJ8=zBb5X>k2{fz{z9Qo%TyfPCK4*?DdYZ`z7jC>+1_exKy{CE?s4O z=21X*?F@Nm`Squy=XED+uAe#SzMWK%YIItIjPStq7aeUo8|Eh@eepQBjf?%1XqBK* zcwD$Iq){^^AnwfFhUx94 zh7-A$y%B)6dsb{4AuCN38vrF{q4{_!X2tJPsJ6=e1ReWr%)u(3% zY~VFkJi2OpWmo&*!)DTD2Ggdt8A$BZyS{`g+l4oGRq(7^r_5&aZKU(|yLX>nE)qSz zq;S5bjKpKkr8@PT>fK75*+V&-4vTT96zyI)$Zel@ciLBOcFqq^HI2=U4P)X<`i^oo zM-|?U>Dm|^#ipW=+_ge~QCI7VuAmPEb@hv{ZW);D;5sB%d1%8jyYV8s%%30OzSPOP z{i}GbrebWP;L*ARMvp7Y1gaWwYXK%GJ?=k9UpQNxrnmwXn;;d_GT92e1N>;d( zjUIXuC(X%fJ9FQK&aFLNL2CNblC=&x7UpQvgiOX;_&1ys+Ep00jc0q$&X{Oj7(bcubU)j~6H2q3$S=zFdvxVxqS+=cC=6-r1@6;7@Pm^&~{hJ0N&Aav& zgs@m0QQvdY!*iXxM&8B%i^#>*eEL;)boU+=dhsnxKJHj<|EI(a^`$dMw^*C@^mwhl z)-(3#%WjE^m=F%0(N6;{Osfs8dMlb8En<3jR~u>Hy4P8-Wxav-opYLpk^*hmZytU2 zV0MWA;N-)dJkuMiow!fVyV2EBRXz4if`UiV*$Gu`R@wdDm-EJSC>o~II)aX{2NYE} z-g=nf#a;h}BXrc;e%lx8r?Se$KHJSXa3W{)XwIIet8To!9lt7Ll-|ivSHlG2r|Z5` zSK?@M;ovPW_0ebxQXR!C(!d6jdwK-86DvWt|XL{CLdE`A&NMhm1hkWgu`o5Ja4%~AvwU0RG@NkZ@ zanXs5{+oh^)(Yq?-p#g4zp3iTp}V}^?uFy4pQh#PQI%NC`6@wNWP!ztsZT}br=LGk z(ltS7#`tZsWTqKRc$Z%iTebM547x2%dG1}FwY~i0HKB(k>t28F+Pr7N%d#UikD`jsWc57t>d@qP^C7rc zd6C%3%5<%ovO}%crsqnkp0pHS_c>l9x%aD&%A%{Lv*(Kz99}y^{WhzF8Ebh#)Urj( zPkh?>eZqe2m6IdubOrY5d)TGK2Yg($M6E1fgQ=ud`W@AE8w67~Di)LvZ2nRCy>jhM zo&HyxSxt@09_9H7x^wRx)U@I$n!2!c&HD2}X3|cP))#_ek~b zzqMm0i%Vf-%ij7OPexUgozw_jy;@+yr+9uZ^M{siEPS?FsAR8?nLH{n*GfxteB#kg ze+wCbm=L48kA1HVJzb&3R%4`-(Y3c(?&QJaZ^sI4SR(P^XfVM3JBcoS3LFY*BCpmEhaWQk5-WR_|2B~Rr3eWfjW-0 zWlL?B9vt=awEFx1jAl?30pXPbHsb#Y{GbkecsKcJBhB9= zNF2sLj%m-s4T=ACz+V7->_7S*ssBB|R{}oj;TVpTe-lVLz(?*#jKt3lfg_)knbjce z*8m?rMTH>`*8sC|5Plx;H5mS}@1!1n{8uCGdV#MGe1H)d;j4`u_K$q@KhpU30bdpT zBNu+ecWkfPk;3J3B;m^M^()JAS;gikJ z{=;_&rj79Hfe)V)f6ia5V|E+~e+DdE8Q_D=h>Y-;1D~uvQpb!CX&V82j2}58iGlF1 z10Oz_{@j0lXa0X?#E*Hy`Nymg|5C8=qJJ#o1#(Oo;oAV;8Tc4G8o}YxfB%>8D}ayd zm&86&z5q-*9DnRTuHBK&A7kLp13t#{JNXX=KJI^H>`A}=d(VgOkam}VuLpe6|6lRQ zeZrpv8xB7INSWOK6_WObz+VA;X7@d!OZdsahhIsAF`M^)@_Q-qWBx@+gI^%=FAX0# z;SBb3{=qzE+6dnf_&N+el3_YBWrTkj_*xV`Q)FmF_(Q zFT(c+KF%K)hM)eKod<+}0r-D1{@uXG^Aph{>j-1~HzVx@;G;L@kJ-41CgGa{-yHY? zaD&;s4>brMf60O8XD)^?vvCmqGT>wWVH%9c2tNw=m_KIy5+{V;4163vEHk_Jq6Xnh z!%GYG{Ku>Y;U@tf-+##b9V!0-gHQCB%>!vqhnEhFANOBoxzzq^03Y*5xI`D*{F{+> zn}JWxA4KEdc;p`8=K&v|e^`(Fk?vou6#ht_LB#(w_~nl#_$O;;q~m7`e9S+_jqwv* z`0-zjw95cKu0Q1C8e%qwg#R4)cz*xg^)ET)@AZSeN7{co;KQ%j!*Kp%Ow8^BB>ptu zaG7SG1JE{Mb5NRh0za-QGK8`=B`xO`OleSL4$N5jzKQmk^KNW^1AqM^m2>(9t^?(oX(?;r_3qD*K1E26l zn*UJXX^OoonzCQ4m{z3m^fRFnJJVySCiTL<8B>ry$AM=OfPU`-R zNA8ifbeQzG|Nid$(Ez?2@JarNF7flf4 znB6;2nDDKEkLM3&`%Qu({DZ*9^-IQ$*%%1F4fr_!(LdG^9pdM|A>oS&{{8(J&wtGJ zgYX@Juf~WUeUFr%#_&(ZAIFdxBmOzzj|Nr1KeIfdP58@z?*x4G507H}+dQU>@XrAs z&mZ{xgW0~L1Hxw&8a}@h?nuXP1@LkFN&iRs{Eh=Yu3wl&G|U0BM&fT08vZ-n-{l(% z|9yV^9sgH>FAMSG`4Rafu3zcjVAh{Kzb$~j z6#W10`aK7Ha(-kscFe(F{ipcHIn3-lBK%q6!~Gu#m+F5#@bUY}@AhAIHjQQke2n{d z=3hAQ@%cHHk`s*YS4R5Z1$=$rletI#6_IhD@Z}|FG+W?fne>4f3BpeVKF)vik9<=9 zD-F`_Iq-4)V|%P)b`BB#bjd#(zo)=AWcbH1fY13%8SyVQXE=T`_N4w-BBY%w@D;%S zNOF(bgrCFkk9ExEj>_)@{-4Z$`MJaAXWYL?4p9GBM&b_wz6SK4lz+t|_euLA;4cCG z@2=me^M=pAWZe*5;^)61X}2Eu;A8y1 zv;G96hQHqc9sm27pBnh{uZ;M&1itnkf6O7SL1v7^e;fGne-Qs5@OA%yuL*}YXW*0dNAOpDAo2Uc z$1i;Tj|0N=Uy&&H3EvVrkKfNo?ndhWAn?ieAJiOa{_g-E_m6-2wRP~bnGeFdjtPHg z|GZ3t68g^{N&I7B@*4o3l>gc8zm-XQQ{dzJ``!E%{-J-mB8_Ir@Q>f$m|cS;{&m3D z_=EWQVDjMn84tcE{I_KNhkD}Q8OZqj{oVYf1K)$ep9X%I-3N*PDe&-KN8#fck{Kg> z58zue_?UlYjqq;+U*iw@&jORrffD~nzkj&`Uy~C5Nb}bQe6oHqccfpx$^&UPU3K{P zci0}+{)}G{8TSeQ5b(_)eq8@J_ukD3w(Xxqi@t8^}iA!?G#}0A|KnM#z^N+ z0`PSh@uTKH_c7G{Pe%OL10UbNes}%MfX#CQgOBqU`@oD5|L1^D=0C2#k@lYzf?vz< zkNlC2pB?b+De;eV{*Hl{C)~d=Zp{5i^REtk*uwvsKO^P)0)Gkcaqj-k{z2Cm{{1!a zI}vo4F*1H`8vpnGhZ!!mA^c3>FNOF?nS)6I(!LA$D}ayjV-9YS8^6#Y&D0@zx(q&2 zu2oc!RQ#&~;YR}B8u++=F#jW+zb(MW_4~Vg3C+L1UoyM)uwx{C58!WP_{ZFjH2z-T zuVV10qcD?3{OiHsyEFLs4T0G{5Pkvh1O9+NPm4zL`~&_G;FI$MJH(H3kQpQKvuV?4 z;eX&i8u*b6{_ptbfXQd~2mZZ*Z~F)Sp8%hXKc4?ay8mdv;eU(F%X?iKLy`Ayah?jy_?;R`SO`}-?yd?b!vX%PN;;N$a)@K}CD zWZWnG1mMFE{Cs~$F6qawWC*_j_^A zusxYWzvAM3;{P%5ar|)H(Dz8kZ#ulZYccq!%d8Rq>wu5*4`WCFY)lFeek$h{bJVtIFrBkPvkHg1M#z%!6*G5>GLB1`1t%I{9naQ?i2q7z}Emi)}zKq z$L}-n@%)SXE^0Cx2l2nb^zZ+E4(mug{P?d%+T}6$=$BdFC`|Z5uz6@O;>UVsjqp8y zuLyk18wXs>#z6Qdfe)Xs!U&I@$p8qy9r(EZ34f&HCk7vXaQ&fMqQOiE#J?Nx$@%AZ z_=Uj7`OECOA+ZtvUl@F5pZovh%dH$>a6piPiu2{P)j({Jm6!$Ne(c-zcRu<4SdWW@<%d;g#QZof3kj-TK)asFa6H? zKM8!;LVtVzm;xWq;T7!X^OFm5!0b7O^nU~Jar|-Z{0{#K@NxYkAID&%^H*s7@b4dy zkNF$v^V1Xf@CoC$_n#NQ*8u)V<_?7U*Zv`~Vfg%s{E-;RzvG6#&%dOO86DF0DDW3R z{K&zzN9wWsZ${d^-0)}nmw?UR=T{tiqWf>Y@g8Ys1$;G#pX?hWoxg{GkLO>Ke}c^V zzXyCp;0plZcb*?=w!^tEMt`230Ay@@9A@oz}l?gl=- zzmWM$#_`{{c#rTKfsf}0GVUXtKT^(rfB*QEPwIW*-vRg<;GdKUQrrHgpGmuuz=v0` zu-{$(-+>RW;D4RJiSB>$Nv$L8%v^@Y5AR_e$s@JxfBKp56M;V;{FCuxHvg!}%D7OA zeD|Z`bf_1B3k?z5i7`+d5DgK1&c*^56|r6dE<{PV&=9da2QJJx#Qswk&LBUH8ALw( z+3ioGBG$uR^3(nkV*K!~@zX#2+38P1L>@eYe&$~JXYJ2#qCe|lZ~j@Y4v6hwuls3; zSYA9_{6C2G8jN~G9Gj(#G9upBf{P6oT$mqExX}I$QQrqH zh51W?3wfz7xX`GG`cL6Pof^2%MuNzH1{Y!jT$tY$xX}I+;=b_p=iOn%c!wBe zDq=i881;zUaB)E;=5rd}WFY>?!zd%79v>i9@iXcXS)nWjh=e4 zh}f@%fYShV8TE+x-nteLtJX2l3JYLVL_Hg*M|5D^N5pa32#8g#@XtiRKtN8w9a#Ab z#Joo{+EI}m>JKpLsfbkx@DC#X4`E|Ik^oWX2v#x><4k6h5wTq=qfABQr8DXgv77;j z`8orLx6U#!7ZCfK&nOq*O)y0CR|JUstBm@QAjVe$Jj7B49}&wp7gP0}%5!8XDuRF@VS$i~sxsaeT%z>JhR11V)*PSjEApry}~B%BV-g@^nTS z5r5=`e^8f?QBOsz5@6ILVmmJeoa_Ytuy%P1ovUx86Z#CfR#h*fF~Tm*>u(*i`kHr`|)?gy(GWkk%2HKUA(?bkEP zRK)$s3F^`RMnLrI!D#OZh&q0N@P9OaMtuMvwhLy|hcfE7FmNj%8Y1rhQGi&rlTlAa ze1|y6xSs)taby8velIZEBVzpdj4~pY3mD~pL)0r|v@c?`M@0T*Mj3Gil%D`%`x-#J zRmUjT17iCItYjdzYlJf9rb(Ud89r|IVp6E8tnq zc#b3f@0>b(Ud4R|&!=dJxSsxZPW}JOIdzD02nYE8V;e;q)}>0*GZwrLR#+pIcj=v3 znz($~`Tbrio5tTaACO%~-(j2mcpvT5Sq+O*k7mBV<;M9@j^mz>@rx^BTI!?kT~oct zm#MV`VkEkZ>G(5hdRFD(<98=bolv>U+IrMYvzlXCWHe55ULVUq(c~$c->aMr+In``Jgd~i2DfLCgQs7=OvqS$3%^a0 zc=26{82v{T_u8w59;Ke`PBl@nQw{2Fo~V7#D@$98zc#bbq zzRJJ;U|P)=uJZNY`7gZc3->&_6oiN_zIza(3yFRSZhtHIUbN2eq)^D3wz^uK6%pdG zto|S0vH90(IQcFc*q{E?N9crf>b_SK_by#*@U*sY=f}h9k3VUztL4`PA)vU5THfo{!JczWG2{XUy~5`P+331rD;ArmMLu+5YSphi)ZWcvpZB(ZzQ`V)V(4_s*t-Od8O+EmvZ6g~umB;@Atv?d4NmCJN8z ze;oEc!$|S~Yi6JDKGn9kd2Jr4fdU7f$qMGAuC(UK6WE)8->Zl&zGo4mTa2?}=@|2% z=W}Xb>5`ejZ5`KzHYQ6RHW<8Z(IuAN>o2@2TA3~C&^^_F4SaP4d`1IVEC+LpBi@I+ zeU#wT*V73?L>J#diP4|0{n3>^7<@G5?j+jyh&7TuPUhJk3vErz*P3p)8duk%cJapM z>W||SI;^)BFW7DKp{w2OTg%GTi3{G}dA)4L2mB^Vbjf=lYSW8%2b-v`{Oqh!yLDdV zmE|gZ8du(pIVat6V6E25fN_Hpj(N{9oa#;s6+Koov}fPsHIXISb_JhPjowJE(k}RV z6~7A--SH^MF#7Svm}d=lEkt)1Mm&!}9o_Ib$Z@p6S3{&v;h?*y2I z8Y&4#jp=h#uQ>8_wR1?f^wAXlJa>ujphI-=8xk>kMvQaB>^&>4D#kd?60om|SS{Bo zm$0t4!Gg=o_EvR#n{!IjA*s95!@g|gzgG6G@vO$jGd{;0gUwUvI*CtQQrCbG(Zw+& zMsI$f{;pwOWVx@*vFw>fS!?pNTIS5kEYvjF8XMgrWcF^~IOF1`XG^6k*W~xyUVq%f zB>VV@<=*`Do>N6sI17%+f)LT=AfkYDo5PB8EBABe+uoI;S8H*m$$ae5w?5?;C;C`M z{d{?Zd977f{p-hiJ_;^V4_u_^;2?oZ#Y?TgC(Fj_-~}x=C!w_3YK{>Fne? z|Ea*;qxCkf1rqNhA__=%+1lHdV7l*<(-zmn{x@rvJ$pROeEr6+i_5cV(r4E7mG9&0 z-ffe&A20?XqRT@>0qHkcRrNYO6Z$q}Q|KFaaF&`oqnygEJMWR~a?mS$O*Hp@lD8#nt~ zZn?FtG&Ff--p4Q6Jaz2}V%##_dV3Rg-f=m~;%xtRX@-A%VN$g1_BCPaDY|@AT?;+C znLBhA&D1z?*iR$L}P#P`482xfuT}7MHR~<7nbIH z8ol#Q*=>d0A3lEALDA)>>K2t~y=q>fmP2zA;3|#eh}j+`uy9UWS*O4lQ^nh%!C|Ub z{9e_L+bw=$pilUFiEHPSDqZJ}_>S9?B%+LN9~;0qOY(r(H1} zf2JtRMMIrUg$jRR(08OUVO;Xv*Rw>-JNaesu=W9?eX?W zCk{~e2SFkVNcXd##U7}d#y(zl!9|O)i^jh{vi!1C^qOuA#V@zh)CD?Ce&9bT04 z#rkkUq6$s3Hmay8ta4kBeImczvGtBprJzCLok`VI=iV;Zdf-Jg>UeNT%Glf3G4B9vP4&i zs(a3bv;4K4%(JleTVHy@l(;5q%`-XV6j^AU5vA;v+jYR8o zc8^{unj3ig&ebhVr^Vjf;&`hb=RZnMV~%vu+(VNkUv^BsY(>!(q3R|(TYlK#tYv81 zQ?lm?=TcD)o$z=+J`dxMGB>n2=f(t^nFYUaLp`%{64a{P>2Ww>)0d`@BE#Jpb~66VlJ@7JQ^_hsm$H&xGR?>$?EI2fXa$_&W;UB-@J0Po2WI#++ybp^%uH1aTMKIRNcu7 z#S(e?$TavLbBl)E($t(h}c{pcC4u&^X`^+^Tlh7LBKEe}f! zp7DpTihs;e(kyURG(uEUt@oVQriXk7rH=_$W+d*W=+36Ny zRfB2U&1|RU_m0X}Ugoxxb*7`~?g!g0Pf}%>q|vf>cIi$x|++zY4^7PDVZtN~yOTVFQJ!L;f?!`FTT$a`QSo);7jFyZueI^;af{Pxp{h4o{ zY*N|ukOPWNC3YOaKZ?Ac)BP#Bl2lzMv52>|-=C&kf5gAMDK%Td%Odf-zy*`iB;9qX ztIk>blywU=r`JgpZc}h(6Y4%&wLHe|=BGoomjlfoWh@9%Tu9NKL)BGoFIL(jr6Vx? zwBhaB+=HK=EIu-JL-ECBE~0C6jF05a5PdX%T}XhC&FQ&;)4OJ}oLP73V}CU3rfnZ` zGEddrsd+@volDgneq8ydUcPMtP!kI=j^%59eo&a)NkXn_*h zcclJOg?)0!Zt7;~igjOer=?466>Be>vCD$}i@J#*Tj_^87GLM{a$NbYZWtQ7K8UY= zLQ9h@k9U8+(r&K_9nFb{Wp@rdp}x1^-zO2H?{!SpzrAx(eYyRM@b`A7d5&K$KE7&| zk#joh9;44GF7$64IuEjLHeRig7L3#}bNjfsoHH#aXK?ZpE%}4*uU*4;R}!x@5e1|x z?!HKyGRuj~yvnm#bn@mU6Rd4ml0L3ouOK64_}4ctm-o1%nH!jI z{wYH8;f<6hYnQZligGI~yfEZHlsH)P;_04e7w^qK#J7&3i*t?`ec8?>#Y!PxsvB7s z-_Wj(Jz~|SG_CNt*mL9Ay^}XsNnSs;cxv}N6N^H>kahljFCr|Rf1H#m+JBYn?eQHs ztdF(MgAmDs3=svSYo&kVH!wIAwXj8E!Y;GvAA<}#baxu0IgI7Z)%`JJcGA>==+`XMSrCATvK=^%u4sB=;AvJF?!;8&yZ2CeOymwRLmV1a9MIF z;YR(HW1r05)_BA|@l#2i@?NuFbw_?y&b_JyMPcJVe2=^KWwpv#9U` zSB{7R((9h-O;qEujQ2YaI}YJ=JkA;ev47bXntzV!j7?Oc$x}=tW<- z8D)Kj&v(o~z~bhr0lSWliY&Fy4wo+`CLBJ!tIPcAG-W#(9`C>&imn1xH_&xE4@dRM znv#g4h^ys*~UpzQRN>s!Hh&hxAE9YXb37E;%n(qF2O-v#9wIG?GR%aj`%Zg70~V7)U!%RTg~!xM*4VLM-C_fhNOUReKId>fayD7SN$u*>zzK^?e9`?@Ww-*>3+tp{@}BCvt-^=~6NJ zL8T1^bF&h2)k~&+k@If4owBYv|Lnt*8)6Nkzi!iU9n;z6n|HPH(wiek45!FDZ+ihk zB)^M@C?MTOS>{^A895QbtjS%W((+3j+F7UGyfw3;YopARjMEmJ(_F^w&q}y>nQ!+Z z0msj;Q#oE`4$1SFE8A}A%TeCAwTYs;n5t{{{87lhqL>@8Q#E!+-{wn`7Zu5)Pd&#X zyI`@t$EZA$iQDr_yksTAc-E;e-js6uL1D7ZhB)sx)pj2I=Eu*6SW|R0sJahR`6M&% zoJx&0JD%5?vNA%->XK#Z_R$;G%FnX*nmgu4;15nz;Cw1=(7yF1N|yvZ4_1tZ-3CHHaXaixXOPnu}{C2oYUPA__>?&I=k+-tP58(@Q?+ zL~Z=hDHY#>Wmj8qzVmPBx9C46-6g&_$z}ddK8aXqZRfGuhZ4=R6N6M<&b*tmH6!vE zPccOozpWCZ%k9yAljParm!)}MY*c&f?ls>U`LBvw7;(wfM7Jxqrg(fhRDUo);F(dv z&Y+~QfKN|lpDiz`6q~+eLB^`RkE-z5L*m6}J~4XA>H5fZ`-C^IEPDHG=Tz}KI)%py z`-NI%F7qrdleV|JR%O<4^K)UGOt)RPJGC#r;BbK+KRaO zw6;Gm1;0TNT|FWSNY|b`deNQ1=yxAH53}3c8!Ir!h3nbdy+i)WD<4Ug$SyuSd;M7L zMtR3WDigil+#cVwk0bH!ccYNzk3x;Nb=gv9;hC4{E~D!Dy)9`NfAGbbbMhB;MPAJ~ zsVKC^b+_4Ixb)x=?|q@l{$(f18=KzAtUA7At8Vi0dy%Qp%Gu%G-8JeebQWvcJPnGj zK2>*dqkCk;Xe*xySjzr1$e>6k>7T!z!D=EHX56({Zz3SYx^$*bCI?3Zg<3!ToL z7E4p}X!*RnV54=Of9OEgmN1Gge&ZlU7dP3X`X<#+lReASJ3ejZsxYoq&a&ONRPQft z{_O9Ut(bXUxXmQNs8US2I5KH<(Aag-J45pJ3->i&Th8s+xj7w#NFEG`C?NgHCeCv^ zPg1Pyi&wQf8S)+v@OYcu%kSmb$4${b)Iseazy&+HNIzJRy-XH zEPS-1{i(x^2M;N_hE&~K99L`}zIJXdDlD)4VH~hWJO^tL~LR7HNn zXW#L=Z-;Jg6F%Mj zl?Qxw5TlF|;ZQwL>N)>3rw8z?dQ;aI!ZTTcid+NIeSF4=m`$7KHIIp%LOMb@vqA2x5z zk(GwFb0TXwE+!jyiybPzD1X&HV3JSl2D=A#V}jDEu4UlbC3!F-qJZ>%%l?-K_LLq` zlH@J_@#355kFzw*JK-jdOO+O9uVSgywX1lqXtcTdeIw6YJGyLy&j-@}_`ZCS0 z{ASzg_c&*XEFAIBq?#FS5|yGNf@DO;vvX#WfS}?=yP-aLk(XN(cFLIGZHS zveoYwiPY{{u*Ag2FMMygQD{U~%i1{ijI`IuAVhS{i6|gFK>u^^ZR4bybDuU}YU}pr zPHYzTbv<5IJ;dQvJY}2dk8UOBlM*@87lvo;2)!;Zc*M0kB`!pMvfhrA7j4PsmGN5< z(OpH={WdP-s}F}ozQbToay5_s&6Rt$ZJaYDicf&o*jJ!p^58dfzDdC~fl0Goit&HA zP;^9KZ>{n{59^hNTX@aYuc+8lbSQr7NMzP08Dr|FAxZg!Vety=b(cHzl+y_whLJ64^c=vq>Br%&c?ve%gS zYACD9e=z%U%{^<^iYTwv{-n9C8zK)~A1wYBxq~Zt;QlKfo6Ae4R=X`vj`BQHwl;jj zVV_;^9w&EEbXQY#tyfPg?iKHtk+bH>vhuF1{Itg(I=6dr3q3k|&-#>{cdE=6>*lks zzlkJ899JE`@$0BkIo7JA6eN>@Gx4>+i z&C`lK?61zP*L-xsDXY!WZui0OYx57!E3)05>u%NG>VI}sA8o~E)5}vQ_@p;XZ&Mfq zA)>pMhyv0hs^zz59J#k8cG+An&t2WDHc`&myyg;BUFFwrNAh2O78EMwSrij8Gi1u8 zz*~3Ly2j6peyF{P?}0|s{V+dSk!KWLe5WNwSAXU;6!Af^Ez#djUDuFprSz(mYeq}S z?7Awye4Fi-%yEtM`)(Ew9KKz-a;_n;a^Azc+rDgW5ic|t7y0_dlrh@WeaDK30@82U zL@2QKY*wT1`*(2yrxLKhPXZ(suY>SEt_{yJ_NH*H8t;=sEi&)T2vII2Y`Crj>A#qKofF z#OPh|gS!_cz7d}L^gjQ#PYd1i7IZID40~JTx5M2jx~#aRGwRZ^#Vsx0LN;F#$(Pd^ zs@srvtZ9$9a8?fOhTbzZ>URx0A__=_i@l5`Nchm82xi9pUtr+ z?h&#_`_}mvKTe9iw;uk3p;H!1nvy^D^PY%{_AJd4Z02cGt5H{$KGQC}eTuHn0i*WG z&NDoHyicTKj6@gbGBG;)sJ;uUirWiM^Gohu;W&0Ni|T@gkn#Sx`_HyCy99WDx!mPq zRiInAveHa_)8OO8wzKB(o|*SfE6jBg`{E$8Bn*Uzt|Jizq|4NmY<=b;R=a>__bQ8r z56;MS^H|Q<{pQ=W(>|k~&p&f|9k-2%rB#UnZHNB!R<>(9xu$e}zH+G4(A!6gt0i%N z5k=RDs;en)cm3&|OEGE-c7|on>QB|o2{(+)9ChJ>UB`Y8-X&45jP~B(eM?@Y zzp!lep)-Q_b_^UG-4!RmyIyO;35u>WRrg%l`r0>w8od2_71EksOXXD8H^X+#t+TQA z?Bm8wABqC1R@YB;DZKi)cEJ4j_vdyA*LGYUl~n1`v&8%Rd*7SX{NgtQV)WvC=Nv(8 z)3Lb;XEvMN+?vI*T~z#HrrUdt3yy3@lIC1|v1}$$#k z%hF|E<+FM>;_oy`em4?PK)Sj54AIjww5yvx?AcZ3x5s_gwJWbSZYfe{!>Q||Mt}0oXn4TO5%pcTd{)@hj}MbB|2Ua7Yb2%y#6%DEgGLxXc2Hdcqw_Fk1tyjxh}k&_jC`fYyiv`f|3_!{^H zOXDPFosNGv_k;S(0nV0mzqqJHxkDdR)A?su)-JL5M2Xjns%sIZ^Q36L%`7nkv2cD* zmJhNvvdx>m$lqGyC-q?Qx!}^S{RhI?-V{6e&ig14wfWkMgU;5C$+i9yG8@0o)yP!c zK+(l-tHkJYgSPRftDmKS$sE^kr?FOK6?OmhA)waKVpa zDT~=V)?QQH7AYFF@vuX;-<8olv2Az1^I`SVC~N)=OTUTSevlug6s`LD>B7bd$xBzMJM%Y2nM_ppvgg!+)g1S) zu!|IU%~N!Ey6%bO7>X`F>xjX3jY}z`T)y0~a$Rq8FZ^zmpP6O0vAE5#};P-9$tI>B{ELo)dQ#UD!H9 zeBMp1mak)uzdcp-X^DaEpqH{?g{Mu1M8=-!aY1?xTsa1PdghK|^aGm`WbakJo%h7# zIg8stimpFZx4Zg6CD)>Ukqo)LtvRRbw5=;7PE@bEF5IKDz?BIa{SNbeJ@1X9#2ZM}eVll! zvR!bZt*%&@xIw;go!YpVM?n_~+rQLbD5zdIddft$`p1Jow}qbX4KSpg;@zeDeSGAY zmCJL7x`mGP-R20P=mt@BOLOA1+3jX8XU#Yhc}Cod_s;!UuDltCCo4$kM)gF!O)&aV zcW2y5na#aJ1;MddMNPen8*Zl8R5&as7VC-@_odFW%~V~xt=#Iu4OvTE+4ngut?yYD zly$jlAk{ZI-6_5!H9L2+;*5tH39BxP@l@+IWq3}GvR{AgaWw1OtcOKf7YcM&wo>8^ zrs`(3m{_lTY-0Om-qsbSo7F7FPj9))dwjY?`-K%p9?+}Lt($sJQPn`wU(B~+rtkNI z%Vf-^UE9*B)b{=4V~2%H*tsdXm=j|3hmxn>bd{W&J7ulV_sp8(F;->M`ZXmh^!?}6 zIVa5L=Ty`xtncwV%NtYe*|#v;ks>kHW2R<{(IwyR9GPQ-7AWd4Q{Q9$}aiMq;L zF-j8!OGkA)T)OaNxaSRyyuDI}d?D_eqc3#Da&0Sy?ns;!+1{?1*4mQOPMsn6pu zs_v9?I~Ir^udRR7`-vs^*g}z8&PSv|&vK+p>mJGtY@O7jlGk$Ia>l&kb(y?$?ys`R zi4SJzwVpgY6m=_CeUbg`Buc#DRNb+&W0L3Qyo)RR@zLZ9U8=Tko?%GlkDEsZGVYBw zC_VMaL*}l)CvWFCJC99=ZHFSc-vv6Y%+1m5F*ctn(62IxXK6BS+o-xWraSk#@FwNQ zmvh9NPih~>^Y})^r;2jxJSU}$R)wbzd>6HCI<-D#E4S6nK`X(5n3b(6R^lv8W2Npk z-r9Zca|cB?f~spT_+IeTz8UKlf8mP%*0tS~C+h7(Y01v~Z^w>@h41$7FK2h0Go5Zz z8FXfwbc%UfP?5KG{rWY^mG>^V?T+y1j;H8GQgyS+*Ys}{H9X0y_$}y~{KZ_wMIZQ; z4CsrSGOxc%TQE04w||#;(3=y%A0!-jZLNFf?6GA37&&vxiI4fViYuqwuBPa2r|Leq zVr{)S>DDLV9&7EHB7MCweV^;D&b(Wm`eyu0AH$oW*GoIEpQ}CWUUT|&H*0;+(kAaa zA3V&trfuX4=gr<7_9!h|Z7TlZgv00wTO~@DsrO}yd0ci2 zb9EKFpg6nm_U-k0zWEDoEE2ietUStbl~(!DiI0M#QcrMEbazm7i~Ku6TUB+_pRuGV zepk~pi!QwQO!3Onia_beCkl=FktecGRdinoU(8>nRxGlmXnK>ZM^l18yr%d8?&-T9 z$l=~d;>CAFV)TxW4FiHAJJ|QOH$E5no?J6#T(4O|f&I9&l)^h_Gxg-nQ}3M`U4A1= zndf+BlFW=f*QMJg`E+z!q#k_HnRr?&8ia`ME+Ps@cNK~*@$85cKChxPSx;2$xzKx` z#>G>1J)T0_f6HxYPv7M|fkNk22Zkn?&_5Z5v$IFP-kMsco#R$zb(C+{`>Xg(o#>(u zV)S>CJ_%hjmVSI%U)MZIIl#2Py(3{TY|gISeZgv3oxU&Lb$@$&*L4%iQMy@0scEoU zw%WU_X|E#BnmBUox%8ox1%!z1ZXyauFBkT@%iI2KpTySG)L`ceb+tTc>Ny7^+}2#H zJ*TyF?pG1D+0PYb1S!>ae3cUzb--k)CYxnLd7sP-o+8`6)xz}@-91#@?nk-`8;^4f zOFfHoV=v6iIsN9vvD16sy!f(gX9xSVvb{ehTubxPSnsQ?ni-dtm-Xaa`m3@Xl{`|X z*FMS8ulm+P(T$<%K2%p(e$VfO%9wT6ONuUC>{8rj@U%f9qQXAuY9#Nimf4!~U6oip zP4drnvRJK6n{ULq&?WXhUu%3Dzxe%A3P}$ry0KKh5~6yQlKn6^U~tnZ#;^^G9U*LvJnG zri2#svPI9)TN$k_5`NM2@k!xkk(VZ{pcvR#)BU2HnN1m{T%$ z*r*ilyAm3oBX-$mZ5$94%}NJ zt%}(7)Htjz?d%X43yo_*-X3Q6Pr9LPBns~A*B+L9IUL`Wns&Hr`7GZf8%x=^W4j)C ze6H=*P%X3#NtdG!lkdu45|eZ6LDw|=c!V&3e4lFYhsa7Ul^fY)Ww`X}eTQtl6 zd$E1kXyswTrwX2WA5$xnBN|u(Hs_z~t6iL$m?+TpFm~(EHTEuvI*HLu!0MKn3O?=` zARD=ww=Z*niRuaWQpNR>)>R$}Wg{>= z8}j-Xo2}_MMiF{(Eo$m%btrZ39HAFs~5w!~kR%h1FX6m|7tSf&r<{^E|fWo2i& zBG!e6>;*_uLp0Fg_v^Rp64!qAg%t(;6V~M2D(-86Z;_387=NMi$4KE5Yj$*dLnM}4kGk!zVDpTxs z-A!^Wr4K9#Hg6IO-E(?;Yeix&z1Tc=D$|SmI?cnCkhU+^b>#KsB`J?_dn9)Su@zx- z)3Lh2`O`DI7WnMQE3Y-*G8j%{U*R{aWVK9NClry0+;w^2Y9mqqp2blk|4SLTH=7IB z?E7grIzLrCF;aE4r_DO$h|$f!>egv~-Ccex!*A5{bp*u;Ykrq1%O#7u`EfBB@8(V) z_%%SiH1lmK#BnsAt4G6!snl_K@aaBDHT7d361gXvucl(>-%PA7{X|ghcIB9i9nUug z3tJ)r*NEL0v!kYXN|Qzy@}R!&LuTs_atB4I8F0@Bj36? z`z+VVjx@vc`0V%}_d7_vyN&gyFuK`T-ImU6lPcb}G9>4njyk`3c*5d{il4m>EZgrT&7Zd%wNa*cOzm>HsYqRmbldZQO2b3A? zaf)j>9OU1~Boka=`_A{K_1TC>U!3x;t{aKh9Tw3&8U8%JhZlty_l`t0>V;QHV(YV~ zjDjllx`_!Y6w5Il2RUsy8(i<5?E5`!P&hsxH$0Jf!cExT>uv0=^3Xei&2{z$e}!48 z2`yrD(X|;La5A>aDRiCG}dBm8;ekc9iJL~n}Big6U!{jd6W(B>UB>v1q=GwwAJ}h*fAN$;0h}9Kr zT3)< zi=$BMHaAPWUu}S$C(#-xKHzAiVg<|usJz!!WA09E;W{tp7ct9_yw-^6y;5f?!0r@( zvnAwWCwuFX#x<@lrKgPA9tg{t6b*crx$N!Ua;9Vjgz$bqb0$9E#?u5x7}pIdO}I^& zBa~#Kw|ZGFhp?rwcYAnO9vo&MySkgo!8D@Zte0r>o3_Gfk-qqWN_LHg7h<0h*<{&j z(7B7(EyjyNj5}aPL3|-h@l^87=k!`^?`BB%`Zrmu2ZuaN{Bqp3R_Nsu0xGhIvD7c8 zBzenMd@oCxHc$0_KPkDPex==_M(`zCJH+djV0Fc-hK8HYKF~gu`>uR2B}$>KHRti% z3MnmvlblJ}@#*jf0xtGs0WUqZ)fk!RzU0^2${pV$b5o`4!J(reepO4@>qRM6_X^2O z=!v_DN9(e-SeAatns03qyD|MGZb`tSmG1Df9`Mp~=|-XKYEmYR**l?$aRvR3r>U(*hd+wcNtvx0c3v%g*&-?K@6B+P zp|lsHTaMLzOB*Oz!ejH5NNBgr2eKCv&lS=ZaD<=qi%k>^RHv8ZK2f(A9%Y%>AI^6F z>~UQq@%b4p`d(kwzFl@pg$Hm=*!%SgtSV{4T|r-G}5G#jUx-l~?eTk13N z(GI#8-R>%$uRkiOGiLFv=R0LhhPGXei_p*0Bi36z4(%TvUX16(*o%JK!UxHy-Hgd)UVpq64_6_ z?7Z9fRqF@y5(we_TZI>e829VL4FPSF2Ln$s=uGbawMsD<)^12|Lp^)0`*ix&*KZac zFFk#0y?yhn{N^Hm8J@Vc%`iO3@xwNd;LCQW);BgZm*aIGVs*djOr}+{mXKJ!kMb-F zA~?heYv%gp0VB6Ru9cRuRk_RtF;MK)QrPCse0q6a(orKRN}oq4?()hx7Pin-DMKNQ zZZ%ey^=DL4EPsig3Z<>V%wg}RDW}ht-*4wV)!pAMqIoksHdx7DJM$i0e^AxMnBm=) zFQbX$kwCu-VCE#gVi;ebo_N<_Zcq1gZzQ5eZTweQvNW!awclxY^fXl z_a=W9ag&!~ml*??k4O67laJ=B3ct3sL2*gkXZu9H8iVvh1B`AhR#$2IH{(8n{`R|; zhXq%+Db`=Vu@ohd3aiOAAMBhBuKpphqNY98*tAaFA0jrl?RakPe)P~Ktu#~0-=zC~ zR7|pAbnCFXyE+bazMndIldHlc{Sf*5C}9w{*IlZ3-OdHy_vM{WZ$1w!7GS9>HM45; zd+Z;-zy2+oRdLgg3e$jxjMBtrD%g4b5mvY5!p!<^!>8X55tZKHJh{)k|K-~~V`NX# z>Xv?*_BS1K&a7i{OtGhmo3jrIwN4wg2s|(UGWqq@bB5ic>QH#v+ty5n~jo2&Iw!H(;y00yk_apO;sf0Z=IexKzhHOedB@Q3X{Q^fIfqX z_swh^dz{eP0Dhb`V0Cw^ZItwAlPD7BU!kDWOmJt_jTe14{JT1KpdgVdtx)8Ag6`XO zGM}$++>;R_e4zifWMcuc@JB_ms=nPONYu7%>*M1g03G_{@x@4>~D$C=br zufwa$O0WCb%q7uoc209+bepldGB+E~X-~)TNRcNlzS*_El4PKun5-v7@!JIJdVbck zM5StBN0WJ)>tzLTk0Z=+0lx%mlOLKZ7@a7XAvvd87mU$;jMZ%#m%X4Z=Hh&|)v@Z= zujNdur_p@mrW_k>CDTk+9MXGt?RQDA_Ir7k*=H!kPTR6c=y4zwQO3mX>bpb1`JZgC z>z;pMb^Xmt+IifPlu}tGY$z*M=RfsZJH5fZ zMB}uBIn7-l@!04iTY<$3Ri~VxAM#Mp9 zL@T4@$)tNhpvac{(zTI2-zjrkjP)ofBZ`9V7AOhjRCI79Hw*0@W6piI(Q<6_ePM}a z{@_Zw5(wePLmOTcVw_qx`N^Xey;)MdE`z`G-luLgRi6*1mG*p5c5g|icfXw?x1o8{ zDx;6vnnCK(dqg4=L$W-1-^2I0y=XHY>Y4k6(S3r|Z8$aVJ3tVdann1kUAME5`q#xH z4gJF*+N+Nz5^Ii45WoL&H+edQgq51f?xJjzj&r$3y;P{HuI;{4i9ZqvQqXTgczfHi zx}PgtCKb12oke_?zZNR&&A&iXX3=3`EY%;L+f-?*6~8T}JCfa8(@YuH)_9oImR&-a zZL*r`Vi-BiTd_oW8tghu2Ua)d#MYW#?ut!a0N9iCQN74{wzV6=)CEm&Zdr*J*|YqMaSY7@^#ghb5+~nIaA`%Uw^o9*nn`zGFr`?CY1TeX@ z(9I5f9zV{onNHzO&Sq2pQsx|cSnR8yT<*Ss(ZW)k$>DDp-5#v2bJ*?^`LXOd4l=$> znS`~0WD_TZxh5^7bhmnPi4-2%EAO&vKHAoFAg*7yB0@onSnrXaz`dt;l+V9P`KcPV z@*bm$?y2wrcfy?{a=;~=ZsWk>%wrA9n6}U;Yh#wVFw)@T;qUcY0tHh^#4eH@vs~O5 z2vE5pzO|xwd-38I*NjVt9ITqRc45~a`tYI<<2pVJel>{kfPc*J^;@G<%JUbD?J)~o zT;7ZU%AZ;{qjf+23fn&Wyr|9B;76X|-e32I-%Q;$IF>G(`H|dkL6_4FH1OjW-CN=V zZuD2~gX?`sfej1Nwex3bDSwNpl2y}pv3d0g-JRyF%p&?Fn)0friMEB??4iM|p}y){ z)sDKf54morgd-51^%L} za~4Ye9wR~ztNEC3(VkNC;oalfuJ|lMPblxfib*4nSpDJp&a&knW;B`VCki&m)zm`y zcb9XZwIaN|gLqMhaYEG8tl46EmN{#61?pYJKE2uOuIB8}^q`*h-M9@FM< z{QT*i_u{*!ZlY_4hVWzdp2NXrH6J?2#}zTULs;Ff8LkA=P1(BWv!*2 zy?^kVU2;TFl{cn6k>@Lw((6ypsei7qWEW;?pAPR-6Xm1qety-@t1z1sJO2)2b?bE+ zm+H9dC%ZIlF4#%f0OMChZ zOg{KdtJbQ1=fFO1j$n1)si##FO%A?)#(9J7#*f=~pZZ%&yxfiz-cWvTXs zD;M5=3#jL?B1_YcS(!5a%QLu?<98Y2kd z`|UYi6k^WuFH*Lb@@Y@X)4!6_A4Ey_c0){Gk5*VkMc-zWoW61 z_)2|J#lG8d2IpK^_C^$v@_u-uP%o-R9)5A?-pKD|d9e&70$a4Ej<@#(R(D?i$ve243-rkp3-L;_GzTa5{e%{K8?Ooaketp3E z0x6Hum7jf*Nuo53GIyWe|D>vASvVAA-Emw|pGu|j@Ss_Ha(A1DHM7w}-*4#N6t9cc z+VKJBc<9}W->xIzWKW!*Xae*U>npi%!vhp(l^+X^R{#U*b&8LNFYGFE*9ql?A{KH!pX-ScrW zV%z)}=sYv!)Z!E`Ow86y-EW#Yb74P|Go7u8K{>DVGQ*1TYrPGtQlqgXahs^pQ<>ye z2D|~cw$`xs)f0G8h;cTBAHI96JeyvK@IB+NvP)i1vinGsX;#tRl`~r5=J^}eg`qrj zouTB0{FR@MP?yr2N$WoHSGmAseqrsq2=&k}pn>-T8XNe43v%PSD3ht%r)pI7jyct?b*tzSu&T{Zv{el z-M4sAh;eN`a}1{++tTsAU0%6oEwi|}R#k2AzO{YZYNqaN`FMzi#w@|5fdc2Sn`eBf z{O_-pegAAs@|RShl0~vYfAauZi^J=p-$?KQS9gf_{QlinQYx>vn_1|O)t`3sbu=#E z-!Kc_8^&d&QaZCWIm_vN$K9suY{>jxi)YlA^NlkHBKR0T=5ny4B}#!1UUw2N3NbEE zuT^`+n=W6w<%@;1kMm;>L)PbBYd03lTvhLN#;vs!-q6=F-&H_(Rd6)y34KA{HyTIB zfhsLYAM2UZ)chO97~LtX?qccLdbJa2hm5kF&N7)O6eQXnwiK3VSY2*<7*i6rcUD(& zMN6W%x0$H&{JNWV1kE-n+g9k=u9^9f#kwxpY@wGvz$T%6j^NaIH|Pykt9du5`HF0Fof zs#Xz6LRMS+j3T;wQ@L1O{|v5HNGFyBgz&mEcu|OPm3fQoHQCmo@2T9hDBlmCjD7#} z&MWyFKbZBClHP3PP0VP>X=Z;IUZ-2py4stVCHR6ON|(^XlwhbgO=)f|!U3Z@i`6}x zaH5jBs{5f4>5y)7W;~?_=@s?(Lw(!VCr?>9{tA{0d!v@y#=RMeJN<4g)Hx=1G<>wD z{k`uAzta1wf~Q_!?{_|6bua%GewCS1!n)^0W#K5hW4F$6KACOihbsxAc|Mc+_x1a% zuP|?D9S||)6v$Z6@)&KnBA?$we(~IuVRGwaw-)r<81e%SVswv<54gDlL|3ln9I1On zDDx`BJ~qG7wT*pvsir`rx0uDQVMb`FiIs`%5%DIgNm|zCw3&8n+K;z7N5||3ax=wK z7~d&_5Z=EZ@uCppY6pMO_FQtWXBzo#B(z8wC)t1do0g}c{{h>$BZ6+4{iMA8Z2m^B zyPgn#(b0J*x2+R=>VeU|4DrJ9tC#!ESfJnB@VfI@U0$b7S6u&~IlA=x}IB`KRIjrPXQ8&i=?RR($j`UbokB|M>U5PzT#60VXyuCAu#WDvVRNE=&I=;w35@XA(PavOm}MyO-jD^AsApZK&D!R9O1OCt zJrm>o`x!3^G45EJ_qTIrWIiz-&;63h`7Y(G)26z_P)A-(0(14ZkLp^VIQ;BCkWAR# zH|duwjMWVNF!BB6s>JG&)0ws8ONtik7+o~S;{)z+y9K@G8p+Kds_AP95`KI)%J1}E zG{5)oShj%&TfsFV)`@}%+W8bcfl=d%-%q<#T*gP|3-_N{u#5CzY?fVD10lSmOk))>OS2Y^WvQ>2&}4{NfjPUEi1RCxX5rr`SS1hGZzI z9#y#b`?dmuO=O!IiHINw;dPhsq7dWq^uJZUagtW6_w^aMU^c}3`KaM@W6y~)lZyQn zdurt8=vF_)?b6z8 zDRXi)-RLiqs*P)*`|o<$)q9b=6fZIvEN%e}ydS<|bv+1EOM@lAh#;V``N(D z!kgmD!GPtdVAtT8U)@*RkIWC~&nmr;&E7-GzJ0Z(`@!||OZyJW9jILJrv8r31-$MW zR`*atz*{<-U2>8Vq9RWW8*c_}lW+;h*w&ll2nMo7W!l!{CNkPmKNx@YnG;nU#L1r) zyzUuP_D1=!KuR$&Q6$z6>sZ}Lfmjw%t5V;e?9T1n+n$B;#|AiCpQ+3@?75S6)A06_ zhB-^#Ju}+5ABdBO2~*W2zc%LFl{(8te8cma*}~ay?C*seSluoDrK#55w5vlOI;A8eWfu^7s z{!C*W%U5({1X-40?RvWv`$!R$i2_*0z9N>w#i>j%#sK(A;1rb%WnejJ+t054hCpMZY9m0&Z-zJigv+{#bYB(1M?K z+~)Xp?-dJmPHolEwIV&Oa|V@JUzS#>k41~tw4RuH#HYA+PR(am^WvZ<2;u#J*68p7 zm-w^OG3dCBQJtAw^q#dLnTu>3fuE#H&fjNr8xWm;nzX;4oab=2>C5u#nM?`d6P=nN z#Qwd;0t}CQBhoncWMk*wExahixWqS+Tg`GM(MK4%7)cvH1+}(4knLDHoLWg9X|%4g z`0l9L)%4=bFQ#itV~7+c!vA8Nve^cze-r1NeZG{>;bjs5xK8 z>EOZY^hLc+bdbB)AZ7JfbjSG)m3?)Thg-}m5_@zt3O+N5Bp$z(`+y?a#qq_l(O&{) z{@+)ksXz#?`x`F`G0xt{uIoTW&;%$C5Il@lGuY6B%zp|QbFuH_T z-D6#j6_zE#_E(pmoaX!f;lWT!`1`w^4Yf}`&iB)NKb??x)8?(A;|p2)_;yo^io}?- z!3sgba=zUvGDS0Yl{$1Wy1THtMp6-)XT%GB4|K~94Bw2n;vKs;veJXXX*~JLSMt3@ zod*@1H*zjAzcQj)_r|4M3^VkXA*v8bJ1)bPFh^#vCd5`J_-MdK_`bu<|uiyNoe~*+XKu!9+lj@n*Nm^EC zC&XTB6xEq8)0bpY~Ur1x?o(EB=aNZPmdIQwu}?kHDnl(5uLqdL2EE6w8!%NE|( zGLI_V_TA0oHg!9<%RuWz?p~da*U>|i;}~61tgb?01>y7KHikp5Hh($$U*_UhuD@>c zj)ct+x7*r9hhvPTB!(b|vNffZk+k#kXhx89g)Bq4%cC3WCi0Y3UNor~T{5h$lisPm zq+>DR8)hVIeesTuDQ@JF9JhhvXpxzW-slaxeHs6QXW~EH$_|Q_1EA}bJ?LZQ4zjf1RCvARxC#-+TvASx1nV#PgA)*Oy3}6yF_bc|u zj2kmWneYf-_F(&o*5K?QM#nOG*BpWKl+{eW9v69(I=|9ebZ=_zEPIC{s=f&H* z7pwdGx7=;RghT8H+Xa_>2ne+kHpCBJ8*|U*yw$(AIpKbNaQyqEjndQ2&IvuzA0`ZW z@9o?B$ao@d7yrI|)l+h2*!vO+tgc$rAfZ8vzTy?CpsNRTz8w7h(>#30o1as?(4B~8 zpZZHq1`D<&6T@7`R>{3vo(`$)pCiYV63IVLi@sjUEtU1f*h`7kJ>pKI%^EmznL(@U z`K@skX`MI8&k6GLj2)CCUrZBUmHJl392-FRigiKk($eh?s+4(wVG81aGj+PYOz~q` z%e)v}Dy;6BdQ8k2U2%e2KVzO1UthRJ#Vt-k;HSmVQrfw7|$<}4n+-Fyr`&*>(g#Dh&BlEP` zAGU<5%FV84z2~Tu7SNI$oEUAd=%LSfd@DKMFh@M7fheQ?T17ZUcOO=lW7gW9fAYK5 z=&o*M^YX}A=%nsN*>Nu0poJol0vCIn z%bs5#UNw1%pBgKTXe_b`QBQq`Y$jWNE9$8egC{fHBv^S0D zfQEdB>umgt!IzUAB366f+uxtQsd_9Oqf3j`&CSo26LiXd84fljO}&Y_X5&a z2fL*EuZEs`8a#KRjiHn<$m6GJ&h3Vr8B413S8i%~-z(~zkCI&IkL<(f(qVP;-Y{hO zGzXE`1xK*Se~D)qmo%YLNS}T+-+uQJ>*#V>W698o7uD@=SREGw*9MKe2nPk{&6bwM z#7wuFp0^00HER5ML66lH6!VrpjiX)*>WdZs<{`1~jhOjgd;~1vXJcn(!&ztD=vOm7mX1>2_tmjSbfs1uqq`rg`_tR8mGF>i2w@!? zdoRPRqWC0F49W9rr13!`*K4@ttd8l9(l*6hh`e8?!FHIKl~ajs-&YNP6Oww>n$}iZ z0`zQ!@3#Y3-C=Q?1AS&nR$*;#4T%Z$|(@qhL$N%%%8)q{lopKaP&qMq|p^E3M& zPx*!IP4lQ)KXJ<@CNlVlQ|pcKU*6*movNlwMITSPu^toYY|ObxmV?nn-;u-z-0>FM zT^&pIN0K=tNykjo$Ow-th0`w7(%nqZpc{?6-(2^h#UUn0p@dz#;k(NRfmI3Rb9HR8 z9lM6!-1|b?D2V;NkQJ+&e*58@*JVQW3@@LYtgqR9>ZDe@XkL+9m5@QpX3F6Fs_dcL zH`ik*QmA;orJrN$5)vRt_-yZ4GwJgBrS;`KLg=?VynorSx~tP{1pS${uiTxz*OT_O zt{8J^jryG1^NpD=wt(Nfhxj#d-<`N>N{uDlcFsjL4p!ak4R-Rb3@5kus9&Jwl)%pG z>{#9SU^$Ld8k^^dFB#;yXQIik6jH|NPh`b3+jxF`uk`4U{VyJ0?rVEaCFw@~W~@FW zT8w*!v(fRb@FnUP=Bs{Nhq0FftGjomg6u%*jq0bpjL|*B$^0M*Bu{GTvxk!mPnzX9=wY}D&=wfxxYMori=?*F}l21T~9H>Y3`RtR!W|nIG`m$^OQ1!xPb~R&sD3)*L=vLo z7q%PThnsbJnG2(P7^{22XwB!TT9f+&XQr}@e#)a3(_OplK1ig$$i;U8|B#Pjnz5oTyDZtWg1+>65A7h-clW}&pxL= zR*rKiR0%~rzxlo3Wq$8&j4uAWxsXMG8)AJOK^IWvn|d(g^wxeGR*^wfvh|ALr)t{C zwdLJWgkFzkZRw9xH1Ho+i=;WKefxG%6iM`Mhpia8%iPV=K_#Vv`BeFhcOuDa&I_BJPG|8Rj z7mhdY%3^edu)3xmRWj|a>_J_G8hjS?to5bl83P%UcKJQB=`n%trLM8xn4Xlp?)z*) zo3vy;wRDgxBYj9TUqrF3c{9F!RkhQHEY?Ry`LbZN=8GQ>B3NBQ0q!5KR47}y7@E(PIn7Gt`=yOdt8}`4Y}DL3do`ghOgP}X zVo(qz^OFx=6xPXKTQbJ{ogP2Con+o3Zq$&1o!8NKlkow!e=pgrgJEgWQ{IoaBMC2! zD;pg2r#;WA!zOx$nw6irC&4b4$ETNckg6@VG(f_FpxL~RP&4%2xuLjsZ>@M~yD;{O zVRZ>Pe7?N@oOw+0?j4foV&iwgnpP6UnZ_ko#G{T_FNxg=9I9U_kP+X@PBwjmb|d2v z!IK$fl3%whN}rMs_&J}(p2y-?UD?{RmbT14s+8_s{jn#hxNhR4QDV?fR!Ix*i&0Bf zAGfc*W6T#MV>CTQls~b~;qm*hal0j_tno>S=QC2LK9|s7?3KXkvQmF_&AUrJNoi`h zLa4Vg7kq2~`y=Zgwm+qUUS;w5$b&Qj?Y{Fm@^C-u0Kd)bzLgMlUYx-Gm2$j$(oG{wG7>T%gDXYb{|echo$PW!L9s-rITj_6X`~L zxW3&|-(vRkr{BAF?y^(x$n94}nwCZwdu6b?m&C-A^%G9BM|BK!1jI9W&;js6=vRK`m+H7;1 z=uBs2qFAvNu@^k64#JLU3o#)9w|;qsT`%DH$tW^;dua5RRkG@hK>|i&!IZ1t_I|w< zcaTkTx?Qxh3S;jvtZu^eHVeMv(f>@Ui7Ta&u@A zndO!|HEeOtPT;;SA*<(vxGt$lykt)OqsN&TT{*1oWkmr7LH6edPW=oY(@dYB82H_F zZKVJ4fmG)UgT#(|&$_hlnih)iiVS%anC!i9Cypn4?9jmDcZr{Sd)W(~8Kb|^z|TAK zSl!i`BKvd}!lV-ft2mAk+ldBwcFw$7({lp@jWlc~Hj&dJ`iH)9_V4XXV$q2z`cXY| ze7U}#bTU3k?cnDZ-#F3V^x<_Cu)4b&+%FH|-i#e7skeVe@0KCm8CLfbdO_o;~UOua7O8zSF}xt zHJqm8^C?ky^^3fvu`NQwwU2eqWH{Sudw)ig?a2%JxgTb;kDP5L4c*e=pN;3+o}MkZ zt%=c9#OlfxJWWi;otWIeV*jFN+-=Rvc5pP=N9l-@?Jmzt4~kT|bv3%SdrQx5o_f0} za@gSX^8nkXAx-6=IhWf^{Z8Rt7~KuNr}-_!RnG+J9)nNFTD#>;aVK=l?)Re?j{jW z%$~Yrt8h4z`+OGenI(Rfm}@6#S=~*NR{HeRy%tuRvn&UqY;&~8w(NMY&le}Ly0uSJ zZhpS|R)V`&cts@sa+OgMUBPCIdRO#_ zkC~QEjIv+wh{dkkt73Jds0VrSsSK2rKMxNc>z#3#A1vfpz1GrEb7B6Hty1U_hT~3S z-t>Jd$9PW89Q^pH^`+bPsq|MN15RV{ZoW@DvFm+mSY2F|l&-nHnfFp^^TBugb+!+< zzL)Z~29z=}FeGS3*Ipb8c}Vp0@XrVI)d^EXU1DdgJ@4*wyKt>oQ=)Z`ME83ajDOX! zx+<5og>&pP?{u>6pIj%jR^ev0BB3t`YOb;i_bPk$uGIFLp^+}rW^vwY?Ruxr0^G~& zIh+(Kk2rU8J8C}UVdKW=YG8HaE<3+I>S#0OQ2NG+Qg*>|!?%ppj=5#!2N|Eh=|`6? zm0R@ldgxf|SQ%Ms&z2R4jQvV0ED)x+_0#6{YbiB{y%=3htnSiM76bFSt}EZ)PM$4k zd7>8T*3MW)BGPD2bSF)MG}DuHzPiNx<@G+1a%SD}=`bdr>N}>|sdb6Rds%)3s4=6z zZN!gXEv)X|Jx)V;W;|2k1V-E}1OrmkxQT+P4g%l4grelfMoy)&14ds=OU`6=w|^j) zqgTf%*t%rJNl6^cUmLEDDw9^g=xSqif1UVUAuXzZKD^_8uivgVN;_$Kr^gAm>mKo4 zJCG^ao^hUNA9vDm?&TG({Z2|8ZGvyQV|Ed)`T0EKJ;-A#mxi6sbg;U_i@c}3cmrna z#=|A#jaGtl#i}+>%d6l<*iNYoKF%_%s;>$+*0@|md7*Id+Dq|*)wx65M{ZR6JH zuXYW7z}Tyc)nz)={=(UX#rC@3LAk(!z4BmyV-&q<`eGfL|iuR}5mX2xX7tY&} z#^e$|(QS_EY1pq%kw9K8B_kQyxb(z5@K#&P|`jXNaswJ`l2 zCZ~K_nCl+UDbf`c#VI^T)0Gv`T1M}$a^ z9hTH|)C$7rp2q6t1j^BpvC@SoF?;A8W;jx%&UhfYX&L9;{E_Fzxa`oxX+JVo!I@X= z6-klp#((WT{J@-g$vlrnih*RV_gC)=V~p+@tnR42;Q8miNfad2boaw#c;AgCD(Gvf zXWKC7K5xsP!8MSaIDRMS?qX2;6Qd92haIl91--d()l93pG&@+}Tg=p77+rm=?g#_* z3Wq<%WAElTe`iK*78jf&>CAaiTP5x*LPke8PF>78NMiQdq>#QO^2dw4xX4c4RA+W6 z6*cnCnXF9PaqM$|0ao|hz-TWOMeB)Uys805ZHw>m234_|@o(i>%NQie7~Q7SpmNCM zk2aso_jKv0wEQiTKK3S4CXpdj(~DA>iF`#8?A-}F9@z1~jtB4_K!4kb0zUp{>)-z$ zmE-yMrT;y1c7a*ew(eeT5NGcrARr?k2>$PB>5f%99@z1~{}&!WbA*$WcY-3>jXMZ^F0 z{5LyZ^cboyO+Y~Z-@vYad}Z%#3pTxhA0_|)cwdKn@C_EaU~Mkg*2PiS$(w)x<$XC$ zK)`^>gRGsf*&4r}KS{u_D#jkN|#0s=Z1V^1N5e~T6Te`6-nOXK`!%=TLm5YYTz>iyr? z@;{~S-#&#u!bbP{cOjWuYJh0<|9S`hyV8;VH z9@z1~jt6!;u;YOp5A1kg#{)Ya*zv%Q2X;KLWuYJh0<|9S`hyV8;VH9@z1~jt6!;u;YOp5A1kg#{)Ya*zv%Q2X;KL z0$z3GEC4eX|0U5d$fI^3eAtP#*d=R_32P^sNY# zM*?L3$wS|HKzXFV9mqr3=o<|v58ekya2i1Eq3 zsQ?P-9sDQ{UPVlh1)$?b@6Shh@IDm+{5Nn>&!Ie80RLWj^xk@u2k&zs_|v0*m!Uj( zCm(?+B#_V0`{Gd^yaSG43P3(X`=dNYAP^-W7(t8{DyfATo~l%wOe`IE;9=_*L0j-1P4eoblIOg$3JI>w1nx3FKSU=g6PPf2a>ppK$<@ zU|1Az1Gov?0%CzUARb5n5&?AXCj;nwPX%rRX+S!V0ibgpo#Qz`E|3S@1+GCGAwVb) z1_VOhW#9>KW76=9c09`;2I0YC2vcNGw4mb)(0q{CY0#QH&K>Z^C2m(R?>L=8H z4baA4KpW5wbOK#KH_!w00%#5y1cm`Lcc8iAH826Z2W9~DUB*Dry9^YW^9fi0R)AF?74p-79N-XW@B;$CZYU!K&>VukMU1}3hQ6JKzL$mO zN;D6mc@NEVS^%2I(0qjE8Z^hCp@`0ZbZ)-^?MdJsa2FT_ZUB)$1P}!6T>-*?KG^OD z27sr)ATR_B1J!^J;0(9`u7Dc=udO7I2P6Pt;0SOS$bq(V0b+DK00}?}kO6yuNni>X z2VMaCVP77=9|#0416P2nKrnC}2m^iqKY?vv7We=JL3>w#V$dl8N`W$<9H;=Q00!94 z3St{T70?2-0UZF%g+{J(2=D=J)2=);MjsPkE9h6BxoC$F@5CKF2 zQ2?4#&>Vv13^Yf$10H}U;01UCK7cQ95kT`HnmP)g9cIvE0m6X@;3edZ0MCFLfCBP% z0p+lN1yBhT0{4L;pcse&ZUKn^J?zT>Tt)REt_A9Vhkz&G1$YDJfo<4l1L~{+45NQej4I4fE}<7 zWC7^fGzD=U;00U&4nSTwfUaNY+JwrA0Tj!_wjJbK0cab6t|JctS}3Cd%z?l2p{xWb z1^)JYJ!9sY^`vw0q>6QI2e;D6}cL30xhz~>YF zN#oBOA=nlK1b~A8nzOh7G&i#XXs$-{Hk!ZDT#n{+YJdtL1@;2u011HZABcfJw|jp_ zWU!6)L)Q)pfD%Ca&;uxs4nWrqblso<(6s_xBRB#4wE@N4m^{=bKX4d8*V#h=AAs6H z$Az~C+3XD%1KNNgpa~cNiU69sk&&p*aX=nG^E;aBWdOWi&^+^>`Q|_Kix||!`b8YJ z@%}*94=Dg$Pb2}n?WhjA)*zeET!(B&cB=r&fD&*5Py>-WH>;R;P?63sR0cLt_ z(#S?+-%;3>1kgSau&oG$0v7?a|22q%fvZ3ea0&1S{D3RKWgq|u1W*}DhXBa$_-)iy zIDpy<1Fi$eAEkgOw2R95Ax7n>@Ax3S2{G~=H>5cLRBsm82kBc7D+0()4ZH%z zftSD-@B$bGo&m`I5x^d30=j^9;0aI*Gyv5AI<5+U9ViDL0A;{K0G(S^0A8aJ()GY2 zpbkJfs6MJ&^CykAkv57^J^VgsyA^m0Gy^TbUqIWR80BMaLTz;d9RO+z*@BJ<=^%!I zA)puN29V7?z##Ax7y$Z!V4xpB`{CPv4r!$IUlk*5Z2%q9DuDVJ`FI6DV+D=BSwIo6 z1ZDsU#rhkVZZ<0MI#l2M7buIflxO0aT9sgZ5DbxS$TcZYFHw%aL7&q3jUA3mgRS=Xnm4 z-2oJVcmV06=LBS{DS$LkeblxhfXdOFJPENd?1#pO0L1uXNA*epLC8aM3`*nAC$zs1 zfW|-myb^)!BY*Pod8i!Ok9>i~8q$=2eZ&FOFQ}jJcA;w?+Aji71kksiWdLa)8@AE& z8`7EtP#xs2bO70_4B+d_!G1^swPymLaffHh4 zp`Ied$fv51J_)D*$^g2ioPZdu{k?}YS{GCVl>VRru^ONbpl48h038eVIM8@O$AXRn zT^rDGpz{Iw0*&c2fG%(v&;igfDFTTAvNsh#Hlt@-WH-_~4WRS<6y%}0NJkGi33+({ zJAm>eAx8a*`s??fJXF5v0EG}Zs{V=h$eD>9HTRWLne45-}NJDPa);PN=~EYW!1dYOEqzh5ssX^0sqFdL`H9YU5v= zmqaCEASXibZ*3zb6crH`m4t@=t!+@}sIZu@*gy9r6wnTJc35KXwGoP4$Tn#Z`*&*p zI#O#JYa4Vxt3RSm2Au6VppKZZi11Okd-V49_POL@PyR(BZunG7&EIMwNDYl8GH557 z>2{mpINJb}NI)GZLA?g{1qXON>`@xe?}QRCTS8d;@AZnkP||2VkUgAvhx%W2&{G~# zi%nCzu*zI~|0#j~xeFy6P?9pGbb3(zzN}m3yG+w>Nz?_%xve1{-Pzt;0|uHFI3Kzjt6Al%PI^62?Czi+Asd zWa<363nhO%$_pi^=l1RINM#z5egP$-sFEmwA37KaBsh&Lk8a8JL5Z}mC{+7h3^zxHS~(P%ex3uAcq=q&??D) ze54-UF32>3XZK8P*O(U7k>9{JadCqG(1O3MzD)d2JHN&>cbznN8VPmaFp+JMP=d~d z?4!1NmF?$!{#KJj#`Qx9^3KZg!N2mvkD_x9O%&jRS5Sh^`n<~DdwvGI(E7X1-@Wbc z>SB8VM)1W~kFRjm<{kdK&fo3WyZJc!INE!YU)Xe%C?3j#5(zj>!2()n9*qP0trA&Q znXBu&2>*6H9HE`PjqiDgZ-o*_OdaTja~n>Ozk}~bw~h{O|+L&Bk)v$Jn^2j*gC zmfc0fjqw&Fkr+WyQN#m9B9RCxh(RNwC`3UN#aknniW)oszkgNtd#`8a^?TzczwgWM zGtqtTRabR&cU5(Db#>1?;7Drq;Xp6(!BlN5G$ovVb*Wjr$XIg|T1o~9Eqx2kBrO?Q z-T9vGo0lDu{Z;~>5D@Bv!Ul71pYU?<8}2vsb#WjXj+#bUX<*$8_kVTp?~7v%8x$3E z=N^3&#(>7BdCknWr!9PcLBj?!$-1B(y^QK@@6XrME*=(X3B-f?I?`bCpobTIK9kxb zW~Qelw|!GjIxu5-n}-F2^yE!INJ|DaUw7179XgRsEJj1o z)Q=?29||v@ea4Euy&5*?EXQ;&ASBn{EndBUdhvNfoqG05$n+WgO78n%^kEJpdv0{< z(OVaNk6OPi`qutAWlt^q_$yE=!Q2S_>55?k6LoJE*6qH2#3vsEBJC(G_0O=yEn9JNKt&7XtNEQ~tt(zN*J?6&#;Enoi<=)fR&;6=VnEF6S)qm}*iI!?+ zP4xBupSe*exBJ`(SiR;(mw8Uk&Uzc7pJm#@xRDi`()W)yOnv>G7a=>{#Vli{s?y;| zDp1q;{kAjKJ`XF#QiYK-Q;B3a8VszPyJ~6h+{51kM9$8qOKKnQeyYvd_6Ii~-e4w8 zn;28Q&iy)`oyw<<9kYD{d^v>on zOEz8n%{`y+%v40)?W2H@C2t(>^Y@*@?|2#zNJtNWis5z>wYzGrC?9j>j3Gp=7kf$P z0P;&f<~`7P&;C!#cgcFd+gLzo&2;7QeTx73WaM=~r1a|hItd)&;P&p9yuZHWSj?Ie zipcnu1oWe@3OHzN-ICAiQYG&du5)IYP)m-f*B!j8=T&EoDEyTJ$>rLbnJU3D#Ha4$ zyBfaV?f54?0|$_tp5UN9vZJ5P^nFm+TC`_P-|4G*3@vEnaP4YGd9?Msy$Wg=*1APo z)_3}P`9H`f#|n&;LC?X5z@a{<8?(BuaLJ21fFu2b`pnz?P88GzuK4Nw9pl~~32KmD zc!XW`Tn_~f6s7K!Depb_@g0ebD#owU2LT+PxAuq*#DF1qfM}!^af=X5*1dUI2tR0OS}bHrcAq zg%=(8Zfx^?5(m1y4UndQJUg}H_T5(vBwN+9ptvi#)Mb3IawgmB(o(XPsK=$>$oO}M z9fe|NSw5_OG?q_}kBj9iD(FQxxt5QYW*Fs(oT0e)CK^DH0$pBj-R${b+~2o1|9JQqE@Hp;0Bavh7zIMA3RjGxzT)w znw~e8@sXo2AJj-sPl~pf^W%W=tsH7*O*oA%4>Vcw{(Bd1UQVlO$UDiXzNPm|YAZW5 z?>+P3wWAzrdKO}i}o$d*@5Sksa? z5Sn!e5bEoX-yQy9cu%_t4B_}elMZ6E4@MgNInm*~w*i6vl6|W!Dv43Qowu*SzE9Sq z*8)P80(#n3;`FW9R5s)K$)^!D(ygMvHb7_;c9&f~^4&gb&jUmlvA{=wkbm%Kyy%I@ z-q78ENGR8o4ujFCKHoxNqk=IQsVJz33M~ zjV$bWTi4D1_}SLWK#e33dRh^Qmy#rwkDk4^&1FN*7hIE!>b-zXvZap>-ZN%+tCyd0 zc-syLoXEOH+Zwl8(&1Aj>Y?xJFM&gvb>5%KS3Y`v08vA06n+APtYx3h*G+n9Xq%gz zdXDZW`g+qzL$0~?4Ae*tj%wPY zOW{$!qe#8)e45>Fj)$+;5;Gc3r_E&TL(eVTI(k&E%eg&>x)*s!d`hL#P-g)ixJ zj>DT?;_HAz9@ns=M^Afaar+w`oLc}n9+0uio?i9p)7vO6CR?gsFX(k)A*hj-ggYIY z)3kEZKOAa$U3gUDY-;ySD6pt8jke@qB_K4*+%i5IKD^II{TxWbh=kE~fp5nTn{_a? zp)(-TCa#n1`BT%nbGwdz3^s&>oI6;P8a2^Wu8&ZqiVfL?m_Gn1a{ zA0%&QmoG`p?KojFcq6L}&8m;|>igixvxJ_`9n|x&9VJ`(a*P-~1aUHOL@?+sX3{d-W89{BS@VAtd;u4{aDk9&aA z6A2K|)4_ls$W*s~@SHD-K0Z}MBN$Q!2$s)vQ}+M0Tfcn+XeVFd{0EKQ` zTtr>~Etz1i=Kw-8)7Fw-$FCW9V;vx}rS*}jdqJ%|sQqzZ$2AvipWg)3qz3D?(X2_B zA*?CiI;;C(t#)2VSq72=y+8UK>Y*MzHTwO;>&_j>D=?uydarYXZ0UX9zp?7>?N5|D z_2{KaKicnrS`%>4qUqyLPoEPL9v4Q{YrT*%qtnbJ{N;;38FlQfr+owtdScqdD4Yd6 zYR{L?Uzu3&<|`EMm3a=eIJFo~r33qJ|MS*1Gfts6l9U~NkJhJm^xmz$o)qS-)%>Z`B@Q4>@Goh}-eIF}`De2TNj!q&gj0xr5nQMn zbNTN^t!%Jjmjf9F2)es&>5X@8Uprzd`N|UKw}3!=>I#PUeCdT>4|&OfJPrsJRCPN$ zUHaU@+OKbMAa4Q!_rGqF`OU&xcYb}qfgAz^PD)+d*XNb?dFYP{Z)c*lMD4xq-+cLf zv(vtCaE1bM8X&80nt#%aEl(+ZkZs?Z64&evJ^~zCHwMbrJiq7n+#cG?K|@?uIf##T z54hSyKzan$f*SQ(w;8kN?VGWD2lK{|4*(&Xc-i#(SAW}L$72=*%|z^lr1!!PBj1Oz9|y>>fHe8_1>2kS-BaQ~+5$paKVay{p_j~_OS7}Y=`0~_zKia8cu)t* zjgSym+spOz0?zTEw(FmF+%ckX-C*EIPc=6`1X|A?afKP9ER4XUHbZ+Z7%stXWww zptuvQz!3ML0dl8?ge?z` zNv~cT^%mBBOuZzrsQZikgl_-+mnR&$>+>e91#e_~-vR_1J$1VtF&E$ck9+>=K=uPd zzGZygYfWa}F!**ru%@L@ql;GqDIht}TO=2Mha%gMx983g^>n>8H2t}|79vXU1ip}+ z-iW`=iMQUt;7i3r8iNCpogO_(K9D7zZ2iJJn>HQdxC^L3s`dhcE$+HuU)=lP8dU*y}k9+P{0Ct~;%Ek=x`Q0Z6hG0r-e-#m7e^Ezw87A_K2u$laMu+hSxPb^g8t@*+lp{`tdnsps?ie zanb(ECs&W=dMIS)k-HL%)kcHqP~~@3-(NFw*R3mLJ;3P-YQ)>Jb@yHTn~v?b0b<2e z;R+HYH(RSdeXWm0>qns)DQ2{){&866x7(*0(Oxyh9FQ1Lo}x{?bZX`AuWohi-Wzrt zPF%C^vIOlR>pZ2?4ZV-;vS%bv9u>66iN5+T!g7&6lUi49e#TsMAk>l^|JBxChdE_9y?a^<< zK}Iec%Z@&x>1yM7H8u1S;Zr=AXtDiY$6eV#_5tdd3<#>K+w|%9N4}f-6#2>|RcPr9 zKw1HE*ylYjxj*nZ?Fi6*Fyw76AT*=jwd}iZZlAQB_NrwxLQhQ-=L5C(K#f{@a>EZN z4Bxvq0cs?@fOHrlR#TTfyZ49%JNAfpZxP9L4Is2O8$JAuOUCbe=>y=<0HHnC0YdTX zmuAm6u2sV=HMH}924NKX4;7Ml#Amnlh|PP9b|NJX5)E;+Q)Rlv;%&cNNC-Fx z$12TaIGt*C$Ie!*-+QCN$((oPnypwo7BWc=*8h3H{CPFOqnH}G(!1kru_)1A` zsOnWOmA~*BxTf49v`6Em0phavPPs*BRCzd7W>h5t$9)<;uFZcIvVEpG6PJXZi+xNn4zol(PI9ujQ& z#EVWnOC{vO87JIZI^lx{0U;X?YSP^rY+i7&@{aJ*Tl7mlj}VP{Z5KLQm@}H(Z^J0Ll2GxZ@GCj z`u6B|)b#Dq&!_s9>ZSLk%Y{^(-}vo=4_&mCB4%=Y^jzylLBFS0pZ4f=I~1q61~-DN z?$z(K#T)Mj*H|BuRF#=!aFKAXe@o)?0mpqtXL;nTdHGnObL;Nhy7{_QOP7%B2uTbB zLNoffPY&*yKI<5Ywo0k0Pdr|q&7hYm{rI@pUKwH1%Ue>m=k#k|T>NbN*C?th{T;n^ z(PuL2M@~OJdM(knRNtP-NKL!i?o`ey^kKaM*_T& zRnFLr#XQ&3-G5_<9_N7xq7T~rVPGt@aBj7e5w#i+;^3HD&;L!cYqnwS+*z1`KrU|< z#NC4=OX11^_nRJ~w{Lnm(68S05|WrwVU&fFfsF?@j(z@u?`UV0@@l|!yGg>cyLWQW z6)%22{U<=Az1I7du0AZcv_876&zRQtL47i&6Ulfqkxm6xolx}gpd+Kf3SLv&OF)v_bX(*7YNT!V|i0*Ysbd$9;W0AY}cq+|_6LHAMC(`C_m9;qb<9 z_Ie+2Sj+nBM_X@q^gXJdx9gKdrO%YD&-gS$9~_T9*na)%4PIKexWCf}`jOMiwLbqq zA4AFZEgcR{1#c&Ux9e{>GQ9Gd59c@#eGct^b`I8i`1&kFeSAkh&*|-fK9@~@MnK=! zdOyUhF+)(Hz?GL>)^5@_bAO4xmg`gfysh_8T4K|TVrj!>MxJ@+@xMF@YBXa&Pfr1a zRxF*q+VMrI)t65KB0ZE}0YYB%;y>NJ`-t|F&ZW^7tLhR!$V=Ng{%J$q=&rG02GN80Oz z8-#IgLOg~nQvVk3%{%+qMr@J5HLQPiWjIuc@p&bB%l<_}_gx@4KzqU|j2$2koi+OH z5y$U*)8TD=x#-cOJ|ErgoQ1P~a5&fl2>Ck)N&`O(_^H(&0inETv{Y{`|Fbqxzi!l9 zOT90q&)U=5L`|FzeW0JsTq8_8J}xmxDc6V4*CacCz2eHxPhNivt+%BdG^-H#Z=uA@ zVZj>~P`-Mc?)a7}TFamO?)Y`Z0|Lr{G?X zaB}X!s-4|7?SemQjgL$IwLFXM5^0o~ajrQS9Ea6&pvg2xA7uOf;0=54U2(YF)$e79 zCUOdicjbV+PEC6daZbqlw7#_O)lz?+K;RXeUxVWcv0!9GIvI{t^lM+_T)9=^T)747 zg?qaoIy5uXZd`WY>YC5Guf;prs4Jpd&wIb3_~`z4r&++d^xK<~;0nAG{g2XDhntpNy!~3dlU^>KGWO>3 z3(x&!d%8pz|9nE1FykNG@rygcirlUUW4O4B3rBO~@+oP?%FLvZjvFa%Egy?CW7ERP zcr1$0gu!>0RHoC3)Y*lFNwWgkkjdJDSRy((RS-{B6l&-c8ajx9Q~6M^bj5U_rqi`X zc|3`IFW)L0ir7=8>%)kIH{m<}3M$w;cq4B?82 zNC6ixYeHrs9ggE#g=EyAGPqzZVwf@9-2^c*Qn7G(xtS!64J;OFYK3a?VbAJWsRfLYHMU6_n7&8 zYL`?j$#tk$U%-o`5+<3#Ii3mfnrD{*Mf=&n zEnNjLfS@Z z7t}oE6=LC!kGtxChW~9Wx*Svphf-~;OhE-fa~|XCMDae z0u}q&G0vfQv@{$u%gBv2gHgWSkX)IRM+==opy|Bukag|uH@@QjL<_U5lq|Eq;mYC@ z=viM_#7n61GBXmawOi!Tj?97}nfZY!`YE(^xg@ZyM;IOHsC(5NkJ^qe)vUZagX4v7 zyU@(H#SW(;GDve^{P-_|#+4fb<6lydn+Y>ro=)7U!B|b=|@b1Bv z%{$n#pIO;iIndq7AUSAAgQ-fw&P9U>4{A;!kaJ#mrsjF2piuC}voSa`Q*sSuS`ho) zhi$&dkeTKu7I42wP+pA4SbRkyi@BddIeoy0R)=5$p|PlsG7_HO6lQ4@>a-rgt$&Ru z9FGbltdU7v*=~9aS~iBiqmv>1s4L^0*M7o@2*r~zgK}X#Y8SXv$R826yk+HQOX!f&WYAWbbw(_coQJzX*dB#b|9vs+ZK+b;V0rL||r6S-e zZxCrL*!z7qeq`9rBJ!@<_IEu)nLMu`!i6b3M2x1P;@H}(r%x*4nMz+w_Axfx>h!? zMNh`Q4lpy`mG1Otgmr@~u&qY}SIGKLugb&-T;+}C0$(5289g97FL{ZrxY`zY;(>dL zO*ek=cX$`oL1>t~5Sui6B>>}A4mqwUU?Zf3^Gl>&V>G%{}<>4VFb{W)SKj-DC z_xG)z7}s-0O~D?DuY$Queju#QlnA29rGY(DVtE(E{;x;Fvx|bJL}Gzu5h1U^C^OTz zIm&~QQVK+rH||D1uSPgoN&pNrls9D_p=C2o``+OnDghGgA7qEwuzEMcQS#UMR9Qq^ zPuzaSjP{%i)Pt3uMSgN1b~pu(z*Ao#M-(SQL(OP>a#&1|n5GcRh;W;* zID@N}h=*|u8R;zvgAATWD39;x3PMw1_18ct1-kLU&e%}&0C97z0^ zTh3!jCw=_{!!84K`#CQ^C_{yTo$;<%gbK9DmfS!2aOrjXfy%o8)o^D3Lj zGSf_83#3AHRw$fAo)lN0P7wAEi13?fEy!i$Ial#q6~o2?n=fR#VPa$}K~FFpQOddU znkrpNqirr@~@Ch)2_N3!@FWAJGxWD&m<`WL+V=5s!M% zRZ4-N@`kbTH^lM`1~BE5W4>zRa7+v+e3h5&Q%Zq|@`i@UBux+ImCgjV@}`U^TNjy3 z;6W;LB?xMnA1Hm%SHRS&KtX-YD?p>liQOI{HcEro4-v~o{1`4JHX9K$R+08noQ!hR zI2Dhbc=j?W*Gc$Z9zEq00wL!G^5VZiXx$(WOzV*b+TVDnjRvy%3ihQD;e|;#6wHHr zy9}t<&tyLQci)tmOt|_)f~^QU{>l)+a7W;m8`DbcO$85@TuOto%h$ZRSa2yV7}H@} zrf}!M3QJ(J3ajfVIc4grLO@g@6A8qNV~IjoV@KmsP;6O860N&w8Qdd=ya>j8G zHJId733;HwGrvHTpS+JgzHGM3X4a~J{}`)mjS;0oL7#dylD`4@+q&e%4#F9 zv%Wys{gak*`woP1KPqGI(FOL1STtyK6jXk-d{{4UGP5A4Wqu%%{tmj3B_KjLpm8p zWRTKcUGZfg2uC4;u5k8g#Z>4{AQG<#V})vR{MwR+W{|dJnQee<=1T^|ya8n!rd=8xU=Px14Y)l+jbNbm2&l z4&4}OTuEi7t^Sn-ZlP=rs^lCG6T=aA5KhdU_aT^{v8JLrmP;K(P|sVPYbB4k3KK^|Q!eKxQypD34;4^biXDzX`+VW-24NpFdk+=!6|N%5fc zg9jt|wL}>zOli{)ov)YVA2u=|bo&%K6P$QA4O90*n zqRY=cB#19ZM}7PkHi3d`K2o5oj`~)u9?LF)z#JN=_ZZncoFvf3eFT?c%*T^j(0WH-%*ogm|T!=CjtBz2R*7$Jx6r zO~$J+F(F9q8RfB8u;9afM*Q7BhL^jVB`41>;;*uWD%Dr4hAnH)j%L>`UAh!?FXytN5gf56tZ;Cc7rY~^=TVPS8nm4k;i>xAu8bA}J>#9dJlweJZT{Rk4wT$JvpwzE zg%grJ8l(;jD5Q>yjs}vl)4`k?6xhGfi0l|(PBqyDs4n=J^-@I< zi_ED)e6D{lWye8tD#$LtRryVeA`EQ1uOMnaEAec0y$osItWzEwu8|TzF$bBgj(aJp zalt>b<&k}6AX15(Y7c{)Qx+`beB*rrUbKayRZ09G+v$}QXoYp9i_<*lE2ThLdBai% z_rLnsTBSN*D{r(H>3i5o{#pqzcbN5IKKO z#QH%QU|Ns7rspwheCReXA(eWLFPimWYzK8V$GE*&{1RzxX&zdWSsihfQ9o@g>9@)hCIS?l&>u4)yW3otR6tIquddQ?}`Rs};I?zYj>+?2qs#Cc&de&Ukdb)b;_iN(%OY~>aAK$lNE0Wy~ORU@91*+#&n zO?f6EE2ThBd1D9Dj}xUjU@LFVn0oXjHv0KTn5bg;=(NNe4_8praU3fFG@qCe|9lhU z;0jV0CI9oBc8WT%>}RyhKXcGEu;L_f5f>SGUk->S3;Z^Pk086!NAg$>VSLMvqFfm8 zZ#aR9`l|T%{5cUzP+AE6+7lAY_-}#O5cX1>tdgiB>kH2lY_!M>NT7!l$Px}A=peRb z+5N}F%K0E-pMj;CH;V22T27HmPQyyGHj3Q!DLC~L3F24gv=`O-V1f&u5^N#-^vU5A z1f3Vg^<7|Qv>EuBoj{JPzu;m~7q6xRR^q`K6MHk6GJHJxDWe?dWW1vt{^{L0G6pI+ z-)O9TwIn+$6oj%r^@cO=snhYTPvC6am>?a$7i`--iCr3|B z#Pb*;wHUa7>QbVYL&gJ@$06g$0SM%N{29d5GyqzlTJ*BN{|u7WX$gyz^{$W*hfj@| zSxpC5JQ|!?5EL^%h?3Q z>ioQJyBdoxs#4*~qhqod27#hst0E|W$kKY zLN^bWlgBH|3rB)soJ-_iLpFv}Pd0?wCbNb!+lJ6CUv}qFnLC12*Tjhy3Gz?q0Fk$( zWKxqkpGrq7R5FX&YL)rf%4^EM0Wz~wX@LBKs=N6Ha5HPSnR2MvpFpmM@1;G$hI1Il zN)D$GVde)#GUet6`P;atEnI_Ke^dTR`KOVp*r-K)bu6It$Ba<5m$6bxfs*nDLjGro zjQ=U@cPPjGL>WV-s?@JAP6aMN*8-blKgcqVjFoD_?<5pM`D~7 zomihCx!dPpxm^e(91NICf5qY74+9$iYpRc03HRNrVxTU-82i22MKh`kZo>6X-PBdGdEeTuOrzm#^%y z`^~%Z2cbYgK5=XOB1X96n1A>QXx3w1v%K1B;Ht0CU;lV4FNE;3Qoywy+3fg*d+crp zqW#SMwe)nT!lv4M);HPal0tkAFIKq|j4}qYIL`OLWlYhzS Izwkf*1H=gF&;S4c literal 0 HcmV?d00001 diff --git a/preact-iso/jsconfig.json b/preact-iso/jsconfig.json new file mode 100644 index 0000000..d8885de --- /dev/null +++ b/preact-iso/jsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "noEmit": true, + "allowJs": true, + "checkJs": true + } +} diff --git a/preact-iso/package.json b/preact-iso/package.json new file mode 100644 index 0000000..188bff2 --- /dev/null +++ b/preact-iso/package.json @@ -0,0 +1,57 @@ +{ + "name": "preact-iso", + "version": "2.4.0", + "type": "module", + "main": "src/index.js", + "module": "src/index.js", + "types": "src/index.d.ts", + "exports": { + ".": "./src/index.js", + "./router": "./src/router.js", + "./lazy": "./src/lazy.js", + "./prerender": "./src/prerender.js", + "./hydrate": "./src/hydrate.js" + }, + "license": "MIT", + "description": "Isomorphic utilities for Preact", + "author": "The Preact Authors (https://preactjs.com)", + "repository": { + "type": "git", + "url": "git+https://github.com/preactjs/preact-iso.git" + }, + "files": [ + "src", + "LICENSE", + "package.json", + "README.md" + ], + "scripts": { + "test": "node --experimental-vm-modules node_modules/.bin/jest" + }, + "jest": { + "testEnvironment": "jsdom", + "testEnvironmentOptions": { + "customExportConditions": [ + "node", + "node-addons" + ] + } + }, + "peerDependencies": { + "preact": ">=10", + "preact-render-to-string": ">=5" + }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + }, + "devDependencies": { + "htm": "^3.1.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jsdom": "^22.1.0", + "preact": "10.15.1", + "preact-render-to-string": "^6.2.2" + } +} \ No newline at end of file diff --git a/preact-iso/src/hydrate.d.ts b/preact-iso/src/hydrate.d.ts new file mode 100644 index 0000000..ace9158 --- /dev/null +++ b/preact-iso/src/hydrate.d.ts @@ -0,0 +1,3 @@ +import { ComponentChild } from 'preact'; + +export default function hydrate(jsx: ComponentChild, parent?: Element | Document | ShadowRoot | DocumentFragment): void; diff --git a/preact-iso/src/hydrate.js b/preact-iso/src/hydrate.js new file mode 100644 index 0000000..68d9375 --- /dev/null +++ b/preact-iso/src/hydrate.js @@ -0,0 +1,17 @@ +import { render, hydrate as hydrativeRender } from 'preact'; + +let initialized; + +/** @type {typeof render} */ +export default function hydrate(jsx, parent) { + if (typeof window === 'undefined') return; + let isodata = document.querySelector('script[type=isodata]'); + // @ts-ignore-next + parent = parent || (isodata && isodata.parentNode) || document.body; + if (!initialized && isodata) { + hydrativeRender(jsx, parent); + } else { + render(jsx, parent); + } + initialized = true; +} diff --git a/preact-iso/src/index.d.ts b/preact-iso/src/index.d.ts new file mode 100644 index 0000000..70ba4a2 --- /dev/null +++ b/preact-iso/src/index.d.ts @@ -0,0 +1,4 @@ +export { default as prerender } from './prerender.js'; +export * from './router.js'; +export { default as lazy, ErrorBoundary } from './lazy.js'; +export { default as hydrate } from './hydrate.js'; diff --git a/preact-iso/src/index.js b/preact-iso/src/index.js new file mode 100644 index 0000000..3bfc751 --- /dev/null +++ b/preact-iso/src/index.js @@ -0,0 +1,7 @@ +export { Router, LocationProvider, useLocation, Route, useRoute } from './router.js'; +export { default as lazy, ErrorBoundary } from './lazy.js'; +export { default as hydrate } from './hydrate.js'; + +export function prerender(vnode, options) { + return import('./prerender.js').then(m => m.default(vnode, options)); +} diff --git a/preact-iso/src/lazy.d.ts b/preact-iso/src/lazy.d.ts new file mode 100644 index 0000000..829cdf3 --- /dev/null +++ b/preact-iso/src/lazy.d.ts @@ -0,0 +1,5 @@ +import { ComponentChildren, VNode } from 'preact'; + +export default function lazy(load: () => Promise<{ default: T } | T>): T; + +export function ErrorBoundary(props: { children?: ComponentChildren; onError?: (error: Error) => void }): VNode; diff --git a/preact-iso/src/lazy.js b/preact-iso/src/lazy.js new file mode 100644 index 0000000..9670e8d --- /dev/null +++ b/preact-iso/src/lazy.js @@ -0,0 +1,43 @@ +import { h, options } from 'preact'; +import { useState, useRef } from 'preact/hooks'; + +export default function lazy(load) { + let p, c; + return props => { + const [, update] = useState(0); + const r = useRef(c); + if (!p) p = load().then(m => (c = (m && m.default) || m)); + if (c !== undefined) return h(c, props); + if (!r.current) r.current = p.then(() => update(1)); + throw p; + }; +} + +// See https://github.com/preactjs/preact/blob/88680e91ec0d5fc29d38554a3e122b10824636b6/compat/src/suspense.js#L5 +const oldCatchError = options.__e; +options.__e = (err, newVNode, oldVNode) => { + if (err && err.then) { + let v = newVNode; + while ((v = v.__)) { + if (v.__c && v.__c.__c) { + if (newVNode.__e == null) { + newVNode.__e = oldVNode.__e; // ._dom + newVNode.__k = oldVNode.__k; // ._children + } + if (!newVNode.__k) newVNode.__k = []; + return v.__c.__c(err, newVNode); + } + } + } + if (oldCatchError) oldCatchError(err, newVNode, oldVNode); +}; + +export function ErrorBoundary(props) { + this.__c = childDidSuspend; + this.componentDidCatch = props.onError; + return props.children; +} + +function childDidSuspend(err) { + err.then(() => this.forceUpdate()); +} diff --git a/preact-iso/src/prerender.d.ts b/preact-iso/src/prerender.d.ts new file mode 100644 index 0000000..4e96733 --- /dev/null +++ b/preact-iso/src/prerender.d.ts @@ -0,0 +1,16 @@ +import { VNode } from 'preact'; + +export interface PrerenderOptions { + maxDepth?: number; + props?: Record; +} + +export interface PrerenderResult { + html: string; + links?: Set +} + +export default function prerender( + vnode: VNode, + options?: PrerenderOptions +): Promise; diff --git a/preact-iso/src/prerender.js b/preact-iso/src/prerender.js new file mode 100644 index 0000000..a202acd --- /dev/null +++ b/preact-iso/src/prerender.js @@ -0,0 +1,60 @@ +import { h, options, cloneElement } from "preact"; +import { renderToStringAsync } from "preact-render-to-string"; + +let vnodeHook; + +const old = options.vnode; +options.vnode = (vnode) => { + if (old) old(vnode); + if (vnodeHook) vnodeHook(vnode); +}; + +/** + * @param {ReturnType} vnode The root JSX element to render (eg: ``) + * @param {object} [options] + * @param {number} [options.maxDepth = 10] The maximum number of nested asynchronous operations to wait for before flushing + * @param {object} [options.props] Additional props to merge into the root JSX element + */ +export default async function prerender(vnode, options) { + options = options || {}; + + const maxDepth = options.maxDepth || 10; + const props = options.props; + let tries = 0; + + if (typeof vnode === "function") { + vnode = h(vnode, props); + } else if (props) { + vnode = cloneElement(vnode, props); + } + + const render = () => { + if (++tries > maxDepth) return; + try { + return renderToStringAsync(vnode); + } catch (e) { + if (e && e.then) return e.then(render); + throw e; + } + }; + + let links = new Set(); + vnodeHook = ({ type, props }) => { + if ( + type === "a" && + props && + props.href && + (!props.target || props.target === "_self") + ) { + links.add(props.href); + } + }; + + try { + let html = await render(); + html += ``; + return { html, links }; + } finally { + vnodeHook = null; + } +} diff --git a/preact-iso/src/router.d.ts b/preact-iso/src/router.d.ts new file mode 100644 index 0000000..6180823 --- /dev/null +++ b/preact-iso/src/router.d.ts @@ -0,0 +1,42 @@ +import { AnyComponent, FunctionComponent, VNode } from 'preact'; + +export const LocationProvider: FunctionComponent; + +export function Router(props: { + onRouteChange?: (url: string) => void; + onLoadEnd?: (url: string) => void; + onLoadStart?: (url: string) => void; + children?: VNode[]; +}): VNode; + +interface LocationHook { + url: string; + path: string; + query: Record; + route: (url: string, replace?: boolean) => void; +} +export const useLocation: () => LocationHook; + +export const useRoute: () => { + path: string; + query: Record; + params: Record; +}; + +interface RoutableProps { + path?: string; + default?: boolean; +} + +export interface RouteProps extends RoutableProps { + component: AnyComponent; +} + +export function Route(props: RouteProps & Partial): VNode; + +declare module 'preact' { + namespace JSX { + interface IntrinsicAttributes extends RoutableProps {} + } + interface Attributes extends RoutableProps {} +} diff --git a/preact-iso/src/router.js b/preact-iso/src/router.js new file mode 100644 index 0000000..748c0db --- /dev/null +++ b/preact-iso/src/router.js @@ -0,0 +1,216 @@ +import { h, createContext, cloneElement, toChildArray } from 'preact'; +import { useContext, useMemo, useReducer, useLayoutEffect, useRef } from 'preact/hooks'; + +let push; +const UPDATE = (state, url) => { + push = undefined; + if (url && url.type === 'click') { + // ignore events the browser takes care of already: + if (url.ctrlKey || url.metaKey || url.altKey || url.shiftKey || url.button !== 0) { + return state; + } + + const link = url.target.closest('a[href]'); + if ( + !link || + link.origin != location.origin || + /^#/.test(link.getAttribute('href')) || + !/^(_?self)?$/i.test(link.target) + ) { + return state; + } + + push = true; + url.preventDefault(); + url = link.href.replace(location.origin, ''); + } else if (typeof url === 'string') { + push = true; + } else if (url && url.url) { + push = !url.replace; + url = url.url; + } else { + url = location.pathname + location.search; + } + + if (push === true) history.pushState(null, '', url); + else if (push === false) history.replaceState(null, '', url); + return url; +}; + +export const exec = (url, route, matches) => { + url = url.split('/').filter(Boolean); + route = (route || '').split('/').filter(Boolean); + for (let i = 0, val, rest; i < Math.max(url.length, route.length); i++) { + let [, m, param, flag] = (route[i] || '').match(/^(:?)(.*?)([+*?]?)$/); + val = url[i]; + // segment match: + if (!m && param == val) continue; + // /foo/* match + if (!m && val && flag == '*') { + matches.rest = '/' + url.slice(i).map(decodeURIComponent).join('/'); + break; + } + // segment mismatch / missing required field: + if (!m || (!val && flag != '?' && flag != '*')) return; + rest = flag == '+' || flag == '*'; + // rest (+/*) match: + if (rest) val = url.slice(i).map(decodeURIComponent).join('/'); + // normal/optional field: + else if (val) val = decodeURIComponent(val); + matches.params[param] = val; + if (!(param in matches)) matches[param] = val; + if (rest) break; + } + return matches; +}; + +export function LocationProvider(props) { + const [url, route] = useReducer(UPDATE, props.url || location.pathname + location.search); + const wasPush = push === true; + + const value = useMemo(() => { + const u = new URL(url, location.origin); + const path = u.pathname.replace(/(.)\/$/g, '$1'); + // @ts-ignore-next + return { + url, + path, + query: Object.fromEntries(u.searchParams), + route: (url, replace) => route({ url, replace }), + wasPush + }; + }, [url]); + + useLayoutEffect(() => { + addEventListener('click', route); + addEventListener('popstate', route); + + return () => { + removeEventListener('click', route); + removeEventListener('popstate', route); + }; + }, []); + + // @ts-ignore + return h(LocationProvider.ctx.Provider, { value }, props.children); +} + +const RESOLVED = Promise.resolve(); +export function Router(props) { + const [c, update] = useReducer(c => c + 1, 0); + + const { url, query, wasPush, path } = useLocation(); + const { rest = path, params = {} } = useContext(RouteContext); + + const isLoading = useRef(false); + const prevRoute = useRef(path); + // Monotonic counter used to check if an un-suspending route is still the current route: + const count = useRef(0); + // The current route: + const cur = useRef(); + // Previous route (if current route is suspended): + const prev = useRef(); + // A not-yet-hydrated DOM root to remove once we commit: + const pendingBase = useRef(); + // has this component ever successfully rendered without suspending: + const hasEverCommitted = useRef(false); + // was the most recent render successful (did not suspend): + const didSuspend = useRef(); + didSuspend.current = false; + + cur.current = useMemo(() => { + // This hack prevents Preact from diffing when we swap `cur` to `prev`: + if (this.__v && this.__v.__k) this.__v.__k.reverse(); + + count.current++; + + prev.current = cur.current; + + let p, d, m; + toChildArray(props.children).some(vnode => { + const matches = exec(rest, vnode.props.path, (m = { path: rest, query, params, rest: '' })); + if (matches) return (p = cloneElement(vnode, m)); + if (vnode.props.default) d = cloneElement(vnode, m); + }); + + return h(RouteContext.Provider, { value: m }, p || d); + }, [url]); + + // Reset previous children - if rendering succeeds synchronously, we shouldn't render the previous children. + const p = prev.current; + prev.current = null; + + // This borrows the _childDidSuspend() solution from compat. + this.__c = e => { + // Mark the current render as having suspended: + didSuspend.current = true; + + // The new route suspended, so keep the previous route around while it loads: + prev.current = p; + + // Fire an event saying we're waiting for the route: + if (props.onLoadStart) props.onLoadStart(url); + isLoading.current = true; + + // Re-render on unsuspend: + let c = count.current; + e.then(() => { + // Ignore this update if it isn't the most recently suspended update: + if (c !== count.current) return; + + // Successful route transition: un-suspend after a tick and stop rendering the old route: + prev.current = null; + RESOLVED.then(update); + }); + }; + + useLayoutEffect(() => { + const currentDom = this.__v && this.__v.__e; + + // Ignore suspended renders (failed commits): + if (didSuspend.current) { + // If we've never committed, mark any hydration DOM for removal on the next commit: + if (!hasEverCommitted.current && !pendingBase.current) { + pendingBase.current = currentDom; + } + return; + } + + // If this is the first ever successful commit and we didn't use the hydration DOM, remove it: + if (!hasEverCommitted.current && pendingBase.current) { + if (pendingBase.current !== currentDom) pendingBase.current.remove(); + pendingBase.current = null; + } + + // Mark the component has having committed: + hasEverCommitted.current = true; + + // The route is loaded and rendered. + if (prevRoute.current !== path) { + if (wasPush) scrollTo(0, 0); + if (props.onLoadEnd && isLoading.current) props.onLoadEnd(url); + if (props.onRouteChange) props.onRouteChange(url); + + isLoading.current = false; + prevRoute.current = path; + } + }, [path, wasPush, c]); + + // Note: curChildren MUST render first in order to set didSuspend & prev. + return [h(RenderRef, { r: cur }), h(RenderRef, { r: prev })]; +} + +// Lazily render a ref's current value: +const RenderRef = ({ r }) => r.current; + +Router.Provider = LocationProvider; + +/** @typedef {{ url: string, path: string, query: object, route, wasPush: boolean }} RouteInfo */ + +LocationProvider.ctx = createContext(/** @type {RouteInfo} */ ({})); +const RouteContext = createContext({}); + +export const Route = props => h(props.component, props); + +export const useLocation = () => useContext(LocationProvider.ctx); +export const useRoute = () => useContext(RouteContext); diff --git a/preact-iso/test/match.test.js b/preact-iso/test/match.test.js new file mode 100644 index 0000000..1576528 --- /dev/null +++ b/preact-iso/test/match.test.js @@ -0,0 +1,107 @@ +import { describe, it, expect } from '@jest/globals'; +import { exec } from '../src/router.js'; + +function execPath(path, pattern, opts) { + return exec(path, pattern, { path, query: {}, params: {}, ...(opts || {}) }); +} + +describe('match', () => { + it('Base route', () => { + const accurateResult = execPath('/', '/'); + expect(accurateResult).toEqual({ path: '/', params: {}, query: {} }); + + const inaccurateResult = execPath('/user/1', '/'); + expect(inaccurateResult).toEqual(undefined); + }); + + it('Param route', () => { + const accurateResult = execPath('/user/2', '/user/:id'); + expect(accurateResult).toEqual({ path: '/user/2', params: { id: '2' }, id: '2', query: {} }); + + const inaccurateResult = execPath('/', '/user/:id'); + expect(inaccurateResult).toEqual(undefined); + }); + + it('Param rest segment', () => { + const accurateResult = execPath('/user/foo', '/user/*'); + expect(accurateResult).toEqual({ path: '/user/foo', params: {}, query: {}, rest: '/foo' }); + + const inaccurateResult = execPath('/', '/user/:id/*'); + expect(inaccurateResult).toEqual(undefined); + }); + + it('Param route with rest segment', () => { + const accurateResult = execPath('/user/2/foo', '/user/:id/*'); + expect(accurateResult).toEqual({ path: '/user/2/foo', params: { id: '2' }, id: '2', query: {}, rest: '/foo' }); + + const accurateResult2 = execPath('/user/2/foo/bar/bob', '/user/:id/*'); + expect(accurateResult2).toEqual({ + path: '/user/2/foo/bar/bob', + params: { id: '2' }, + id: '2', + query: {}, + rest: '/foo/bar/bob' + }); + + const inaccurateResult = execPath('/', '/user/:id/*'); + expect(inaccurateResult).toEqual(undefined); + }); + + it('Optional param route', () => { + const accurateResult = execPath('/user', '/user/:id?'); + expect(accurateResult).toEqual({ path: '/user', params: { id: undefined }, id: undefined, query: {} }); + + const inaccurateResult = execPath('/', '/user/:id?'); + expect(inaccurateResult).toEqual(undefined); + }); + + it('Optional rest param route "/:x*"', () => { + const accurateResult = execPath('/user', '/user/:id?'); + expect(accurateResult).toEqual({ path: '/user', params: { id: undefined }, id: undefined, query: {} }); + + const inaccurateResult = execPath('/', '/user/:id?'); + expect(inaccurateResult).toEqual(undefined); + }); + + it('Rest param route "/:x+"', () => { + const matchedResult = execPath('/user/foo', '/user/:id+'); + expect(matchedResult).toEqual({ path: '/user/foo', params: { id: 'foo' }, id: 'foo', query: {} }); + + const matchedResultWithSlash = execPath('/user/foo/bar', '/user/:id+'); + expect(matchedResultWithSlash).toEqual({ + path: '/user/foo/bar', + params: { id: 'foo/bar' }, + id: 'foo/bar', + query: {} + }); + + const emptyResult = execPath('/user', '/user/:id+'); + expect(emptyResult).toEqual(undefined); + + const mismatchedResult = execPath('/', '/user/:id+'); + expect(mismatchedResult).toEqual(undefined); + }); + + it('Handles leading/trailing slashes', () => { + const result = execPath('/about-late/_SEGMENT1_/_SEGMENT2_/', '/about-late/:seg1/:seg2/'); + expect(result).toEqual({ + path: '/about-late/_SEGMENT1_/_SEGMENT2_/', + params: { + seg1: '_SEGMENT1_', + seg2: '_SEGMENT2_' + }, + seg1: '_SEGMENT1_', + seg2: '_SEGMENT2_', + query: {} + }); + }); + + it('should not overwrite existing properties', () => { + const result = execPath('/foo/bar', '/:path/:query', { path: '/custom-path' }); + expect(result).toEqual({ + params: { path: 'foo', query: 'bar' }, + path: '/custom-path', + query: {} + }); + }); +}); diff --git a/preact-iso/test/router.test.js b/preact-iso/test/router.test.js new file mode 100644 index 0000000..e1f4bf5 --- /dev/null +++ b/preact-iso/test/router.test.js @@ -0,0 +1,535 @@ +import { jest, describe, it, beforeEach, expect } from '@jest/globals'; +import { h, render } from 'preact'; +import { html } from 'htm/preact'; +import { LocationProvider, Router, useLocation, Route, useRoute } from '../src/router.js'; +import lazy, { ErrorBoundary } from '../src/lazy.js'; + +Object.defineProperty(window, 'scrollTo', { value() {} }); + +const sleep = ms => new Promise(r => setTimeout(r, ms)); + +// delayed lazy() +const groggy = (component, ms) => lazy(() => sleep(ms).then(() => component)); + +describe('Router', () => { + let scratch; + beforeEach(() => { + if (scratch) { + render(null, scratch); + scratch.remove(); + } + scratch = document.createElement('scratch'); + document.body.appendChild(scratch); + history.replaceState(null, null, '/'); + }); + + it('should switch between synchronous routes', async () => { + const Home = jest.fn(() => html`

    Home

    `); + const Profiles = jest.fn(() => html`

    Profiles

    `); + const Profile = jest.fn(({ params }) => html`

    Profile: ${params.id}

    `); + const Fallback = jest.fn(() => html`

    Fallback

    `); + const stack = []; + let loc; + render( + html` + <${LocationProvider}> + <${Router} + onRouteChange=${url => { + stack.push(url); + }} + > + <${Home} path="/" /> + <${Profiles} path="/profiles" /> + <${Profile} path="/profiles/:id" /> + <${Fallback} default /> + + <${() => { + loc = useLocation(); + }} /> + + `, + scratch + ); + + expect(scratch).toHaveProperty('textContent', 'Home'); + expect(Home).toHaveBeenCalledWith({ path: '/', query: {}, params: {}, rest: '' }, expect.anything()); + expect(Profiles).not.toHaveBeenCalled(); + expect(Profile).not.toHaveBeenCalled(); + expect(Fallback).not.toHaveBeenCalled(); + expect(loc).toMatchObject({ + url: '/', + path: '/', + query: {}, + route: expect.any(Function) + }); + + Home.mockReset(); + loc.route('/profiles'); + await sleep(1); + + expect(scratch).toHaveProperty('textContent', 'Profiles'); + expect(Home).not.toHaveBeenCalled(); + expect(Profiles).toHaveBeenCalledWith({ path: '/profiles', query: {}, params: {}, rest: '' }, expect.anything()); + expect(Profile).not.toHaveBeenCalled(); + expect(Fallback).not.toHaveBeenCalled(); + + expect(loc).toMatchObject({ + url: '/profiles', + path: '/profiles', + query: {} + }); + + Profiles.mockReset(); + loc.route('/profiles/bob'); + await sleep(1); + + expect(scratch).toHaveProperty('textContent', 'Profile: bob'); + expect(Home).not.toHaveBeenCalled(); + expect(Profiles).not.toHaveBeenCalled(); + expect(Profile).toHaveBeenCalledWith( + { path: '/profiles/bob', query: {}, params: { id: 'bob' }, id: 'bob', rest: '' }, + expect.anything() + ); + expect(Fallback).not.toHaveBeenCalled(); + + expect(loc).toMatchObject({ + url: '/profiles/bob', + path: '/profiles/bob', + query: {} + }); + + Profile.mockReset(); + loc.route('/other?a=b&c=d'); + await sleep(1); + + expect(scratch).toHaveProperty('textContent', 'Fallback'); + expect(Home).not.toHaveBeenCalled(); + expect(Profiles).not.toHaveBeenCalled(); + expect(Profile).not.toHaveBeenCalled(); + expect(Fallback).toHaveBeenCalledWith( + { default: true, path: '/other', query: { a: 'b', c: 'd' }, params: {}, rest: '' }, + expect.anything() + ); + + expect(loc).toMatchObject({ + url: '/other?a=b&c=d', + path: '/other', + query: { a: 'b', c: 'd' } + }); + expect(stack).toEqual(['/profiles', '/profiles/bob', '/other?a=b&c=d']); + }); + + it('should wait for asynchronous routes', async () => { + const route = name => html` +

    ${name}

    +

    hello

    + `; + const A = jest.fn(groggy(() => route('A'), 1)); + const B = jest.fn(groggy(() => route('B'), 1)); + const C = jest.fn(groggy(() => html`

    C

    `, 1)); + let loc; + render( + html` + <${ErrorBoundary}> + <${LocationProvider}> + <${Router}> + <${A} path="/" /> + <${B} path="/b" /> + <${C} path="/c" /> + + <${() => { + loc = useLocation(); + }} /> + + + `, + scratch + ); + + expect(scratch).toHaveProperty('innerHTML', ''); + expect(A).toHaveBeenCalledWith({ path: '/', query: {}, params: {}, rest: '' }, expect.anything()); + + A.mockClear(); + await sleep(10); + + expect(scratch).toHaveProperty('innerHTML', '

    A

    hello

    '); + expect(A).toHaveBeenCalledWith({ path: '/', query: {}, params: {}, rest: '' }, expect.anything()); + + A.mockClear(); + loc.route('/b'); + + expect(scratch).toHaveProperty('innerHTML', '

    A

    hello

    '); + expect(A).not.toHaveBeenCalled(); + + await sleep(1); + + expect(scratch).toHaveProperty('innerHTML', '

    A

    hello

    '); + // We should never re-invoke while loading (that would be a remount of the old route): + //expect(A).not.toHaveBeenCalled(); + //expect(B).toHaveBeenCalledWith({ path: '/b', query: {}, params: {}, rest: '' }, expect.anything()); + + B.mockClear(); + await sleep(10); + + expect(scratch).toHaveProperty('innerHTML', '

    B

    hello

    '); + expect(A).not.toHaveBeenCalled(); + expect(B).toHaveBeenCalledWith({ path: '/b', query: {}, params: {}, rest: '' }, expect.anything()); + + B.mockClear(); + loc.route('/c'); + loc.route('/c?1'); + loc.route('/c'); + + expect(scratch).toHaveProperty('innerHTML', '

    B

    hello

    '); + expect(B).not.toHaveBeenCalled(); + + await sleep(1); + + loc.route('/c'); + loc.route('/c?2'); + loc.route('/c'); + + expect(scratch).toHaveProperty('innerHTML', '

    B

    hello

    '); + // We should never re-invoke
    while loading (that would be a remount of the old route): + expect(B).not.toHaveBeenCalled(); + expect(C).toHaveBeenCalledWith({ path: '/c', query: {}, params: {}, rest: '' }, expect.anything()); + + C.mockClear(); + await sleep(10); + + expect(scratch).toHaveProperty('innerHTML', '

    C

    '); + expect(B).not.toHaveBeenCalled(); + expect(C).toHaveBeenCalledWith({ path: '/c', query: {}, params: {}, rest: '' }, expect.anything()); + + // "instant" routing to already-loaded routes + + C.mockClear(); + B.mockClear(); + loc.route('/b'); + await sleep(1); + + expect(scratch).toHaveProperty('innerHTML', '

    B

    hello

    '); + expect(C).not.toHaveBeenCalled(); + // expect(B).toHaveBeenCalledTimes(1); + expect(B).toHaveBeenCalledWith({ path: '/b', query: {}, params: {}, rest: '' }, expect.anything()); + + B.mockClear(); + loc.route('/'); + await sleep(1); + + expect(scratch).toHaveProperty('innerHTML', '

    A

    hello

    '); + expect(B).not.toHaveBeenCalled(); + // expect(A).toHaveBeenCalledTimes(1); + expect(A).toHaveBeenCalledWith({ path: '/', query: {}, params: {}, rest: '' }, expect.anything()); + }); + + describe('intercepted VS external links', () => { + const shouldIntercept = [null, '', '_self', 'self', '_SELF']; + const shouldNavigate = ['_top', '_parent', '_blank', 'custom', '_BLANK']; + + // prevent actual navigations (not implemented in JSDOM) + const clickHandler = jest.fn(e => e.preventDefault()); + + const Route = jest.fn( + () => html` +
    + ` + ); + + let pushState, loc; + + beforeAll(() => { + pushState = jest.spyOn(history, 'pushState'); + addEventListener('click', clickHandler); + }); + + afterAll(() => { + pushState.mockRestore(); + removeEventListener('click', clickHandler); + }); + + beforeEach(async () => { + render( + html` + <${LocationProvider}> + <${Router}> + <${Route} default /> + + <${() => { + loc = useLocation(); + }} /> + + `, + scratch + ); + await sleep(10); + Route.mockClear(); + clickHandler.mockClear(); + pushState.mockClear(); + }); + + const getName = target => (target == null ? 'no target attribute' : `target="${target}"`); + + // these should all be intercepted by the router. + for (const target of shouldIntercept) { + it(`should intercept clicks on links with ${getName(target)}`, async () => { + await sleep(10); + + const sel = target == null ? `a:not([target])` : `a[target="${target}"]`; + const el = scratch.querySelector(sel); + if (!el) throw Error(`Unable to find link: ${sel}`); + const url = el.getAttribute('href'); + el.click(); + await sleep(1); + expect(loc).toMatchObject({ url }); + expect(Route).toHaveBeenCalledTimes(1); + expect(pushState).toHaveBeenCalledWith(null, '', url); + expect(clickHandler).toHaveBeenCalled(); + }); + } + + // these should all navigate. + for (const target of shouldNavigate) { + it(`should allow default browser navigation for links with ${getName(target)}`, async () => { + await sleep(10); + + const sel = target == null ? `a:not([target])` : `a[target="${target}"]`; + const el = scratch.querySelector(sel); + if (!el) throw Error(`Unable to find link: ${sel}`); + el.click(); + await sleep(1); + expect(Route).not.toHaveBeenCalled(); + expect(pushState).not.toHaveBeenCalled(); + expect(clickHandler).toHaveBeenCalled(); + }); + } + }); + + it('should scroll to top when navigating forward', async () => { + const scrollTo = jest.spyOn(window, 'scrollTo'); + + const Route = jest.fn(() => html``); + let loc; + render( + html` + <${LocationProvider}> + <${Router}> + <${Route} default /> + + <${() => { + loc = useLocation(); + }} /> + + `, + scratch + ); + + await sleep(20); + + expect(scrollTo).not.toHaveBeenCalled(); + expect(Route).toHaveBeenCalledTimes(1); + Route.mockClear(); + + loc.route('/programmatic'); + await sleep(10); + expect(loc).toMatchObject({ url: '/programmatic' }); + expect(scrollTo).toHaveBeenCalledWith(0, 0); + expect(scrollTo).toHaveBeenCalledTimes(1); + expect(Route).toHaveBeenCalledTimes(1); + Route.mockClear(); + scrollTo.mockClear(); + + scratch.querySelector('a').click(); + await sleep(10); + expect(loc).toMatchObject({ url: '/link' }); + expect(scrollTo).toHaveBeenCalledWith(0, 0); + expect(scrollTo).toHaveBeenCalledTimes(1); + expect(Route).toHaveBeenCalledTimes(1); + Route.mockClear(); + + await sleep(10); + scrollTo.mockRestore(); + }); + + it('should ignore clicks on anchor links', async () => { + let loc; + const pushState = jest.spyOn(history, 'pushState'); + + const Route = jest.fn( + () => html` + + ` + ); + render( + html` + <${LocationProvider}> + <${Router}> + <${Route} path="/" /> + <${Route} path="/other" /> + <${Route} default /> + + <${() => { + loc = useLocation(); + }} /> + + `, + scratch + ); + + expect(Route).toHaveBeenCalledTimes(1); + Route.mockClear(); + await sleep(20); + + scratch.querySelector('a[href="#foo"]').click(); + await sleep(20); + // NOTE: we don't (currently) propagate in-page anchor navigations into context, to avoid useless renders. + expect(loc).toMatchObject({ url: '/' }); + expect(Route).not.toHaveBeenCalled(); + expect(pushState).not.toHaveBeenCalled(); + expect(location.hash).toEqual('#foo'); + + await sleep(10); + + scratch.querySelector('a[href="/other#bar"]').click(); + await sleep(10); + expect(Route).toHaveBeenCalledTimes(1); + expect(loc).toMatchObject({ url: '/other#bar', path: '/other' }); + expect(pushState).toHaveBeenCalled(); + expect(location.hash).toEqual('#bar'); + + pushState.mockRestore(); + }); + + it('should normalize children', async () => { + let loc; + const pushState = jest.spyOn(history, 'pushState'); + const Route = jest.fn(() => html`foo`); + + const routes = ['/foo', '/bar']; + render( + html` + <${LocationProvider}> + <${Router}> + ${routes.map(route => html`<${Route} path=${route} />`)} + <${Route} default /> + + <${() => { + loc = useLocation(); + }} /> + + `, + scratch + ); + + expect(Route).toHaveBeenCalledTimes(1); + Route.mockClear(); + await sleep(20); + + scratch.querySelector('a[href="/foo#foo"]').click(); + await sleep(20); + expect(Route).toHaveBeenCalledTimes(1); + expect(loc).toMatchObject({ url: '/foo#foo', path: '/foo' }); + expect(pushState).toHaveBeenCalled(); + + pushState.mockRestore(); + }); + + it('should match nested routes', async () => { + let route; + const Inner = () => html` + <${Router}> + <${Route} + path="/bob" + component=${() => { + route = useRoute(); + return null; + }} + /> + + `; + + render( + html` + <${LocationProvider}> + <${Router}> + <${Route} path="/foo/:id/*" component=${Inner} /> + + + + `, + scratch + ); + + scratch.querySelector('a[href="/foo/bar/bob"]').click(); + await sleep(20); + expect(route).toMatchObject({ path: '/bob', params: { id: 'bar' } }); + }); + + it('should append params in nested routes', async () => { + let params; + const Inner = () => html` + <${Router}> + <${Route} + path="/bob" + component=${() => { + params = useRoute().params; + return null; + }} + /> + + `; + + render( + html` + <${LocationProvider}> + <${Router}> + <${Route} path="/foo/:id/*" component=${Inner} /> + + + + `, + scratch + ); + + scratch.querySelector('a[href="/foo/bar/bob"]').click(); + await sleep(20); + expect(params).toMatchObject({ id: 'bar' }); + }); + + it('should replace the current URL', async () => { + const pushState = jest.spyOn(history, 'pushState'); + const replaceState = jest.spyOn(history, 'replaceState'); + let loc; + + render( + html` + <${LocationProvider}> + <${Router}> + <${Route} path="/foo" component=${() => null} /> + + <${() => { + loc = useLocation(); + }} /> + + `, + scratch + ); + + await sleep(20); + loc.route("/foo", true); + expect(pushState).not.toHaveBeenCalled(); + expect(replaceState).toHaveBeenCalledWith(null, "", "/foo"); + + pushState.mockRestore(); + replaceState.mockRestore(); + }); +}); diff --git a/preact-iso/yarn.lock b/preact-iso/yarn.lock new file mode 100644 index 0000000..b286172 --- /dev/null +++ b/preact-iso/yarn.lock @@ -0,0 +1,2578 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" + integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.0" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helpers@^7.23.0": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" + integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + 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" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/template@^7.22.15", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@types/babel__core@^7.1.14": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" + integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.5" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" + integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" + integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" + integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== + dependencies: + "@babel/types" "^7.20.7" + +"@types/graceful-fs@^4.1.3": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" + integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" + integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" + integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + +"@types/node@*": + version "20.8.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.2.tgz#d76fb80d87d0d8abfe334fc6d292e83e5524efc4" + integrity sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/tough-cookie@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" + integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== + +"@types/yargs-parser@*": + version "21.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" + integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== + +"@types/yargs@^17.0.8": + version "17.0.26" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.26.tgz#388e5002a8b284ad7b4599ba89920a6d74d8d79a" + integrity sha512-Y3vDy2X6zw/ZCumcwLpdhM5L7jmyGpmBCTYMHDLqT2IKVMYRRLdv6ZakA+wxhra6Z/3bwhNbNl9bDGXaFU+6rw== + dependencies: + "@types/yargs-parser" "*" + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.1.0, acorn@^8.8.1: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.9: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== + dependencies: + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001541: + version "1.0.30001546" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz#10fdad03436cfe3cc632d3af7a99a0fb497407f0" + integrity sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +cssstyle@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" + integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== + dependencies: + rrweb-cssom "^0.6.0" + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +data-urls@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" + integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decimal.js@^10.4.2, decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +electron-to-chromium@^1.4.535: + version "1.4.543" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.543.tgz#51116ffc9fba1ee93514d6a40d34676aa6d7d1c4" + integrity sha512-t2ZP4AcGE0iKCCQCBx/K2426crYdxD3YU6l0uK2EO3FZH0pbC4pFz/sZm2ruZsND6hQBTcDWWlo/MLpiOdif5g== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +htm@^3.0.4: + version "3.1.1" + resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" + integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ== + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + +jsdom@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" + integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== + dependencies: + abab "^2.0.6" + cssstyle "^3.0.0" + data-urls "^4.0.0" + decimal.js "^10.4.3" + domexception "^4.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.4" + parse5 "^7.1.2" + rrweb-cssom "^0.6.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.1" + ws "^8.13.0" + xml-name-validator "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nwsapi@^2.2.2, nwsapi@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@^7.0.0, parse5@^7.1.1, parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +preact-render-to-string@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.2.2.tgz#eb086b6db5d57468ab2c184896884fb0a818245d" + integrity sha512-YDfXQiVeYZutFR8/DpxLSbW3W6b7GgjBExRBxOOqcjrGq5rA9cziitQdNPMZe4RVMSdfBnf4hYqyeLs/KvtIuA== + dependencies: + pretty-format "^3.8.0" + +preact@10.15.1: + version "10.15.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.15.1.tgz#a1de60c9fc0c79a522d969c65dcaddc5d994eede" + integrity sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g== + +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" + integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.1, punycode@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +pure-rand@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.20.0: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "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== + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +v8-to-istanbul@^9.0.1: + version "9.1.3" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" + integrity sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^12.0.0, whatwg-url@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" + integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^8.11.0, ws@^8.13.0: + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 893ee1835d33837c300039dd3cf8989a55d336d3 Mon Sep 17 00:00:00 2001 From: takurinton Date: Wed, 20 Mar 2024 07:30:02 +0900 Subject: [PATCH 7/9] Refactor iso (#197) * refactor * fix --- preact-iso/src/prerender.d.ts | 5 ++--- preact-iso/src/prerender.js | 18 +++--------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/preact-iso/src/prerender.d.ts b/preact-iso/src/prerender.d.ts index 4e96733..2475644 100644 --- a/preact-iso/src/prerender.d.ts +++ b/preact-iso/src/prerender.d.ts @@ -1,13 +1,12 @@ -import { VNode } from 'preact'; +import { VNode } from "preact"; export interface PrerenderOptions { - maxDepth?: number; props?: Record; } export interface PrerenderResult { html: string; - links?: Set + links?: Set; } export default function prerender( diff --git a/preact-iso/src/prerender.js b/preact-iso/src/prerender.js index a202acd..f36318b 100644 --- a/preact-iso/src/prerender.js +++ b/preact-iso/src/prerender.js @@ -12,15 +12,12 @@ options.vnode = (vnode) => { /** * @param {ReturnType} vnode The root JSX element to render (eg: ``) * @param {object} [options] - * @param {number} [options.maxDepth = 10] The maximum number of nested asynchronous operations to wait for before flushing * @param {object} [options.props] Additional props to merge into the root JSX element */ export default async function prerender(vnode, options) { options = options || {}; - const maxDepth = options.maxDepth || 10; const props = options.props; - let tries = 0; if (typeof vnode === "function") { vnode = h(vnode, props); @@ -28,16 +25,6 @@ export default async function prerender(vnode, options) { vnode = cloneElement(vnode, props); } - const render = () => { - if (++tries > maxDepth) return; - try { - return renderToStringAsync(vnode); - } catch (e) { - if (e && e.then) return e.then(render); - throw e; - } - }; - let links = new Set(); vnodeHook = ({ type, props }) => { if ( @@ -51,8 +38,9 @@ export default async function prerender(vnode, options) { }; try { - let html = await render(); - html += ``; + const html = `${await renderToStringAsync( + vnode + )}`; return { html, links }; } finally { vnodeHook = null; From f89fef4b6678fd249aedaeae33dfe7db5e69b1cd Mon Sep 17 00:00:00 2001 From: takurinton Date: Wed, 20 Mar 2024 07:30:51 +0900 Subject: [PATCH 8/9] remove deplicate post --- public/contents/58.md | 919 ------------------------------------- public/contents/posts.json | 273 ++++++++++- 2 files changed, 272 insertions(+), 920 deletions(-) delete mode 100644 public/contents/58.md diff --git a/public/contents/58.md b/public/contents/58.md deleted file mode 100644 index b1e3cef..0000000 --- a/public/contents/58.md +++ /dev/null @@ -1,919 +0,0 @@ ---- -id: 58 -title: GraphQL入門 -description: GraphQL入門 について -created_at: 2021-05-17 ---- - -# はじめに - -こんにちは、僕です。 - -この記事は [技術メモ](https://dev.takurinton.com/tech/graphql) にまとめたものの総括みたいな感じです。 - -ということでGraphQL に入門したのでまとめます。 -ここでは Query と Mutation については触れますが Subscription については触れません。(これで入門したとか言うな) -一応 Subscription については後日追記予定です。 -手を動かした時間で言うと10時間もないのでそこまで深くやっているわけではありません。 -一旦ここにまとめてから深めて行きたいなと思っています。 - - -## 勉強するときに参考にしたサイトなど - -概念のお勉強は書籍を使った方がいいと思ってる人間なのですが、今回はネット上のものだけを拾いながら勉強しました(辛い) -参考にしたサイトはいかです。あとは手を動かして頑張りました。 - -- [GraphQLに入門する - Qiita](https://qiita.com/jintz/items/c9105dca1725224d36a8) -- [GraphQL入門 - Zenn](https://zenn.dev/yoshii0110/articles/2233e32d276551) -- [graphql-go/graphql](https://github.com/graphql-go/graphql) - - [expamles](https://github.com/graphql-go/graphql/tree/master/examples) - -ここら辺を参考にしました。 -最初は何言ってるかわからなかったのでちょこちょこ行ったり来たりしながらやりました。辛かった〜〜。 - - -## 基本的なところ -まず導入としてここがよくわかりませんでした。 -GraphQL にはどうやら `Query` と `Mutation` というものがあるということで何してるかわからなかったです。ここに一番時間使った気がします。 - -- 共通の考え方 - - 基本的には POST リクエストの body に情報を持たせることが多いらしい - - GET のクエリパラメータとして情報を持たせることもできる -- Query - - 情報を取得する際に使用する -- Mutation - - 情報を送る際に取得する - -こんな感じです。 -基本的にはこれだけでいいと思います。あとはやって覚えたほうが早い気がする。 - -## リクエストを送る形式について - -次にリクエストを送る形式についてを説明します。 -GraphQL は REST とはだいぶ異なる形でリクエストを送ります。 -REST では完全に JSON という形でしたが GraphQL ではそうではありません。 - - -まず Query と Mutation の場合で書き方が違います(ほぼ同じだけど) -ここではわかりやすいように以下のようなシンプルな JSON を使用して説明をしたいと思います。 - -```json -[ - { - "id": 1, - "name": "takurinton" - }, - { - "id": 2, - "name": "hoge" - }, - { - "id": 3, - "name": "fuga" - } -] -``` - -### 共通のこと - -上で GraphQL は GET でも POST でもリクエストを送信できるという話をしました。 -イメージとしては、GET リクエストの場合はクエリパラメータとして、POST リクエストの場合は body として持たせてあげる感じです。 -REST の思想が強めの人はここで GET は取得、POST は作成という概念を消してください。(もっと言うと PUT, PATCH, DELETE のことも忘れてください) -また、基本的にはエンドポイントは1つです、それも頭に入れておくと良きかもしれません。 - - -以下でちょこちょこ出てくる `なんとかUser` というのはアプリケーション側で任意の名前をつけることができるものです。 - -  -### Query の場合 - -Query の場合は以下のような書き方をします。 -まずは先ほどの JSON の内容を全て取得したいと思います。 - -GET リクエストの場合は以下のような形で投げることができます。 - -```bash -curl -g http://localhost:8888/graphql?query={getUsers{id,name}} -``` - -次に POST リクエストの場合は以下のような形で投げることができます。 - -```bash -curl -X POST -H "Content-Type: application/json" --data '{ query { getUsers { id name } } }' http://localhost:8888/graphql -``` - -GET でも POST でもやってることは同じで、レスポンスは上の JSON が返ってきます。 - - -また、id が1のユーザーを取得するなどといった、可変の値を渡すこともできます。以下の POST リクエストのような形で渡してあげることができます。 - -```bash -curl -X POST -H "Content-Type: application/json" --data '{ "query": " getUser(id:\"1\") { id name } " }' http://localhost:8888/graphql -``` - -これはアプリケーション側で `getUser` は引数を取るよということを明示的に定める必要があります。 -このような形で値を渡すこともできます。 - - -### Mutation の場合 - -Mutation は更新系の処理をしたい場合に使用します。 -REST でいう GET 以外の部分がここに含まれると思ってください。 - -POST でリクエストを送ってみたいと思います。 -以下の例は先ほどの JSON に値を追加したい時に送る Mutation です。 - -```bash -curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation { createUser(id:4, name:\"hogehoge\") { id name } }" }' http://localhost:8888/graphql -``` - -登録したい内容を送信しないといけないので先ほど同様、可変の値を投げる必要があります。もしこれが DB アクセスをするような場合だと `id` はオートインクリメントになりそうだからいらないなあとか考えますね。 -GraphQL の基本的な形式はこのような形です。 - -コードがないとわからないよという人は [GraphQL に入門した(Go)](https://dev.takurinton.com/tech/graphql/base_server_go) を見てください。 - - -## レスポンスの形式 - -レスポンスの形式は返ってくる値は JSON ですが REST とは若干異なります。 -GraphQL のレスポンスの形式は以下のようになります。 - -```json -{ - "data":{"任意の名前":{"key":"value",...}, - "errors": [ ... ]} -``` - -`data` はうまく行った時のレスポンスの値、`errors` は何かしらのミスがあったときにエラーを格納します。 - -例として、上の全件取得(Query)の場合のレスポンスは以下のようになります。 - -```json -{"data":{"getUsers":[{"id":1, "name": "takurinton"},{"id":2, "name": "hoge"},{"id":3, "name": "fuga"}]} -``` - -一番外側に `data` がついていて、任意の名前でラッピングされてるだけと思ったらそこまで難しくなく、普通の JSON じゃんと思うかもしれません。そうです。返ってくるのは JSON です。   -あまり難しいことはしていないことがわかります。 - -エラーの場合も同様に `errors` が返ってきます。例えば `query` か `mutation` かを明示的に定めないでリクエストを投げると以下のようなエラーが得られます。 - -```json -{"data":null,"errors":[{"message":"Must provide an operation.","locations":[]}]} -``` - -エラーの中にはメッセージが格納されていて、何が悪いのかを教えてくれます。 -REST だと自分で丸めてた部分をやってくれてる感じです。便利。 - -## GET と POST の違い - -上で GraphQL は GET と POST が使用できるという話をしましたが、これらの違いはなんなのでしょうか? -[APOLLO DOCS POST and GET format](https://www.apollographql.com/docs/apollo-server/requests/) で触れられています。そもそもの形式が違うらしいです。 -また、GET を使う場合は URL をキャッシュしたいときなどに使用できるかもしれないなあなどと思いました。あまり詳しくないのでここらへん有識者の方アドバイスお願いします。 - - -## application/json と application/graphql の違い - -GraphQL でのやりとりは JSON を使用しているので HTTP header の `Content-Type` には `application/json` を使用します。しかし、どうやら `application/graphql` が使用できるらしいです。 -これは [iana.org の Media Types](https://www.iana.org/assignments/media-types/media-types.xhtml) で確認することができますが、`application/graphql` は含まれていません。つまりこれは標準ではなく GraphQL 独自の仕様ということがわかります。 -使い分けとしては、[GraphQL のドキュメント](https://graphql.org/learn/serving-over-http/) で触れられています。 - -> If the "application/graphql" Content-Type header is present, treat the HTTP POST body contents as the GraphQL query string. - -とのことなので、body を勝手に GraphQL として扱ってくれるみたいです。意図しない挙動を防ぐためにここら辺は理解したみがあります。 - -# preact でフロントエンドを書いてみる - -最終的なコードは以下のようになります。 - -- [repo](https://github.com/takurinton/graphql_suburi) -- [ここで触れる preact のコード](https://github.com/takurinton/graphql_suburi/tree/main/frontend) -- 使用ライブラリ - - [preact](https://github.com/preactjs/preact) - - [vite](https://github.com/vitejs/vite) - - [@urql/preact](https://github.com/FormidableLabs/urql) - - [graphql](https://github.com/graphql/graphql-js) - - -ディレクトリ構成としては以下のようになっています。 - -- src - - pages - - ページコンポーネントが入っている - - querys - - query が入っている - - mutation は未実装 - - router - - 自作のルーターが入っている - - preact-router と同じ動きをする - - App.jsx - - ルーターを呼び出してる - - main.jsx - - render する場所 -- vite.config.js - - vite でバンドルする設定ファイル -- index.html - - エントリポイント - - -## 実装するもの - -簡単な TODO リストを実装してみたいと思います。 -フロントエンドは取得だけをします。ごめんなさい。あとで投稿もできるようにするので。(今の段階で TODO リストと呼べるのか怪しい) -データの形式は以下のような形になっています。 (サーバサイドから引用) - - -```sql -MariaDB > show columns from todo; -+------------+---------------+------+-----+---------------------+----------------+ -| Field | Type | Null | Key | Default | Extra | -+------------+---------------+------+-----+---------------------+----------------+ -| id | int(11) | NO | PRI | NULL | auto_increment | -| title | varchar(127) | YES | | NULL | | -| content | varchar(1023) | YES | | NULL | | -| is_active | tinyint(1) | NO | | 1 | | -| created_at | timestamp | NO | | current_timestamp() | | -| updated_at | timestamp | NO | | current_timestamp() | | -+------------+---------------+------+-----+---------------------+----------------+ -6 rows in set (0.001 sec) -``` - -## Query を定義する - -まずはフロントエンドからリクエストを投げる際に使用する query を定義します。 -`PostQuery` では `Int` 型の引数を受け取るようにしています。 - -```jsx -// querys/querys.js - -export const PostQuery = ` -query PostQuery($id: Int){ - post (id: $id){ - id - title - content - is_active - created_at - } -} -` -export const PostsQuery = ` -query PostsQuery { - posts { - id - title - content - is_active - created_at - } -} -` -``` - -## ページを作成する - -本質ではないので基本的な構成などはコードから理解してください。ここでは `Posts.jsx`、`Post.jsx` についてのみ説明します。 - -### TODO 一覧を取得する -TODO の一覧を取得するためには query の定義が必要です。ということで先ほど定義した query を使用して書いていきます。 - -```jsx -const { data, fetching, error } = result -if (fetching) return

    Loading...

    -if (error) return

    Oh no... {error.message}

    -``` - -この部分ですが、ドキュメントに記載があった通りに実装しました。一般的な書き方がわからないので有識者の方教えてください。 - -全体は以下のようになります。 -あまり難しことはしていないので react の hook がわかれば問題ないと言った感じです。 - -```jsx -// pages/Posts.jsx - -import { Link } from '../router/prefetch'; -import { PostsQuery } from '../querys/querys'; -import { useQuery } from '@urql/preact'; - -import { Post } from './Post'; - -export const Posts = () => { - const [result] = useQuery({ - query: PostsQuery, - }); - - const { data, fetching, error } = result - if (fetching) return

    Loading...

    - if (error) return

    Oh no... {error.message}

    - - return ( - <> -

    All Posts

    - { - data.posts.map(post => - - { post.title } - - ) - } - - ) -} -``` -### TODO を取得する - -TODO の一覧を取得する際は以下のような形になります。 -この部分で引数を渡すことができます。これはライブラリの使用ではなく GeaphQL の仕様です。覚えておくようにしましょう。 - -```jsx -const [result] = useQuery({ - query: PostQuery, - variables: { id }, -}); -``` - -全体のコードは以下のような形になります。 - -```jsx -// pages/Post.jsx - -import { PostQuery } from '../querys/querys'; -import { useQuery } from '@urql/preact'; - -export const Post = ({ id }) => { - const [result] = useQuery({ - query: PostQuery, - variables: { id }, - }); - - const { data, fetching, error } = result - if (fetching) return

    Loading...

    - if (error) return

    Oh no... {error.message}

    - - return ( - <> -

    title: { data.post.title }

    - - ) -} -``` - -# Go でサーバサイドを書いてみる - -最終的なコードは以下のようになります。 - -- [repo](https://github.com/takurinton/graphql_suburi) -- [ここで触れる Go のコード](https://github.com/takurinton/graphql_suburi/tree/main/backend) -- 使用ライブラリ - - [gorm](https://github.com/jinzhu/gorm) - - [graphql-go/graphql](https://github.com/graphql-go/graphql) - - [mysql](https://github.com/go-sql-driver/mysql) - - -ディレクトリ構成としては以下のようになっています。 - -- db - - データベース接続用の関数が入っている -- model - - struct が入っている -- repository - - データベースアクセスをするための関数が入っている -- schema - - GraphQL のスキーマが定義されている - - Query も Mutation も同じ -- main.go - - 実行 - -## 実装するもの - -簡単な TODO リストを実装してみたいと思います。 -データの形式は以下のような形になっています。 - -```sql -MariaDB > show columns from todo; -+------------+---------------+------+-----+---------------------+----------------+ -| Field | Type | Null | Key | Default | Extra | -+------------+---------------+------+-----+---------------------+----------------+ -| id | int(11) | NO | PRI | NULL | auto_increment | -| title | varchar(127) | YES | | NULL | | -| content | varchar(1023) | YES | | NULL | | -| is_active | tinyint(1) | NO | | 1 | | -| created_at | timestamp | NO | | current_timestamp() | | -| updated_at | timestamp | NO | | current_timestamp() | | -+------------+---------------+------+-----+---------------------+----------------+ -6 rows in set (0.001 sec) -``` - -## データベースとの接続 - -まずはローカルに DB を作っているのでそれと接続する関数を定義します。 -DB は彼女の名前に近いので MariaDB を使用しています。 -この関数をデータベースとやりとりするたびに呼び出すという感じです。 - -```go -// db/init.go - -package db - -import ( - "os" - - _ "github.com/go-sql-driver/mysql" - "github.com/jinzhu/gorm" -) - -func DBConn() (*gorm.DB, error) { - DBMS := "mysql" // mariadb - HOSTNAME := os.Getenv("HOSTNAME") - USERNAME := os.Getenv("USERNAME") - DBNAME := os.Getenv("DB_NAME") - PASSWORD := os.Getenv("PASSWORD") - PORT := os.Getenv("PORT") - - CONNECT := USERNAME + ":" + PASSWORD + "@(" + HOSTNAME + ":" + PORT + ")/" + DBNAME + "?parseTime=true" - db, err := gorm.Open(DBMS, CONNECT) - if err != nil { - return nil, err - } - - return db, nil -} -``` - -## Query を定義する - -次に Query を定義します。 -Query を定義するためにまずは型を定義します。 -当然ですが型はデータベースの型と合わせましょう。 - -```go -// schema/schema.go - -var TodoType = graphql.NewObject(graphql.ObjectConfig{ - Name: "Todo", - Fields: graphql.Fields{ - "id": &graphql.Field{ - Type: graphql.Int, - }, - "title": &graphql.Field{ - Type: graphql.String, - }, - "content": &graphql.Field{ - Type: graphql.String, - }, - "is_active": &graphql.Field{ - Type: graphql.Boolean, - }, - "created_at": &graphql.Field{ - Type: graphql.DateTime, - }, - "updated_at": &graphql.Field{ - Type: graphql.DateTime, - }, - }, -}) -``` - -次にフィールドを定義します。フィールドは上の型を使って TODO を全件取得するものと id に紐づく TODO を取得するものの2パターン作成します。 -`TodoFields` では特定の id に紐づく TODO を1つ使用します。 -`Args` を使用すると引数を受け取ることができます。 -`Resolve` はその後の処理を定義することができます。また、`Resolve` は GraphQL のレスポンスにもなります。 - -`TodosFields` は `TodoFields` よりもいくらかシンプルです。 -`Resolve` の中で全件取得するようの関数を呼び出してそのまま戻り値としています。 - - -```go -// schema/schema.go - -var TodoFields = &graphql.Field{ - Type: TodoType, - Description: "get post detail", - Args: graphql.FieldConfigArgument{ - "id": &graphql.ArgumentConfig{ - Type: graphql.Int, - }, - }, - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - id, ok := p.Args["id"].(int) - if ok { - post, err := repository.GetTodo(id) - if err != nil { - return model.Todo{}, nil - } - return post, nil - } - return model.Todo{}, nil - }, -} - -var TodosFields = &graphql.Field{ - Type: graphql.NewList(TodoType), - Description: "get all post", - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - return repository.GetTodos(), nil - }, -} -``` - -## Mutation を定義する - -Mutation も同様に定義することができます。 -型は先ほどと同様に定義することができるため、フィールドのみの実装となります。 -とは言ってもやってることは変わらないのでそこまで難しくないのかなと思います。 -TODO を作成するための `CreateTodoFields` と更新するための `UpdateTodoFields` の2つを定義します。 - -`CreateTodoFields`、`UpdateTodoFields` 共に先ほどと同様 `Args` で引数を取得します。 - - -```go -// schema/schema.go - -var CreateTodoFields = &graphql.Field{ - Type: TodoType, - Description: "Create new todo", - Args: graphql.FieldConfigArgument{ - "title": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.String), - }, - "content": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.String), - }, - "is_active": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.Boolean), - }, - }, - Resolve: func(params graphql.ResolveParams) (interface{}, error) { - title, _ := params.Args["title"].(string) - content, _ := params.Args["content"].(string) - isActive, _ := params.Args["is_active"].(bool) - - _newTodo := model.Todo{ - Title: title, - Content: content, - IsActive: isActive, - } - - newTodo, err := repository.CreateTodo(_newTodo) - if err != nil { - fmt.Println("create data faild") - } - - return newTodo, nil - }, -} - -var UpdateTodoFields = &graphql.Field{ - Type: TodoType, - Description: "Create new todo", - Args: graphql.FieldConfigArgument{ - "id": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.Int), - }, - "title": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.String), - }, - "content": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.String), - }, - "is_active": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.Boolean), - }, - }, - Resolve: func(params graphql.ResolveParams) (interface{}, error) { - id := int64(params.Args["id"].(int)) // ちょっと汚い - title, _ := params.Args["title"].(string) - content, _ := params.Args["content"].(string) - isActive, _ := params.Args["is_active"].(bool) - - _updateTodo := model.Todo{ - Id: id, - Title: title, - Content: content, - IsActive: isActive, - } - - updateTodo, err := repository.UpdateTodo(_updateTodo) - if err != nil { - fmt.Println("update data faild") - } - - return updateTodo, nil - }, -} -``` - -## Schema の定義  - -最後にこれらを1つの Schema として定義します。 -先ほど一生懸命定義した関数を当てはめるだけです、簡単です。 - -```go -// schema/schema.go - -var Schema = graphql.SchemaConfig{ - Query: graphql.NewObject( - graphql.ObjectConfig{ - Name: "TodoQuery", - Fields: graphql.Fields{ - "getTodo": TodoFields, - "getTodos": TodosFields, - }, - }, - ), - Mutation: graphql.NewObject( - graphql.ObjectConfig{ - Name: "TodoMutation", - Fields: graphql.Fields{ - "createTodo": CreateTodoFields, - "updateTodo": UpdateTodoFields, - }, - }, - ), -} -``` - -最後に `schema.go` で実装した内容をまとめると以下のようになります。 - -```go -// schema/schema.go - -package schema - -import ( - "fmt" - "graphql_suburi/backend/model" - "graphql_suburi/backend/repository" - - "github.com/graphql-go/graphql" -) - -var TodoType = graphql.NewObject(graphql.ObjectConfig{ - Name: "Post", - Fields: graphql.Fields{ - "id": &graphql.Field{ - Type: graphql.Int, - }, - "title": &graphql.Field{ - Type: graphql.String, - }, - "content": &graphql.Field{ - Type: graphql.String, - }, - "is_active": &graphql.Field{ - Type: graphql.Boolean, - }, - "created_at": &graphql.Field{ - Type: graphql.DateTime, - }, - "updated_at": &graphql.Field{ - Type: graphql.DateTime, - }, - }, -}) - -var TodoFields = &graphql.Field{ - Type: TodoType, - Description: "get post detail", - Args: graphql.FieldConfigArgument{ - "id": &graphql.ArgumentConfig{ - Type: graphql.Int, - }, - }, - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - id, ok := p.Args["id"].(int) - if ok { - post, err := repository.GetTodo(id) - if err != nil { - return model.Todo{}, nil - } - return post, nil - } - return model.Todo{}, nil - }, -} - -var TodosFields = &graphql.Field{ - Type: graphql.NewList(TodoType), - Description: "get all post", - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - return repository.GetTodos(), nil - }, -} - -var CreateTodoFields = &graphql.Field{ - Type: TodoType, - Description: "Create new todo", - Args: graphql.FieldConfigArgument{ - "title": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.String), - }, - "content": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.String), - }, - "is_active": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.Boolean), - }, - }, - Resolve: func(params graphql.ResolveParams) (interface{}, error) { - - title, _ := params.Args["title"].(string) - content, _ := params.Args["content"].(string) - isActive, _ := params.Args["is_active"].(bool) - - _newTodo := model.Todo{ - Title: title, - Content: content, - IsActive: isActive, - } - - newTodo, err := repository.CreateTodo(_newTodo) - if err != nil { - fmt.Println("create data faild") - } - - return newTodo, nil - }, -} - -var UpdateTodoFields = &graphql.Field{ - Type: TodoType, - Description: "Create new todo", - Args: graphql.FieldConfigArgument{ - "id": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.Int), - }, - "title": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.String), - }, - "content": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.String), - }, - "is_active": &graphql.ArgumentConfig{ - Type: graphql.NewNonNull(graphql.Boolean), - }, - }, - Resolve: func(params graphql.ResolveParams) (interface{}, error) { - id := int64(params.Args["id"].(int)) // ちょっと汚い - title, _ := params.Args["title"].(string) - content, _ := params.Args["content"].(string) - isActive, _ := params.Args["is_active"].(bool) - - _updateTodo := model.Todo{ - Id: id, - Title: title, - Content: content, - IsActive: isActive, - } - - updateTodo, err := repository.UpdateTodo(_updateTodo) - if err != nil { - fmt.Println("update data faild") - } - - return updateTodo, nil - }, -} - -var Schema = graphql.SchemaConfig{ - Query: graphql.NewObject( - graphql.ObjectConfig{ - Name: "TodoQuery", - Fields: graphql.Fields{ - "getTodo": TodoFields, - "getTodos": TodosFields, - }, - }, - ), - Mutation: graphql.NewObject( - graphql.ObjectConfig{ - Name: "TodoMutation", - Fields: graphql.Fields{ - "createTodo": CreateTodoFields, - "updateTodo": UpdateTodoFields, - }, - }, - ), -} -``` - -## 呼び出す - -ここまで定義したきたのであとは呼び出すだけです。 -main.go で `net/http` を使用してサーバを立ち上げ動作確認をしましょう。 -25行目ではバリデーションをかけています。ここでリクエストの形式が違ったり不正があったりしたら弾き、CORS エラーになるようにしています。 -また、35行目からの `graphql.Do()` で GraphQL を実行しています。 - -```go -// main.go - -package main - -import ( - "encoding/json" - "fmt" - "graphql_suburi/backend/model" - "graphql_suburi/backend/schema" - "log" - "net/http" - - _ "github.com/go-sql-driver/mysql" - "github.com/graphql-go/graphql" -) - -func main() { - http.HandleFunc("/graphql", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Access-Control-Allow-Headers", "*") - w.Header().Set("Access-Control-Allow-Origin", "*") - w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") - - var p model.PostData - if r.Method == "OPTIONS" { - } else if err := json.NewDecoder(r.Body).Decode(&p); err != nil { - w.WriteHeader(400) - return - } - - schema, err := graphql.NewSchema(schema.Schema) - if err != nil { - log.Fatalf("failed to get schema, error: %v", err) - } - - result := graphql.Do(graphql.Params{ - Context: r.Context(), - Schema: schema, - RequestString: p.Query, - VariableValues: p.Variables, - OperationName: p.Operation, - }) - - if err := json.NewEncoder(w).Encode(result); err != nil { - fmt.Printf("could not write result to response: %s", err) - } - }) - - fmt.Println("listening on :8888 ...") - if err := http.ListenAndServe(":8888", nil); err != nil { - log.Fatalln(err) - } -} -``` - -## 動作確認 - -動作確認をします。curl でリクエストを投げたいと思います。 - -### TODO を全件取得 - -リクエスト -```bash -curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ getTodos { id title content } }" }' http://localhost:8888/graphql -``` - - -レスポンス -```json -{"data":{"getTodos":[{"content":"hoge","id":1,"title":"takumi"},{"content":"marinyan","id":2,"title":"marina"},{"content":"takurinton","id":3,"title":"test3"}]}} -``` - -### id が 1 の TODO を取得 - -リクエスト -```bash -curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ getTodo(id:1) { id title content } }" }' http://localhost:8888/graphql -``` - -レスポンス -```json -{"data":{"getTodo":{"content":"hoge","id":1,"title":"takumi"}}} -``` - -### TODO を作成する - -リクエスト -```bash -curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation { createTodo(title:\"takurinton\",content:\"wakuwakuwakuwaku\",is_active:true) { id title content is_active created_at } }" }' http://localhost:8888/graphql -``` - -レスポンス -```json -{"data":{"createTodo":{"content":"wakuwakuwakuwaku","created_at":"2021-04-15T12:57:22.5392956Z","id":4,"is_active":true,"title":"takurinton"}}} -``` - -### id が 1 の TODO を更新 - -リクエスト -```bash -curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation { updateTodo(id:1,title:\"takumi katayama\",content:\"hoge\",is_active:false) { id title content is_active created_at } }" }' http://localhost:8888/graphql -``` - -レスポンス -```json -{"data":{"updateTodo":{"content":"hoge","created_at":"0001-01-01T00:00:00Z","id":1,"is_active":false,"title":"takumi katayama"}}} -``` - -このような形でそれぞれのメソッドがしっかり動いてることを確認することができました。めでたしめでたし。 - -## まとめ - -リクエストやレスポンスに型を持たせることができるのは非常に体験が良くなるなと感じました。 -ただ、自分の中でまだまだ良さに気づけていない部分や深めなければいけない部分、ベストプラクティス、一般的な書き方についての理解が足りていないのでもっと頑張ってやっていきたいと思います。 diff --git a/public/contents/posts.json b/public/contents/posts.json index d64590b..96136a6 100644 --- a/public/contents/posts.json +++ b/public/contents/posts.json @@ -1 +1,272 @@ -[{"id":"5","title":"OngaqJS触ってみた","description":"はじめに こんにちは ポートフォリオ(おふざけ入ってるあれです)にリンク貼ってあるOngaqJSについてのソースコードをまとめてみたので記事にしました。 #OngaqJSとはなんぞや? OngaqJSとは、JavaScriptで音楽が作成できるというAPIです。 Keyの取得はこちらから 有料枠と無料枠があり、使える楽器の種類などが異なる模様(有料会員になろうかな) ぽちぽちしていけば簡単に登録で...","created_at":"2020-04-24"},{"id":"9","title":"ブログを引っ越した話","description":"はじめに こんにちは。疲れた。 てことで今回は僕がはじめてAWSを使ったときに詰まったところについてまとめたいと思います!!! また、この記事はQiitaにも全く同じことが書いてありますので、見やすい方がいいなと思ったら素直にQiitaに言ってください。 URLはこちらです 僕のレベル AWSって何???? まず最初に言っておきますが、私はこのレベルの人間です。AWSって言葉は知ってるけど中身は知...","created_at":"2020-06-10"},{"id":"12","title":"サポーターズの1on1面談に参加した話","description":"こんにちは こんばんは、先日サポーターズの1on1面談イベントに参加したので記事にしたいと思います。 簡単にまとめると、とっても楽しかったし充実した時間になったけど、その分周りのエンジニア志望の学生との差を痛感してとても刺激がもらえたイベントでした!!!! 1on1面談イベントってなんだよって思った方はこちらのリンクを参照してみてください。 #事前に準備したこと このイベントは、各ターンの最初に学...","created_at":"2020-06-11"},{"id":"17","title":"Treasureに参加した話","description":"はじめに こんにちは。僕です。 以前の記事にも書きましたが、VOYAGE GROUPのTreasureというインターンに参加したのでまとめたいと思います。 結論から言うと最高のインターンでした!!(迷惑かけてばっかりだったけど) 来年以降インターンシップに行きたいと思ってる人はぜひTreasureにも申し込んでみてください! そもそもTreasureってなんだ TreasureとはVOYAGE G...","created_at":"2020-09-02"},{"id":"18","title":"サイバーエージェントのインターンに参加した話","description":"こんにちは どうも、僕です。 今回はサイバーエージェントの就業型インターンに参加して、Ameba事業本部という部署で少しだけコード書かせてもらったのでそのことについて記事にしたいと思います。 参加した経緯 これは遡ること2月、、、 僕が某企業のアドテクのインターンに参加して、楽しかったことを大学の先輩のYさんに報告しました。 僕「この前アドテクのインターンに参加して、DSP周りのコードを簡単に...","created_at":"2020-09-13"},{"id":"19","title":"楽天のインターンに参加した話","description":"こんにちは どうも、僕です。今回は夏の締めくくりに参加した楽天のインターンについて書きたいと思います。楽天のインターンはここまでのインターンの中で一番辛かったような気がします(言語的な問題)海外で仕事できる気がしませんでした。そんな感じでまとめていきます。 選考 インターンには選考がつきものです。選考内容はコーディングテストと面接で、両方とも1日で終わらせます。参加者全員。 コーディングテストはc...","created_at":"2020-09-25"},{"id":"21","title":"Skywayでビデオ通話","description":"はじめに こんにちは、ブログに MaterialUIを導入してルンルンの僕です。今回はSkyWayで1対1の音声通話、またそれを文字起こしをしてGASに投げる処理までを書いたのでまとめたいと思います。GitHub Pages でデプロイしたサイトはこちらになります。レポジトリはこちらになります。 SkyWayって何? SkyWayとは、Webでリアルタイムコミュニケーションを実現する標準技術、We...","created_at":"2020-10-09"},{"id":"23","title":"Django + RDS","description":"こんにちは どうも、僕です。今回はAWSのEC2にデプロイしたDjangoのプロジェクトをRDSに接続する方法について書きたいと思います。Djangoを理解してればとても簡単。困ることなんてありません。ではいきます。 バックアップを取る DjangoではデフォルトのDBとしてプロジェクトを作成したときにsqlite3のテーブルがついてきます。しかし、RDSに乗り換えるときにはsqlite3のデータ...","created_at":"2020-10-15"},{"id":"26","title":"easyjsonを使ってみた","description":"こんにちは どうも、僕です。この記事は随分前のインターン期間中に自分のために書いた記事を転載してます。 GoでJSON使う時ってだいぶめんどくさいんですよね。まあ型による安心感がバケモンなのでやった方がいいんですけど。 GoでJSONを捌く時はstructを使用します。クラスとかはないのでこれでいきます。  Unmarshal 早速やってみます。 例えばこんな感じのjsonがくるとします。 v...","created_at":"2020-10-21"},{"id":"29","title":"4日間でポートフォリオを作り替えた","description":"こんにちは どうもこんにちは。僕です。最近あったことといえば、Vのインターン落ちて落ち込んでるところに人事の方からのなぐさめのDMがきてさらに泣きそうになったところでRからの内定もらってなんだかメンタルが忙しいことです。 今回は僕がポートフォリオを作り替えた話(需要あるのか?)について話していこうと思います。 なんで作り替えたの? まずここから作り替えた理由としては3つあります。 Nex...","created_at":"2020-11-14"},{"id":"30","title":"Goのdeferに注意する","description":"はじめに 今日開発してて遭遇したエラーについて話します。短めです。よろしくお願いします。 状況 GoでAPIサーバを開発してる時に、エラーハンドリングについての実装をしていた。現状の問題としては、DBと接続する時にアプリケーションサーバ(NginxやらGolangやら)が生きてる状態でDBサーバ(今で言うRDS)が死んでる時にDBのIPアドレスとポートがクライアント側に渡されてしまうという問題が起...","created_at":"2020-11-15"},{"id":"31","title":"DjangoでUser認証機能を作る","description":"こんにちは これですどうも、僕です。この記事はKITアドベントカレンダーの4日目の記事になります。今回はユーザー認証の機能を実装してみようと思います。 やり方 Djangoではデフォルトでユーザーモデルが定義されています。今回はそれを書き換えることでユーザー認証の仕組みを作成して行こうと思います。最近だと外部の認証に任せるパターンも増えていますが、こっちの方が楽だと感じることもちょこちょこある...","created_at":"2020-12-04"},{"id":"33","title":"pyparsing触ってみた","description":"こんにちは こんにちは、僕です。最近、pyparsingというPythonのライブラリを使用していて、面白いなあと思ったので記事にしてみました。元々自分は言語解析などに興味があって(NLPとか)、今回は形式言語解析になりますがまとめたいと思います。 pyparsingとは? これです。ドキュメント The pyparsing module is an alternative approach ...","created_at":"2020-11-24"},{"id":"34","title":"DRFのViewについてまとめる","description":"こんにちは どうも、こんにちは、僕です。今日はDRFのなんちゃらAPIViewについてまとめたいと思います。自分の推しはAPIViewです。対戦お願いします! DRFとは? そんなもんは自分で調べてください(辛辣) 参考までにこれは前回の記事でさらっと書いてしまったAPIView周りの深堀りみたいなイメージで描いていきます。 今回使うモデル 今回使うモデルはとてもシンプルで、以下のよう...","created_at":"2020-11-27"},{"id":"35","title":"asgiを触ってみた","description":"こんにちは どうも、僕です。今回はDjangoでasgiを使用してみたということでチュートリアルを自分なりにまとめたいと思います。最近のブログ暇つぶしみたいな感じだったので今回は久しぶりに新しい技術に触れたアウトプット感があって良きです。浅い asgiって何? まず最初にasgiについて説明したいと思います。そもそもPythonで鯖を立てるためにはwsgiとasgiの2種類があります。 ws...","created_at":"2020-11-27"},{"id":"36","title":"asgiを触ってみたつづき","description":"どうも こんにちは、僕です。今回は前回の記事の続きを書いていきたいと思います。まだまだリファクタリングしないといけないのですが、現状動くものをのせる的な感じで。 前回なにしたか 前回はぽよりました。(適当)まあ、簡単にソケットでチャットを作りましょうみたいなことをしました。 今回はなにするか そこに今回はユーザーを定義してさらにチャットを保存していくみたいな実装をしました。簡単な実装しかしてい...","created_at":"2020-11-30"},{"id":"38","title":"Goの名前付き戻り値","description":"こんにちは どうも僕です。この記事はKITアドベントカレンダー11日目の記事になります。今回はGolangの名前付き戻り値について簡単にまとめてみました。 そもそも名前付き戻り値って何? まずこれですよね、僕も最初はわからんってなってましたし、今もよくわかってないです。簡単にいうと、戻り値に名前をつけておくことができます。比較は以下のコードで。 // 通常の関数 func nomalFun...","created_at":"2020-12-11"},{"id":"40","title":"フロントエンドの今","description":"こんにちは どうも、僕です。今日はフロントエンドについて書いて行こうと思います。(抽象的〜〜〜) 僕はフロントエンドの人間ではないのであまり詳しくはないのですが、そんな僕でも知っていることや最低限意識していることなどを簡単にですがまとめていきたいと思います。 最近のフロントエンド 最近はフロントエンドの進化が早く、バックエンド側まで侵食しかけている印象を受けます。SPAとはみたいなことを思うよ...","created_at":"2020-12-15"},{"id":"42","title":"2020年振り返り","description":"こんにちは どうも,僕です.これを書いているときはクリスマスで,TLのみんなはコード書いてるんだろうなって思いながら書いてます.今年一年,某病気にほぼ潰されてしまいましたが,個人的には充実した1年間になったと感じています.インターン,就職活動,技術的な成長,その他もろもろ人生の分岐点となるようなことが多かった気がします.それを割と雑に振り返っていきたいと思います. 2020年という年 今年は大...","created_at":"2020-12-25"},{"id":"49","title":"JWTについて学ぶ","description":"はじめに どうも,僕です.今日はGolangでJWTを実装したけどちょっとつまづいたことが多かったので記事にしたいと思います.これ実装したのだいぶ前なので思い出しながら頑張っていこうと思います. JWTについて そもそもJWTとはなんなのかについて簡単におさらいをしておきたいと思います.JWTとは,JSON Web Tokenの略で属性情報(Claim)をJSONの中に丸め込むことで個人を識別...","created_at":"2021-01-11"},{"id":"56","title":"マルコフ連鎖実装してみた","description":"こんにちは どうも,僕です.今回はみんな大好きマルコフ連鎖についてです.コードはこれ.与えられた文章をもとにして新しい文章を生成するやつを実装しました.ではやっていきます. マルコフ連鎖って何? マルコフ連鎖とはどうやら離散マルコフ過程の別称のようです.知らんかった.Twitterで見かけてググってみたら出てきてほへーってなりました.今回は文章を自動生成するためのマルコフ連鎖を実装していきます...","created_at":"2021-02-15"},{"id":"58","title":"GraphQL入門","description":"はじめに こんにちは、僕です。 この記事は 技術メモ にまとめたものの総括みたいな感じです。 ということでGraphQL に入門したのでまとめます。ここでは Query と Mutation については触れますが Subscription については触れません。(これで入門したとか言うな)一応 Subscription については後日追記予定です。手を動かした時間で言うと10時間もないので...","created_at":"2021-05-17"},{"id":"59","title":"バンドルツール作る","description":"こんにちは どうも、僕です。最近バンドルツールを作った(というか作ってる途中)なのでその様子を記事にします。 まだ作ってる途中なのと、あまりきれいな構成ではないので多目に見てください。ではやっていきます。 技術選定 プログラムを実行するためのものと、バンドラーを作成するための補助として使うもののそれぞれを別に悩むことなく以下のように選定しました。 deno プログラムの実行に関してですが、...","created_at":"2021-06-05"},{"id":"67","title":"iframe のスクロール","description":"はじめに こんにちは、どうも僕です。Intersection Observer API を使ってスクロール率を用いてコンテンツの表示を操作するためにコードを書いていたのですが、ちょっとこけたのでまとめます。 Intersection Observer API とは Intersection Observer API とは、ターゲットとなる要素が指定した監視対象の要素が指定した viewport...","created_at":"2021-07-17"},{"id":"68","title":"日報?を作った","description":"こんにちは どうも、僕です。 今回は Twitter API を使って自分のツイートを自動で拾ってきてそれをもとに140文字以内の任意の文章を生成してツイートする bot を作成したのでその様子を記事にします。なお、@takurinton ではないアカウント(知ってる人は知ってる)なのでそこはご了承ください。 使用技術 JavaScript バンドルするのがめんどくさいので CommonJS べ...","created_at":"2021-07-21"},{"id":"71","title":"dumb-init とは","description":"はじめに こんにちは、どうも僕です。Dockerfile を読んだり書いたりしてる時に出てきた dumb-init を知らなくて気になったので調査しました。 dumb-init とは dumb-init とは Linux コンテナ用の最小限の init システムで、PID が 1 になるように作られています。最小限のコンテナとは、Docker などの小さめの環境のことを指していています。C で...","created_at":"2021-08-18"},{"id":"72","title":"インフラのパフォチュー","description":"はじめに どうも、僕です。先日、ISUCON に出場して、学生枠で6位、5位と2000点差で惜しくも本戦出場を逃しました。(チームメンバーに助けられまくってたので僕はなにもしてませんが) 普段はフロントエンドの実装をメインとしてやっているのですが、最近仕事で Docker や k8s 周りを触ることが多く、少しサーバサイドやインフラについて少し興味が出てきたときに出場した ISUCON だった...","created_at":"2021-08-29"},{"id":"74","title":"Preact の change event","description":"こんにちは どうも、僕です。先日、Preact を使用して、簡単なアプリケーションのプロトコーディングをしていて、input タグのイベントハンドラを呼ぼうとしたらうまく動かくてハマりました。 以下のように定義していたのですが、結論としては、onChange ではなくて onInput を使わなければならないようです。 const HogeComponent = (): JSX.Element...","created_at":"2021-09-19"},{"id":"75","title":"GraphQL の print と parse","description":"こんにちは どうも、僕です。最近、業務や趣味で GraphQL の AST や query を動的にいじるようなことをしていて、その中で print 関数や parse 関数を脳死で使っていたのですが、ふと中身がどうなっているのか気になったため、ちょっと調べてみました。なお、今回は、AST の見方などは書きません。 print と parse とは parse 関数 print 関数とは、Grap...","created_at":"2021-09-19"},{"id":"77","title":"GraphQL の parse エディタ","description":"こんにちは どうも、僕です。シルバーウィークなのでこれまで書きたくても時間がなくて書けなかった記事をどんどん投下しています。今回は、最近作ってる GraphQL の DocumentNode を parse して作ったエディタから動的に query を生成する画面のプロトコーディングをしたのでそれを簡単にまとめます。 概要 このツイートの感じです。 https://twitter.com/taku...","created_at":"2021-09-20"},{"id":"78","title":"自サイトのアクセス可視化","description":"こんにちは どうも、僕です。1ヶ月ほど前からポートフォリオとブログのトラッキングを始めて、だいぶデータが溜まってきたのでどうしようかなと思っていました。ちょうど、昨日(9月23日)は祝日で、数日前に研究の中間発表も終わり(学部の研究発表なんてたかが知れてるだろという声はさておき)、たまには休日っぽいことでもするかと思っていたので、ポートフォリオとブログのログを可視化するというコードを書いてみました...","created_at":"2021-09-23"},{"id":"79","title":"自サイトのアクセス可視化2","description":"こんにちは どうも、僕です。この記事は 自サイトのアクセス可視化 の続きです。前回は AST をこねくり回して、form をいじる実装をしました。今回はそのアクセスごとの詳細画面を作成し、そこにグラフをつけて見やすくするみたいなことをしてみました。まだまだきれいではないのですが、これからきれいになります、きっと。 概要 前回、ちょっとだけ作っていた Detail.tsx を拡張します。詳細ページで...","created_at":"2021-09-25"},{"id":"81","title":"プレイドのインターン終了した","description":"こんにちは どうも、僕です。会社のブログ にも書いたのですが、プレイドのインターンを終了しました。理由としては、これから色々忙しくなるからであって、別にクビになったわけではないです。ここでは、なんというか、こんなこと感じたみたいなことを書きます。会社のブログは事実ベース、こっちのブログは感情ベースです。 あのブログに関して あのブログ、実は1ヶ月前くらいから書いていて、めちゃくちゃ時間かけました。...","created_at":"2021-09-30"},{"id":"83","title":"addEventListener の第3引数","description":"こんにちは どうも、僕です。addEventListener の第3引数って知ってますか。僕は知りませんでした。いや、厳密に言うと、存在は知ってたけど理解してませんでした。理解するために、DOMのイベントフローとともに見ていきたいと思います。 イベントフローとは まずはイベントフローとは何かについて考えます。イベントフローとは、DOM に対するイベントの委任(伝播)のことで、例えば以下のような...","created_at":"2021-10-13"},{"id":"84","title":"React のメモ化","description":"こんにちは どうも、僕です。プレイドのインターンで人生で初めて業務でフロントエンドを書いてから3ヶ月半が経ちました。プレイドでは Vue と Svelte を書いていて、最後の2週間くらいは React を書いていましたが、まだまだよくわからない点が多く、特に hooks 周りを自分はしっかり理解してませんでした。プレイドでは Vue と Svelte を書いていて、最後の2週間くらいは Reac...","created_at":"2021-10-13"},{"id":"87","title":"JPHACKS に出場した","description":"こんにちは どうも、僕です。人生初ハッカソン、出場しました。総合すると、毎日忙しかったものの、とても楽しくコードを書くことができたと思います。また、一緒に出てくれたメンバーや、今回のハッカソンに出場していた皆さん、また、開催してくれた方々には感謝しかありません、ありがとうございました。 作品 https://github.com/jphacks/F_2111 チームメンバー チームメンバーは、...","created_at":"2021-10-30"},{"id":"88","title":"forwardRef を習得した","description":"こんにちは どうも、僕です。最近色々あって、Material UI のコードを読んでいるのですが、forwardRef がさまざまな箇所で出てきて理解できないと辛いので勉強しました。 ref とは ref とは、簡単に言うと、dom であれば element、それ以外の要素であればその class のインスタンスに対してアタッチするためのものです。class component だと、要素 +...","created_at":"2021-11-01"},{"id":"93","title":"検索を作る","description":"こんにちは どうも、僕です。検索エンジンを自作しようとしてうまくは行きましたが、想定していた規模には耐えることができなかったという内容の記事です。実際、パフォーマンスにこだわると厳しい点が多かったり、検索結果が帰ってこなかったりしてだいぶしんどい実装になってしまいました。もっとうまくやる方法があったら教えてください。 今回の手法と想定する規模 今回は、転置インデックスを作成して戦います。転置イ...","created_at":"2021-11-15"},{"id":"94","title":"MySQL の FULLTEXT とは","description":"こんにちは どうも、僕です。MySQL(MariaDB)に搭載されてる最強な検索、FULLITEXT INDEX について書きます。前回のブログ で、検索をアプリケーション側で実装する方法について書きましたが、今回はそれのデータベース側からのアプローチです。このレイヤーでデータを操作するのは賛否が分かれる部分だとは思いますが、簡単に実装してみたのでやっていきます。 そもそも何 インデックスです。全...","created_at":"2021-11-16"},{"id":"103","title":"結合時のアルゴリズム","description":"こんにちは どうも、僕です。SQL アンチパターンを読んでいて、「外部結合をすると処理のコストが指数関数的に上がっていってしまいます」との記述があり、よくわからなかったので調べました。 JOIN アルゴリズム そもそも、 SQL の JOIN には、以下の3種類のアルゴリズムが使用されることが多いです。オラクルと、postges には全部使用されていますが、MySQL には nested loo...","created_at":"2021-12-18"},{"id":"105","title":"2021年振り返り","description":"こんにちは どうも、僕です。2021年もそろそろ終わります。2021年は色々なことがありましたが、簡単にまとめると、機会と出逢いに恵まれた1年だったと思っています。さまざまな優秀なエンジニアの方々と仕事をさせていただいたり、コミュニティへ招待していただいたりをしていました。自分自身の技術的な成長があったかどうかは微妙ですが、エンジニアとして少しずつ地に足がついてきた実感はあります。来年も頑張って行...","created_at":"2021-12-29"},{"id":"108","title":"Svelte と SPA","description":"こんにちは どうも、僕です。最近、Svelte が市民権を獲得してきているようで、フロントエンド開発において、選択肢に入ってくる機会が増えてきたと思います。また、Twitter などでも、React よりも Svelte!のような内容のものや、Svelte を勉強してみるといった内容のものが増えてきたように感じます。それ自体はいいことであり、Svelte が選択肢に入ってくることは面白いとは思うの...","created_at":"2022-01-14"},{"id":109,"title":"ブログをSSGにした","description":"こんにちは どうも、僕です。今回はブログを SSG にしてみたという話をします。年始に SSR をするような構成にしたばかりですが、色々あって(後述)作り替えてみました。 SSR にする記事は以下からどうぞ。 ブログを作り直した Rust で GraphQL server を書いてみた このブログのソースコードはこちらtakurinton/ssg-blog なぜ作り直したか そもそもなぜ作り直...","created_at":"2022-08-14"},{"id":110,"title":"wmr の prerender 時に明示的な fetch の定義が不要になる","description":"こんにちは どうも、僕です。 先日、ブログを新しくしました。=> ブログを SSG にしたwmr の prerender mode を使って SSG にしましたが、自分の実装したような wmr の prerender で .md ファイルを使ったブログを書くようなパターンだと、prerender 関数の中で fetch API をオーバーライドしてあげないとプロダクションビルドをする際に f...","created_at":"2022-09-26"},{"id":111,"title":"SHA-256 algorithm","description":"こんにちは どうも、僕です。今週猫がきます。 猫の名前について、友人と雑談をしていて、 名前なんて記号なんだから呼びやすくて聞こえが良ければなんでもいいよ と言われたので、記号だなんてそんなのハッシュではないかと思ったと同時に、ハッシュという名前はとてもいいなと思いました。ハッシュという名前にしっくりきたので名前はハッシュにしようと思ったものの、筆者はコンピュータサイエンスの学部を出ているのに...","created_at":"2022-10-10"},{"id":112,"title":"2022年振り返り","description":"こんにちは 今年は散々な年だったため書かなくて良いかなと思っていましたが、こういうのは後から見てみてこういうのもあったなーと振り返るものな気がするので一応書いておきます。 去年の振り返りはこちらです。 去年に倣って GitHub の草を載せるとこんな感じです、去年と比べるとあまりコードを書かなかった 1 年だったように感じます。 ざっくり時系列 1 月 卒論の提出期日を間違えてました。 とよ...","created_at":"2022-12-31"}] \ No newline at end of file +[ + { + "id": "5", + "title": "OngaqJS触ってみた", + "description": "はじめに こんにちは ポートフォリオ(おふざけ入ってるあれです)にリンク貼ってあるOngaqJSについてのソースコードをまとめてみたので記事にしました。 #OngaqJSとはなんぞや? OngaqJSとは、JavaScriptで音楽が作成できるというAPIです。 Keyの取得はこちらから 有料枠と無料枠があり、使える楽器の種類などが異なる模様(有料会員になろうかな) ぽちぽちしていけば簡単に登録で...", + "created_at": "2020-04-24" + }, + { + "id": "9", + "title": "ブログを引っ越した話", + "description": "はじめに こんにちは。疲れた。 てことで今回は僕がはじめてAWSを使ったときに詰まったところについてまとめたいと思います!!! また、この記事はQiitaにも全く同じことが書いてありますので、見やすい方がいいなと思ったら素直にQiitaに言ってください。 URLはこちらです 僕のレベル AWSって何???? まず最初に言っておきますが、私はこのレベルの人間です。AWSって言葉は知ってるけど中身は知...", + "created_at": "2020-06-10" + }, + { + "id": "12", + "title": "サポーターズの1on1面談に参加した話", + "description": "こんにちは こんばんは、先日サポーターズの1on1面談イベントに参加したので記事にしたいと思います。 簡単にまとめると、とっても楽しかったし充実した時間になったけど、その分周りのエンジニア志望の学生との差を痛感してとても刺激がもらえたイベントでした!!!! 1on1面談イベントってなんだよって思った方はこちらのリンクを参照してみてください。 #事前に準備したこと このイベントは、各ターンの最初に学...", + "created_at": "2020-06-11" + }, + { + "id": "17", + "title": "Treasureに参加した話", + "description": "はじめに こんにちは。僕です。 以前の記事にも書きましたが、VOYAGE GROUPのTreasureというインターンに参加したのでまとめたいと思います。 結論から言うと最高のインターンでした!!(迷惑かけてばっかりだったけど) 来年以降インターンシップに行きたいと思ってる人はぜひTreasureにも申し込んでみてください! そもそもTreasureってなんだ TreasureとはVOYAGE G...", + "created_at": "2020-09-02" + }, + { + "id": "18", + "title": "サイバーエージェントのインターンに参加した話", + "description": "こんにちは どうも、僕です。 今回はサイバーエージェントの就業型インターンに参加して、Ameba事業本部という部署で少しだけコード書かせてもらったのでそのことについて記事にしたいと思います。 参加した経緯 これは遡ること2月、、、 僕が某企業のアドテクのインターンに参加して、楽しかったことを大学の先輩のYさんに報告しました。 僕「この前アドテクのインターンに参加して、DSP周りのコードを簡単に...", + "created_at": "2020-09-13" + }, + { + "id": "19", + "title": "楽天のインターンに参加した話", + "description": "こんにちは どうも、僕です。今回は夏の締めくくりに参加した楽天のインターンについて書きたいと思います。楽天のインターンはここまでのインターンの中で一番辛かったような気がします(言語的な問題)海外で仕事できる気がしませんでした。そんな感じでまとめていきます。 選考 インターンには選考がつきものです。選考内容はコーディングテストと面接で、両方とも1日で終わらせます。参加者全員。 コーディングテストはc...", + "created_at": "2020-09-25" + }, + { + "id": "21", + "title": "Skywayでビデオ通話", + "description": "はじめに こんにちは、ブログに MaterialUIを導入してルンルンの僕です。今回はSkyWayで1対1の音声通話、またそれを文字起こしをしてGASに投げる処理までを書いたのでまとめたいと思います。GitHub Pages でデプロイしたサイトはこちらになります。レポジトリはこちらになります。 SkyWayって何? SkyWayとは、Webでリアルタイムコミュニケーションを実現する標準技術、We...", + "created_at": "2020-10-09" + }, + { + "id": "23", + "title": "Django + RDS", + "description": "こんにちは どうも、僕です。今回はAWSのEC2にデプロイしたDjangoのプロジェクトをRDSに接続する方法について書きたいと思います。Djangoを理解してればとても簡単。困ることなんてありません。ではいきます。 バックアップを取る DjangoではデフォルトのDBとしてプロジェクトを作成したときにsqlite3のテーブルがついてきます。しかし、RDSに乗り換えるときにはsqlite3のデータ...", + "created_at": "2020-10-15" + }, + { + "id": "26", + "title": "easyjsonを使ってみた", + "description": "こんにちは どうも、僕です。この記事は随分前のインターン期間中に自分のために書いた記事を転載してます。 GoでJSON使う時ってだいぶめんどくさいんですよね。まあ型による安心感がバケモンなのでやった方がいいんですけど。 GoでJSONを捌く時はstructを使用します。クラスとかはないのでこれでいきます。  Unmarshal 早速やってみます。 例えばこんな感じのjsonがくるとします。 v...", + "created_at": "2020-10-21" + }, + { + "id": "29", + "title": "4日間でポートフォリオを作り替えた", + "description": "こんにちは どうもこんにちは。僕です。最近あったことといえば、Vのインターン落ちて落ち込んでるところに人事の方からのなぐさめのDMがきてさらに泣きそうになったところでRからの内定もらってなんだかメンタルが忙しいことです。 今回は僕がポートフォリオを作り替えた話(需要あるのか?)について話していこうと思います。 なんで作り替えたの? まずここから作り替えた理由としては3つあります。 Nex...", + "created_at": "2020-11-14" + }, + { + "id": "30", + "title": "Goのdeferに注意する", + "description": "はじめに 今日開発してて遭遇したエラーについて話します。短めです。よろしくお願いします。 状況 GoでAPIサーバを開発してる時に、エラーハンドリングについての実装をしていた。現状の問題としては、DBと接続する時にアプリケーションサーバ(NginxやらGolangやら)が生きてる状態でDBサーバ(今で言うRDS)が死んでる時にDBのIPアドレスとポートがクライアント側に渡されてしまうという問題が起...", + "created_at": "2020-11-15" + }, + { + "id": "31", + "title": "DjangoでUser認証機能を作る", + "description": "こんにちは これですどうも、僕です。この記事はKITアドベントカレンダーの4日目の記事になります。今回はユーザー認証の機能を実装してみようと思います。 やり方 Djangoではデフォルトでユーザーモデルが定義されています。今回はそれを書き換えることでユーザー認証の仕組みを作成して行こうと思います。最近だと外部の認証に任せるパターンも増えていますが、こっちの方が楽だと感じることもちょこちょこある...", + "created_at": "2020-12-04" + }, + { + "id": "33", + "title": "pyparsing触ってみた", + "description": "こんにちは こんにちは、僕です。最近、pyparsingというPythonのライブラリを使用していて、面白いなあと思ったので記事にしてみました。元々自分は言語解析などに興味があって(NLPとか)、今回は形式言語解析になりますがまとめたいと思います。 pyparsingとは? これです。ドキュメント The pyparsing module is an alternative approach ...", + "created_at": "2020-11-24" + }, + { + "id": "34", + "title": "DRFのViewについてまとめる", + "description": "こんにちは どうも、こんにちは、僕です。今日はDRFのなんちゃらAPIViewについてまとめたいと思います。自分の推しはAPIViewです。対戦お願いします! DRFとは? そんなもんは自分で調べてください(辛辣) 参考までにこれは前回の記事でさらっと書いてしまったAPIView周りの深堀りみたいなイメージで描いていきます。 今回使うモデル 今回使うモデルはとてもシンプルで、以下のよう...", + "created_at": "2020-11-27" + }, + { + "id": "35", + "title": "asgiを触ってみた", + "description": "こんにちは どうも、僕です。今回はDjangoでasgiを使用してみたということでチュートリアルを自分なりにまとめたいと思います。最近のブログ暇つぶしみたいな感じだったので今回は久しぶりに新しい技術に触れたアウトプット感があって良きです。浅い asgiって何? まず最初にasgiについて説明したいと思います。そもそもPythonで鯖を立てるためにはwsgiとasgiの2種類があります。 ws...", + "created_at": "2020-11-27" + }, + { + "id": "36", + "title": "asgiを触ってみたつづき", + "description": "どうも こんにちは、僕です。今回は前回の記事の続きを書いていきたいと思います。まだまだリファクタリングしないといけないのですが、現状動くものをのせる的な感じで。 前回なにしたか 前回はぽよりました。(適当)まあ、簡単にソケットでチャットを作りましょうみたいなことをしました。 今回はなにするか そこに今回はユーザーを定義してさらにチャットを保存していくみたいな実装をしました。簡単な実装しかしてい...", + "created_at": "2020-11-30" + }, + { + "id": "38", + "title": "Goの名前付き戻り値", + "description": "こんにちは どうも僕です。この記事はKITアドベントカレンダー11日目の記事になります。今回はGolangの名前付き戻り値について簡単にまとめてみました。 そもそも名前付き戻り値って何? まずこれですよね、僕も最初はわからんってなってましたし、今もよくわかってないです。簡単にいうと、戻り値に名前をつけておくことができます。比較は以下のコードで。 // 通常の関数 func nomalFun...", + "created_at": "2020-12-11" + }, + { + "id": "40", + "title": "フロントエンドの今", + "description": "こんにちは どうも、僕です。今日はフロントエンドについて書いて行こうと思います。(抽象的〜〜〜) 僕はフロントエンドの人間ではないのであまり詳しくはないのですが、そんな僕でも知っていることや最低限意識していることなどを簡単にですがまとめていきたいと思います。 最近のフロントエンド 最近はフロントエンドの進化が早く、バックエンド側まで侵食しかけている印象を受けます。SPAとはみたいなことを思うよ...", + "created_at": "2020-12-15" + }, + { + "id": "42", + "title": "2020年振り返り", + "description": "こんにちは どうも,僕です.これを書いているときはクリスマスで,TLのみんなはコード書いてるんだろうなって思いながら書いてます.今年一年,某病気にほぼ潰されてしまいましたが,個人的には充実した1年間になったと感じています.インターン,就職活動,技術的な成長,その他もろもろ人生の分岐点となるようなことが多かった気がします.それを割と雑に振り返っていきたいと思います. 2020年という年 今年は大...", + "created_at": "2020-12-25" + }, + { + "id": "49", + "title": "JWTについて学ぶ", + "description": "はじめに どうも,僕です.今日はGolangでJWTを実装したけどちょっとつまづいたことが多かったので記事にしたいと思います.これ実装したのだいぶ前なので思い出しながら頑張っていこうと思います. JWTについて そもそもJWTとはなんなのかについて簡単におさらいをしておきたいと思います.JWTとは,JSON Web Tokenの略で属性情報(Claim)をJSONの中に丸め込むことで個人を識別...", + "created_at": "2021-01-11" + }, + { + "id": "56", + "title": "マルコフ連鎖実装してみた", + "description": "こんにちは どうも,僕です.今回はみんな大好きマルコフ連鎖についてです.コードはこれ.与えられた文章をもとにして新しい文章を生成するやつを実装しました.ではやっていきます. マルコフ連鎖って何? マルコフ連鎖とはどうやら離散マルコフ過程の別称のようです.知らんかった.Twitterで見かけてググってみたら出てきてほへーってなりました.今回は文章を自動生成するためのマルコフ連鎖を実装していきます...", + "created_at": "2021-02-15" + }, + { + "id": "59", + "title": "バンドルツール作る", + "description": "こんにちは どうも、僕です。最近バンドルツールを作った(というか作ってる途中)なのでその様子を記事にします。 まだ作ってる途中なのと、あまりきれいな構成ではないので多目に見てください。ではやっていきます。 技術選定 プログラムを実行するためのものと、バンドラーを作成するための補助として使うもののそれぞれを別に悩むことなく以下のように選定しました。 deno プログラムの実行に関してですが、...", + "created_at": "2021-06-05" + }, + { + "id": "67", + "title": "iframe のスクロール", + "description": "はじめに こんにちは、どうも僕です。Intersection Observer API を使ってスクロール率を用いてコンテンツの表示を操作するためにコードを書いていたのですが、ちょっとこけたのでまとめます。 Intersection Observer API とは Intersection Observer API とは、ターゲットとなる要素が指定した監視対象の要素が指定した viewport...", + "created_at": "2021-07-17" + }, + { + "id": "68", + "title": "日報?を作った", + "description": "こんにちは どうも、僕です。 今回は Twitter API を使って自分のツイートを自動で拾ってきてそれをもとに140文字以内の任意の文章を生成してツイートする bot を作成したのでその様子を記事にします。なお、@takurinton ではないアカウント(知ってる人は知ってる)なのでそこはご了承ください。 使用技術 JavaScript バンドルするのがめんどくさいので CommonJS べ...", + "created_at": "2021-07-21" + }, + { + "id": "71", + "title": "dumb-init とは", + "description": "はじめに こんにちは、どうも僕です。Dockerfile を読んだり書いたりしてる時に出てきた dumb-init を知らなくて気になったので調査しました。 dumb-init とは dumb-init とは Linux コンテナ用の最小限の init システムで、PID が 1 になるように作られています。最小限のコンテナとは、Docker などの小さめの環境のことを指していています。C で...", + "created_at": "2021-08-18" + }, + { + "id": "72", + "title": "インフラのパフォチュー", + "description": "はじめに どうも、僕です。先日、ISUCON に出場して、学生枠で6位、5位と2000点差で惜しくも本戦出場を逃しました。(チームメンバーに助けられまくってたので僕はなにもしてませんが) 普段はフロントエンドの実装をメインとしてやっているのですが、最近仕事で Docker や k8s 周りを触ることが多く、少しサーバサイドやインフラについて少し興味が出てきたときに出場した ISUCON だった...", + "created_at": "2021-08-29" + }, + { + "id": "74", + "title": "Preact の change event", + "description": "こんにちは どうも、僕です。先日、Preact を使用して、簡単なアプリケーションのプロトコーディングをしていて、input タグのイベントハンドラを呼ぼうとしたらうまく動かくてハマりました。 以下のように定義していたのですが、結論としては、onChange ではなくて onInput を使わなければならないようです。 const HogeComponent = (): JSX.Element...", + "created_at": "2021-09-19" + }, + { + "id": "75", + "title": "GraphQL の print と parse", + "description": "こんにちは どうも、僕です。最近、業務や趣味で GraphQL の AST や query を動的にいじるようなことをしていて、その中で print 関数や parse 関数を脳死で使っていたのですが、ふと中身がどうなっているのか気になったため、ちょっと調べてみました。なお、今回は、AST の見方などは書きません。 print と parse とは parse 関数 print 関数とは、Grap...", + "created_at": "2021-09-19" + }, + { + "id": "77", + "title": "GraphQL の parse エディタ", + "description": "こんにちは どうも、僕です。シルバーウィークなのでこれまで書きたくても時間がなくて書けなかった記事をどんどん投下しています。今回は、最近作ってる GraphQL の DocumentNode を parse して作ったエディタから動的に query を生成する画面のプロトコーディングをしたのでそれを簡単にまとめます。 概要 このツイートの感じです。 https://twitter.com/taku...", + "created_at": "2021-09-20" + }, + { + "id": "78", + "title": "自サイトのアクセス可視化", + "description": "こんにちは どうも、僕です。1ヶ月ほど前からポートフォリオとブログのトラッキングを始めて、だいぶデータが溜まってきたのでどうしようかなと思っていました。ちょうど、昨日(9月23日)は祝日で、数日前に研究の中間発表も終わり(学部の研究発表なんてたかが知れてるだろという声はさておき)、たまには休日っぽいことでもするかと思っていたので、ポートフォリオとブログのログを可視化するというコードを書いてみました...", + "created_at": "2021-09-23" + }, + { + "id": "79", + "title": "自サイトのアクセス可視化2", + "description": "こんにちは どうも、僕です。この記事は 自サイトのアクセス可視化 の続きです。前回は AST をこねくり回して、form をいじる実装をしました。今回はそのアクセスごとの詳細画面を作成し、そこにグラフをつけて見やすくするみたいなことをしてみました。まだまだきれいではないのですが、これからきれいになります、きっと。 概要 前回、ちょっとだけ作っていた Detail.tsx を拡張します。詳細ページで...", + "created_at": "2021-09-25" + }, + { + "id": "81", + "title": "プレイドのインターン終了した", + "description": "こんにちは どうも、僕です。会社のブログ にも書いたのですが、プレイドのインターンを終了しました。理由としては、これから色々忙しくなるからであって、別にクビになったわけではないです。ここでは、なんというか、こんなこと感じたみたいなことを書きます。会社のブログは事実ベース、こっちのブログは感情ベースです。 あのブログに関して あのブログ、実は1ヶ月前くらいから書いていて、めちゃくちゃ時間かけました。...", + "created_at": "2021-09-30" + }, + { + "id": "83", + "title": "addEventListener の第3引数", + "description": "こんにちは どうも、僕です。addEventListener の第3引数って知ってますか。僕は知りませんでした。いや、厳密に言うと、存在は知ってたけど理解してませんでした。理解するために、DOMのイベントフローとともに見ていきたいと思います。 イベントフローとは まずはイベントフローとは何かについて考えます。イベントフローとは、DOM に対するイベントの委任(伝播)のことで、例えば以下のような...", + "created_at": "2021-10-13" + }, + { + "id": "84", + "title": "React のメモ化", + "description": "こんにちは どうも、僕です。プレイドのインターンで人生で初めて業務でフロントエンドを書いてから3ヶ月半が経ちました。プレイドでは Vue と Svelte を書いていて、最後の2週間くらいは React を書いていましたが、まだまだよくわからない点が多く、特に hooks 周りを自分はしっかり理解してませんでした。プレイドでは Vue と Svelte を書いていて、最後の2週間くらいは Reac...", + "created_at": "2021-10-13" + }, + { + "id": "87", + "title": "JPHACKS に出場した", + "description": "こんにちは どうも、僕です。人生初ハッカソン、出場しました。総合すると、毎日忙しかったものの、とても楽しくコードを書くことができたと思います。また、一緒に出てくれたメンバーや、今回のハッカソンに出場していた皆さん、また、開催してくれた方々には感謝しかありません、ありがとうございました。 作品 https://github.com/jphacks/F_2111 チームメンバー チームメンバーは、...", + "created_at": "2021-10-30" + }, + { + "id": "88", + "title": "forwardRef を習得した", + "description": "こんにちは どうも、僕です。最近色々あって、Material UI のコードを読んでいるのですが、forwardRef がさまざまな箇所で出てきて理解できないと辛いので勉強しました。 ref とは ref とは、簡単に言うと、dom であれば element、それ以外の要素であればその class のインスタンスに対してアタッチするためのものです。class component だと、要素 +...", + "created_at": "2021-11-01" + }, + { + "id": "93", + "title": "検索を作る", + "description": "こんにちは どうも、僕です。検索エンジンを自作しようとしてうまくは行きましたが、想定していた規模には耐えることができなかったという内容の記事です。実際、パフォーマンスにこだわると厳しい点が多かったり、検索結果が帰ってこなかったりしてだいぶしんどい実装になってしまいました。もっとうまくやる方法があったら教えてください。 今回の手法と想定する規模 今回は、転置インデックスを作成して戦います。転置イ...", + "created_at": "2021-11-15" + }, + { + "id": "94", + "title": "MySQL の FULLTEXT とは", + "description": "こんにちは どうも、僕です。MySQL(MariaDB)に搭載されてる最強な検索、FULLITEXT INDEX について書きます。前回のブログ で、検索をアプリケーション側で実装する方法について書きましたが、今回はそれのデータベース側からのアプローチです。このレイヤーでデータを操作するのは賛否が分かれる部分だとは思いますが、簡単に実装してみたのでやっていきます。 そもそも何 インデックスです。全...", + "created_at": "2021-11-16" + }, + { + "id": "103", + "title": "結合時のアルゴリズム", + "description": "こんにちは どうも、僕です。SQL アンチパターンを読んでいて、「外部結合をすると処理のコストが指数関数的に上がっていってしまいます」との記述があり、よくわからなかったので調べました。 JOIN アルゴリズム そもそも、 SQL の JOIN には、以下の3種類のアルゴリズムが使用されることが多いです。オラクルと、postges には全部使用されていますが、MySQL には nested loo...", + "created_at": "2021-12-18" + }, + { + "id": "105", + "title": "2021年振り返り", + "description": "こんにちは どうも、僕です。2021年もそろそろ終わります。2021年は色々なことがありましたが、簡単にまとめると、機会と出逢いに恵まれた1年だったと思っています。さまざまな優秀なエンジニアの方々と仕事をさせていただいたり、コミュニティへ招待していただいたりをしていました。自分自身の技術的な成長があったかどうかは微妙ですが、エンジニアとして少しずつ地に足がついてきた実感はあります。来年も頑張って行...", + "created_at": "2021-12-29" + }, + { + "id": "108", + "title": "Svelte と SPA", + "description": "こんにちは どうも、僕です。最近、Svelte が市民権を獲得してきているようで、フロントエンド開発において、選択肢に入ってくる機会が増えてきたと思います。また、Twitter などでも、React よりも Svelte!のような内容のものや、Svelte を勉強してみるといった内容のものが増えてきたように感じます。それ自体はいいことであり、Svelte が選択肢に入ってくることは面白いとは思うの...", + "created_at": "2022-01-14" + }, + { + "id": 109, + "title": "ブログをSSGにした", + "description": "こんにちは どうも、僕です。今回はブログを SSG にしてみたという話をします。年始に SSR をするような構成にしたばかりですが、色々あって(後述)作り替えてみました。 SSR にする記事は以下からどうぞ。 ブログを作り直した Rust で GraphQL server を書いてみた このブログのソースコードはこちらtakurinton/ssg-blog なぜ作り直したか そもそもなぜ作り直...", + "created_at": "2022-08-14" + }, + { + "id": 110, + "title": "wmr の prerender 時に明示的な fetch の定義が不要になる", + "description": "こんにちは どうも、僕です。 先日、ブログを新しくしました。=> ブログを SSG にしたwmr の prerender mode を使って SSG にしましたが、自分の実装したような wmr の prerender で .md ファイルを使ったブログを書くようなパターンだと、prerender 関数の中で fetch API をオーバーライドしてあげないとプロダクションビルドをする際に f...", + "created_at": "2022-09-26" + }, + { + "id": 111, + "title": "SHA-256 algorithm", + "description": "こんにちは どうも、僕です。今週猫がきます。 猫の名前について、友人と雑談をしていて、 名前なんて記号なんだから呼びやすくて聞こえが良ければなんでもいいよ と言われたので、記号だなんてそんなのハッシュではないかと思ったと同時に、ハッシュという名前はとてもいいなと思いました。ハッシュという名前にしっくりきたので名前はハッシュにしようと思ったものの、筆者はコンピュータサイエンスの学部を出ているのに...", + "created_at": "2022-10-10" + }, + { + "id": 112, + "title": "2022年振り返り", + "description": "こんにちは 今年は散々な年だったため書かなくて良いかなと思っていましたが、こういうのは後から見てみてこういうのもあったなーと振り返るものな気がするので一応書いておきます。 去年の振り返りはこちらです。 去年に倣って GitHub の草を載せるとこんな感じです、去年と比べるとあまりコードを書かなかった 1 年だったように感じます。 ざっくり時系列 1 月 卒論の提出期日を間違えてました。 とよ...", + "created_at": "2022-12-31" + } +] From f4d7a3a8f65118db47783415485c521c9919d443 Mon Sep 17 00:00:00 2001 From: takurinton Date: Thu, 28 Mar 2024 11:50:14 +0900 Subject: [PATCH 9/9] revert preact-iso in local and install preact-iso latest (#198) update preact-iso remove local preact-iso remove preinstall command update lockfile --- bun.lockb | Bin 237035 -> 129758 bytes package.json | 3 +- preact-iso/.editorconfig | 22 - preact-iso/.gitignore | 29 - preact-iso/CHANGELOG.md | 135 -- preact-iso/CODE_OF_CONDUCT.md | 46 - preact-iso/LICENSE | 21 - preact-iso/README.md | 147 -- preact-iso/bun.lockb | Bin 138621 -> 0 bytes preact-iso/jsconfig.json | 10 - preact-iso/package.json | 57 - preact-iso/src/hydrate.d.ts | 3 - preact-iso/src/hydrate.js | 17 - preact-iso/src/index.d.ts | 4 - preact-iso/src/index.js | 7 - preact-iso/src/lazy.d.ts | 5 - preact-iso/src/lazy.js | 43 - preact-iso/src/prerender.d.ts | 15 - preact-iso/src/prerender.js | 48 - preact-iso/src/router.d.ts | 42 - preact-iso/src/router.js | 216 --- preact-iso/test/match.test.js | 107 -- preact-iso/test/router.test.js | 535 ------- preact-iso/yarn.lock | 2578 -------------------------------- 24 files changed, 1 insertion(+), 4089 deletions(-) delete mode 100644 preact-iso/.editorconfig delete mode 100644 preact-iso/.gitignore delete mode 100644 preact-iso/CHANGELOG.md delete mode 100644 preact-iso/CODE_OF_CONDUCT.md delete mode 100644 preact-iso/LICENSE delete mode 100644 preact-iso/README.md delete mode 100755 preact-iso/bun.lockb delete mode 100644 preact-iso/jsconfig.json delete mode 100644 preact-iso/package.json delete mode 100644 preact-iso/src/hydrate.d.ts delete mode 100644 preact-iso/src/hydrate.js delete mode 100644 preact-iso/src/index.d.ts delete mode 100644 preact-iso/src/index.js delete mode 100644 preact-iso/src/lazy.d.ts delete mode 100644 preact-iso/src/lazy.js delete mode 100644 preact-iso/src/prerender.d.ts delete mode 100644 preact-iso/src/prerender.js delete mode 100644 preact-iso/src/router.d.ts delete mode 100644 preact-iso/src/router.js delete mode 100644 preact-iso/test/match.test.js delete mode 100644 preact-iso/test/router.test.js delete mode 100644 preact-iso/yarn.lock diff --git a/bun.lockb b/bun.lockb index 1853e532cb4770aa276db340e516a95f43d760b7..f4512c8c6f63231cd547a110b3449989116f8a5a 100755 GIT binary patch delta 30173 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 literal 237035 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

    C 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 diff --git a/package.json b/package.json index 8b8de18..e3d7808 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "type": "module", "scripts": { "dev": "wmr", - "preinstall": "cd ./preact-iso && bun install && cd ..", "build": "NODE_ENV=production wmr build --prerender", "serve": "wmr serve", "lint": "eslint './{public,src}/**/*.{js,jsx,ts,tsx}'", @@ -25,7 +24,7 @@ "hoofd": "1.7.0", "marked": "9.1.2", "preact": "10.18.1", - "preact-iso": "file:./preact-iso" + "preact-iso": "2.5.0" }, "author": "takurinton", "eslintConfig": { diff --git a/preact-iso/.editorconfig b/preact-iso/.editorconfig deleted file mode 100644 index 707c3a6..0000000 --- a/preact-iso/.editorconfig +++ /dev/null @@ -1,22 +0,0 @@ -root = true - -[*] -indent_style = tab -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[{.*rc,*.yml}] -indent_style = space -indent_size = 2 - -[package.json] -insert_final_newline = false - -[*.md] -trim_trailing_whitespace = false - -[test/fixtures/**/*.expected.*] -trim_trailing_whitespace = false -insert_final_newline = false diff --git a/preact-iso/.gitignore b/preact-iso/.gitignore deleted file mode 100644 index 51c10e9..0000000 --- a/preact-iso/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/* -!.yarn/releases -!.yarn/plugins -.pnp.* - -# testing -/coverage - -# production -/dist -/build -/.yalc - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/preact-iso/CHANGELOG.md b/preact-iso/CHANGELOG.md deleted file mode 100644 index 298a798..0000000 --- a/preact-iso/CHANGELOG.md +++ /dev/null @@ -1,135 +0,0 @@ -# preact-iso - -## 2.3.1 - -### Patch Changes - -- [`2465fbb`](https://github.com/preactjs/wmr/commit/2465fbba9e0888d2191d0fbcf613b26e81b4640e) [#895](https://github.com/preactjs/wmr/pull/895) Thanks [@rschristian](https://github.com/rschristian)! - Fix lack of hydration when not returning prerender data - -## 2.3.0 - -### Minor Changes - -- [`22a8a18`](https://github.com/preactjs/wmr/commit/22a8a186fa45b64bb1349ba6998b12498d05d503) [#864](https://github.com/preactjs/wmr/pull/864) Thanks [@JoviDeCroock](https://github.com/JoviDeCroock)! - Add `onRouteChange` prop to the Router to observe synchronous route changes - -### Patch Changes - -- [`5780fc9`](https://github.com/preactjs/wmr/commit/5780fc929fa2bab222e3b3d11be2250aefe19cfe) [#864](https://github.com/preactjs/wmr/pull/864) Thanks [@JoviDeCroock](https://github.com/JoviDeCroock)! - Avoid calling onLoadEnd on every render - -* [`69d291f`](https://github.com/preactjs/wmr/commit/69d291fbf2644b5c774672f4846f30e0e453af57) [#870](https://github.com/preactjs/wmr/pull/870) Thanks [@developit](https://github.com/developit)! - Fix `` accidentally un-rendering incoming routes that happen to resolve to the same component as the outgoing route. - -## 2.2.0 - -### Minor Changes - -- [`9a814a9`](https://github.com/preactjs/wmr/commit/9a814a95e76883254c3e9861170259ddd6d9ac0c) [#832](https://github.com/preactjs/wmr/pull/832) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Add support for partial route matching via `/foo/*` - -* [`439768e`](https://github.com/preactjs/wmr/commit/439768e6ef3e0a69fe872196f2b3f05bd3bbfcb6) [#835](https://github.com/preactjs/wmr/pull/835) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Add support for nested routes matching - -### Patch Changes - -- [`21bbeb9`](https://github.com/preactjs/wmr/commit/21bbeb9a9a58e2c3c59f9db2cec1c651e5bbf5f8) [#831](https://github.com/preactjs/wmr/pull/831) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Fix `preact-iso` intercepting `cmd/ctrl+click` and other native browser behaviors. - -## 2.1.0 - -### Minor Changes - -- [`c963fbe`](https://github.com/preactjs/wmr/commit/c963fbec5cac7d45a65ffa9cd05d937e56fc5aa6) [#586](https://github.com/preactjs/wmr/pull/586) Thanks [@developit](https://github.com/developit)! - Pass route paramters as props when no prop exists with that name. - -* [`095ddde`](https://github.com/preactjs/wmr/commit/095dddefbb5b56d0a897716513977a99f38665bf) [#824](https://github.com/preactjs/wmr/pull/824) Thanks [@developit](https://github.com/developit)! - - Bugfix for Router: "splat" parameters (`/:x*` and `/:y*`) should be passed in the `params` prop instead of directly on props - -## 2.0.3 - -### Patch Changes - -- [`62840d8`](https://github.com/preactjs/wmr/commit/62840d82eddf1bda9447c08750fe6886751edee7) [#665](https://github.com/preactjs/wmr/pull/665) Thanks [@rschristian](https://github.com/rschristian)! - Removing unused imports (and associated console warnings) in preact-iso - -## 2.0.2 - -### Patch Changes - -- [`c1f3f0e`](https://github.com/preactjs/wmr/commit/c1f3f0e42a053811fe894f91a7bd702247e550d5) [#608](https://github.com/preactjs/wmr/pull/608) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Fix `useRoute` missing in main entry exports - -## 2.0.1 - -### Patch Changes - -- [`79c7fd6`](https://github.com/preactjs/wmr/commit/79c7fd6a5cd46904779a630ac42207e9bf918f1c) [#594](https://github.com/preactjs/wmr/pull/594) Thanks [@developit](https://github.com/developit)! - Fixes a race condition in preact-iso `Router` by registering the link click handler immediately. - -## 2.0.0 - -### Major Changes - -- [`8e8690a`](https://github.com/preactjs/wmr/commit/8e8690afee44e6d2bb83201ec3b283a89331995b) [#557](https://github.com/preactjs/wmr/pull/557) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Fix route params being able to overwrite route context. This is a breaking change in that params no need to be pulled off a `params` object instead of accessing it directly - -### Patch Changes - -- [`8a44d75`](https://github.com/preactjs/wmr/commit/8a44d756ccb72d32c36e6ed03d618462dd8a6ba3) [#571](https://github.com/preactjs/wmr/pull/571) Thanks [@developit](https://github.com/developit)! - preact-iso: fix ErrorBoundary pushing invalid callback into commit queue - -* [`6f93a06`](https://github.com/preactjs/wmr/commit/6f93a06bb2065e5fef15eb4f2bfffbd07bcc616d) [#567](https://github.com/preactjs/wmr/pull/567) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Update preact/iso TypeScript types - -- [`c7ca0a4`](https://github.com/preactjs/wmr/commit/c7ca0a436bfe99ff9d8d15dbad6b111cae40f799) [#555](https://github.com/preactjs/wmr/pull/555) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Fix crash when passing dynamic arrays as children. This was caused by missing children normalization. - -## 1.2.0 - -### Minor Changes - -- [`a7e79c9`](https://github.com/preactjs/wmr/commit/a7e79c9759ec87983bceb83819b5c8387299c867) [#530](https://github.com/preactjs/wmr/pull/530) Thanks [@developit](https://github.com/developit)! - `` is now an async boundary (it handles `lazy()` descendants by itself), and supports cancellable + stacked route transitions. - -### Patch Changes - -- [`8d5d1d8`](https://github.com/preactjs/wmr/commit/8d5d1d82d98c7f2e2eaccb92ff6890cf1e2e6139) [#534](https://github.com/preactjs/wmr/pull/534) Thanks [@developit](https://github.com/developit)! - [preact-iso] Support setting a manual URL via `` - -## 1.1.1 - -### Patch Changes - -- [`2d0bb8a`](https://github.com/preactjs/wmr/commit/2d0bb8a64783c32cfdaad05563b6293649059ef9) [#504](https://github.com/preactjs/wmr/pull/504) Thanks [@developit](https://github.com/developit)! - Bugfix: fix route flashing for routes that render fragments - -* [`321dfce`](https://github.com/preactjs/wmr/commit/321dfced389800e661174e1e304fa8ecab593f96) [#496](https://github.com/preactjs/wmr/pull/496) Thanks [@developit](https://github.com/developit)! - [preact-iso] Router: reset page scroll position on forward navigations - -- [`c07c39f`](https://github.com/preactjs/wmr/commit/c07c39fba101e34e673997262f71f80a8488b6d6) [#505](https://github.com/preactjs/wmr/pull/505) Thanks [@developit](https://github.com/developit)! - [preact-iso] Prevent the router from intercepting clicks on anchor links - -* [`764830f`](https://github.com/preactjs/wmr/commit/764830fde981e60f67fbc74f7e5b46dcbc98d573) [#493](https://github.com/preactjs/wmr/pull/493) Thanks [@developit](https://github.com/developit)! - [preact-iso] Prevent the Router from intercepting clicks on links with an "external" target (`target="anything"`). - -## 1.1.0 - -### Minor Changes - -- [`44d5a83`](https://github.com/preactjs/wmr/commit/44d5a835aa08fc4e4497706045ce26ba13108b0a) [#461](https://github.com/preactjs/wmr/pull/461) Thanks [@piotr-cz](https://github.com/piotr-cz)! - Fix Eslint and Prettier suggestions - -* [`f7b5bd7`](https://github.com/preactjs/wmr/commit/f7b5bd77c3d0e599cff43226f903483cefad9539) [#422](https://github.com/preactjs/wmr/pull/422) Thanks [@rschristian](https://github.com/rschristian)! - Adds a new Route component export - -### Patch Changes - -- [`5ff2c55`](https://github.com/preactjs/wmr/commit/5ff2c559feb83ffed514ed67b5d7f3e2389ef5cc) [#459](https://github.com/preactjs/wmr/pull/459) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Add missing Route export - -* [`0833c4a`](https://github.com/preactjs/wmr/commit/0833c4ad25ceffae461d4d8f8643744cc0b7e080) [#408](https://github.com/preactjs/wmr/pull/408) Thanks [@piotr-cz](https://github.com/piotr-cz)! - Add type definitions to router onLoadEnd and onLoadStart - -- [`f320e3e`](https://github.com/preactjs/wmr/commit/f320e3e46cbd66c4d0580c6ec567e335b646ac5c) [#416](https://github.com/preactjs/wmr/pull/416) Thanks [@JoviDeCroock](https://github.com/JoviDeCroock)! - Fix routes with leading/trailing slashes - -* [`3db3696`](https://github.com/preactjs/wmr/commit/3db36964afc1f3158d3b5d377d06ccf32b6efadd) [#421](https://github.com/preactjs/wmr/pull/421) Thanks [@marvinhagemeister](https://github.com/marvinhagemeister)! - Add missing types for `onError` prop of `ErrorBoundary` component - -- [`0bbb8cc`](https://github.com/preactjs/wmr/commit/0bbb8ccaafb1182b5a0f42ef6208a40d774c73f1) [#424](https://github.com/preactjs/wmr/pull/424) Thanks [@piotr-cz](https://github.com/piotr-cz)! - Set default value for push to true - -## 1.0.1 - -### Patch Changes - -- [`58f1bff`](https://github.com/preactjs/wmr/commit/58f1bffd108f45c1ac5759f744f484b5d6a8fcca) [#364](https://github.com/preactjs/wmr/pull/364) Thanks [@developit](https://github.com/developit)! - Fixes a bug introduced in 1.0.0 where Router would duplicate DOM when hydrating `lazy()` components. - -* [`ee75298`](https://github.com/preactjs/wmr/commit/ee752988a190ca3ac34c8614b7ac8c8d4d5a5062) [#368](https://github.com/preactjs/wmr/pull/368) Thanks [@piotr-cz](https://github.com/piotr-cz)! - Fix hydrate parent definition - -## 1.0.0 - -### Major Changes - -- [`c681137`](https://github.com/preactjs/wmr/commit/c681137b29ec521dcec050cba58ed24089629f1b) [#359](https://github.com/preactjs/wmr/pull/359) Thanks [@JoviDeCroock](https://github.com/JoviDeCroock)! - Remove deprecated `useLoc` export - -### Minor Changes - -- [`fab59f8`](https://github.com/preactjs/wmr/commit/fab59f88ecf2b6d2085941a4f92ccd3c78684738) [#354](https://github.com/preactjs/wmr/pull/354) Thanks [@JoviDeCroock](https://github.com/JoviDeCroock)! - Support route params and inject them into the rendered route, add the `useRoute` hook so we can retrieve route parameters from anywhere in the subtree. - -### Patch Changes - -- [`438be29`](https://github.com/preactjs/wmr/commit/438be293346c969384a57f3cfa31931f2722ea5a) [#337](https://github.com/preactjs/wmr/pull/337) Thanks [@cristianbote](https://github.com/cristianbote)! - Show the previous route only for the unresolved thrown routes diff --git a/preact-iso/CODE_OF_CONDUCT.md b/preact-iso/CODE_OF_CONDUCT.md deleted file mode 100644 index 9e81e67..0000000 --- a/preact-iso/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@preactjs.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/preact-iso/LICENSE b/preact-iso/LICENSE deleted file mode 100644 index ad648ac..0000000 --- a/preact-iso/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 The Preact Authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/preact-iso/README.md b/preact-iso/README.md deleted file mode 100644 index 503bbac..0000000 --- a/preact-iso/README.md +++ /dev/null @@ -1,147 +0,0 @@ -# preact-iso - -Isomorphic async tools for Preact. - -- Lazy-load components using `lazy()` and ``, which also enables progressive hydration. -- Generate static HTML for your app using `prerender()`, waiting for `lazy()` components and data dependencies. -- Implement async-aware client and server-side routing using ``, including seamless async transitions. - -### `lazy.js` - -Make a lazily-loaded version of a Component. -`lazy()` takes an async function that resolves to a Component, and returns a wrapper version of that Component. The wrapper component can be rendered right away, even though the component is only loaded the first time it is rendered. - -```js -import { render } from 'preact'; -import { ErrorBoundary, lazy, Router } from 'preact-iso'; - -// Synchronous, not code-splitted: -// import Home from './routes/home.js'; -// import Profile from './routes/profile.js'; - -// Asynchronous, code-splitted: -const Home = lazy(() => import('./routes/home.js')); -const Profile = lazy(() => import('./routes/profile.js')); - -const App = () => ( - - - - - - -); - -render(, document.body); -``` - -### `prerender.js` - -`prerender()` renders a Virtual DOM tree to an HTML string using [preact-render-to-string](https://github.com/preactjs/preact-render-to-string). The difference is that it is asynchronous, and waits for any Promises thrown by components during rendering (Suspense-style) to resolve before returning the HTML. Nested promises also work, and the maximum depth can be controlled using the `maxDepth` option, which defaults to `10`. - -The Promise returned from `prerender()` resolves to an Object with `html` and `links[]` properties. The `html` property contains your pre-rendered static HTML markup, and `links` is an Array of any non-external URL strings found in links on the generated page. - -```js -import { ErrorBoundary, lazy, prerender } from 'preact-iso'; - -// Asynchronous (throws a promise) -const Foo = lazy(() => import('./foo.js')); - -const App = () => ( - - - -); - -const { html, links } = await prerender(, { maxDepth: 10 }); -``` - -### `hydrate.js` - -`hydrate()` is a thin wrapper around Preact's hydrate() method. It performs hydration when the HTML for the current page includes pre-rendered output from `prerender()`. It falls back to plain rendering in any other cases, which is useful if you're not pre-rendering during development. This method also checks to make sure its running in a browser context before attempting any rendering - if not, it does nothing. - -```js -import { hydrate } from 'preact-iso'; - -const App = () => ( -

    -

    Hello World

    -
    -); - -hydrate(); -``` - -### `router.js` - -A simple router for Preact with conventional and hooks-based APIs. The `` component is async-aware: when transitioning from one route to another, if the incoming route suspends (throws a Promise), the outgoing route is preserved until the new one becomes ready. - -```js -import { ErrorBoundary, lazy, LocationProvider, Router, useLocation } from 'preact-iso'; - -// Asynchronous (throws a promise) -const Home = lazy(() => import('./routes/home.js')); -const Profile = lazy(() => import('./routes/profile.js')); -const Profiles = lazy(() => import('./routes/profiles.js')); - -const App = () => ( - - - - - - - - - -); -``` - -During prerendering, the generated HTML includes our full `` and `` component output because it waits for the `lazy()`-wrapped `import()` to resolve. - -You can use the `useRoute` hook to get information of the route you are currently on. - -**Progressive Hydration:** When the app is hydrated on the client, the route (`Home` or `Profile` in this case) suspends. This causes hydration for that part of the page to be deferred until the route's `import()` is resolved, at which point that part of the page automatically finishes hydrating. - -**Seamless Routing:** Switch switching between routes on the client, the Router is aware of asynchronous dependencies in routes. Instead of clearing the current route and showing a loading spinner while waiting for the next route (or its data), the router preserves the current route in-place until the incoming route has finished loading, then they are swapped. - -### Nested Routing - -Nested routes are supported by using multiple `Router` components. Partially matched routes end with a wildcard `/*` and the remaining value will be past to continue matching with if there are any further routes. - -```jsx -import { ErrorBoundary, LocationProvider, Router, Route } from 'preact-iso'; - -function ProfileA() { - return

    A

    ; -} - -function ProfileB() { - return

    B

    ; -} - -function Profile() { - return ( -
    -

    Profile

    - - - - - - -
    - ); -} - -const App = () => ( - - - - - - - - -); -``` diff --git a/preact-iso/bun.lockb b/preact-iso/bun.lockb deleted file mode 100755 index 2525bb1609ddcf0189009de7aa3f450d405eb51e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138621 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 Izwkf*1H=gF&;S4c diff --git a/preact-iso/jsconfig.json b/preact-iso/jsconfig.json deleted file mode 100644 index d8885de..0000000 --- a/preact-iso/jsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "noEmit": true, - "allowJs": true, - "checkJs": true - } -} diff --git a/preact-iso/package.json b/preact-iso/package.json deleted file mode 100644 index 188bff2..0000000 --- a/preact-iso/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "preact-iso", - "version": "2.4.0", - "type": "module", - "main": "src/index.js", - "module": "src/index.js", - "types": "src/index.d.ts", - "exports": { - ".": "./src/index.js", - "./router": "./src/router.js", - "./lazy": "./src/lazy.js", - "./prerender": "./src/prerender.js", - "./hydrate": "./src/hydrate.js" - }, - "license": "MIT", - "description": "Isomorphic utilities for Preact", - "author": "The Preact Authors (https://preactjs.com)", - "repository": { - "type": "git", - "url": "git+https://github.com/preactjs/preact-iso.git" - }, - "files": [ - "src", - "LICENSE", - "package.json", - "README.md" - ], - "scripts": { - "test": "node --experimental-vm-modules node_modules/.bin/jest" - }, - "jest": { - "testEnvironment": "jsdom", - "testEnvironmentOptions": { - "customExportConditions": [ - "node", - "node-addons" - ] - } - }, - "peerDependencies": { - "preact": ">=10", - "preact-render-to-string": ">=5" - }, - "peerDependenciesMeta": { - "preact-render-to-string": { - "optional": true - } - }, - "devDependencies": { - "htm": "^3.1.1", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "jsdom": "^22.1.0", - "preact": "10.15.1", - "preact-render-to-string": "^6.2.2" - } -} \ No newline at end of file diff --git a/preact-iso/src/hydrate.d.ts b/preact-iso/src/hydrate.d.ts deleted file mode 100644 index ace9158..0000000 --- a/preact-iso/src/hydrate.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ComponentChild } from 'preact'; - -export default function hydrate(jsx: ComponentChild, parent?: Element | Document | ShadowRoot | DocumentFragment): void; diff --git a/preact-iso/src/hydrate.js b/preact-iso/src/hydrate.js deleted file mode 100644 index 68d9375..0000000 --- a/preact-iso/src/hydrate.js +++ /dev/null @@ -1,17 +0,0 @@ -import { render, hydrate as hydrativeRender } from 'preact'; - -let initialized; - -/** @type {typeof render} */ -export default function hydrate(jsx, parent) { - if (typeof window === 'undefined') return; - let isodata = document.querySelector('script[type=isodata]'); - // @ts-ignore-next - parent = parent || (isodata && isodata.parentNode) || document.body; - if (!initialized && isodata) { - hydrativeRender(jsx, parent); - } else { - render(jsx, parent); - } - initialized = true; -} diff --git a/preact-iso/src/index.d.ts b/preact-iso/src/index.d.ts deleted file mode 100644 index 70ba4a2..0000000 --- a/preact-iso/src/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { default as prerender } from './prerender.js'; -export * from './router.js'; -export { default as lazy, ErrorBoundary } from './lazy.js'; -export { default as hydrate } from './hydrate.js'; diff --git a/preact-iso/src/index.js b/preact-iso/src/index.js deleted file mode 100644 index 3bfc751..0000000 --- a/preact-iso/src/index.js +++ /dev/null @@ -1,7 +0,0 @@ -export { Router, LocationProvider, useLocation, Route, useRoute } from './router.js'; -export { default as lazy, ErrorBoundary } from './lazy.js'; -export { default as hydrate } from './hydrate.js'; - -export function prerender(vnode, options) { - return import('./prerender.js').then(m => m.default(vnode, options)); -} diff --git a/preact-iso/src/lazy.d.ts b/preact-iso/src/lazy.d.ts deleted file mode 100644 index 829cdf3..0000000 --- a/preact-iso/src/lazy.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ComponentChildren, VNode } from 'preact'; - -export default function lazy(load: () => Promise<{ default: T } | T>): T; - -export function ErrorBoundary(props: { children?: ComponentChildren; onError?: (error: Error) => void }): VNode; diff --git a/preact-iso/src/lazy.js b/preact-iso/src/lazy.js deleted file mode 100644 index 9670e8d..0000000 --- a/preact-iso/src/lazy.js +++ /dev/null @@ -1,43 +0,0 @@ -import { h, options } from 'preact'; -import { useState, useRef } from 'preact/hooks'; - -export default function lazy(load) { - let p, c; - return props => { - const [, update] = useState(0); - const r = useRef(c); - if (!p) p = load().then(m => (c = (m && m.default) || m)); - if (c !== undefined) return h(c, props); - if (!r.current) r.current = p.then(() => update(1)); - throw p; - }; -} - -// See https://github.com/preactjs/preact/blob/88680e91ec0d5fc29d38554a3e122b10824636b6/compat/src/suspense.js#L5 -const oldCatchError = options.__e; -options.__e = (err, newVNode, oldVNode) => { - if (err && err.then) { - let v = newVNode; - while ((v = v.__)) { - if (v.__c && v.__c.__c) { - if (newVNode.__e == null) { - newVNode.__e = oldVNode.__e; // ._dom - newVNode.__k = oldVNode.__k; // ._children - } - if (!newVNode.__k) newVNode.__k = []; - return v.__c.__c(err, newVNode); - } - } - } - if (oldCatchError) oldCatchError(err, newVNode, oldVNode); -}; - -export function ErrorBoundary(props) { - this.__c = childDidSuspend; - this.componentDidCatch = props.onError; - return props.children; -} - -function childDidSuspend(err) { - err.then(() => this.forceUpdate()); -} diff --git a/preact-iso/src/prerender.d.ts b/preact-iso/src/prerender.d.ts deleted file mode 100644 index 2475644..0000000 --- a/preact-iso/src/prerender.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { VNode } from "preact"; - -export interface PrerenderOptions { - props?: Record; -} - -export interface PrerenderResult { - html: string; - links?: Set; -} - -export default function prerender( - vnode: VNode, - options?: PrerenderOptions -): Promise; diff --git a/preact-iso/src/prerender.js b/preact-iso/src/prerender.js deleted file mode 100644 index f36318b..0000000 --- a/preact-iso/src/prerender.js +++ /dev/null @@ -1,48 +0,0 @@ -import { h, options, cloneElement } from "preact"; -import { renderToStringAsync } from "preact-render-to-string"; - -let vnodeHook; - -const old = options.vnode; -options.vnode = (vnode) => { - if (old) old(vnode); - if (vnodeHook) vnodeHook(vnode); -}; - -/** - * @param {ReturnType} vnode The root JSX element to render (eg: ``) - * @param {object} [options] - * @param {object} [options.props] Additional props to merge into the root JSX element - */ -export default async function prerender(vnode, options) { - options = options || {}; - - const props = options.props; - - if (typeof vnode === "function") { - vnode = h(vnode, props); - } else if (props) { - vnode = cloneElement(vnode, props); - } - - let links = new Set(); - vnodeHook = ({ type, props }) => { - if ( - type === "a" && - props && - props.href && - (!props.target || props.target === "_self") - ) { - links.add(props.href); - } - }; - - try { - const html = `${await renderToStringAsync( - vnode - )}`; - return { html, links }; - } finally { - vnodeHook = null; - } -} diff --git a/preact-iso/src/router.d.ts b/preact-iso/src/router.d.ts deleted file mode 100644 index 6180823..0000000 --- a/preact-iso/src/router.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { AnyComponent, FunctionComponent, VNode } from 'preact'; - -export const LocationProvider: FunctionComponent; - -export function Router(props: { - onRouteChange?: (url: string) => void; - onLoadEnd?: (url: string) => void; - onLoadStart?: (url: string) => void; - children?: VNode[]; -}): VNode; - -interface LocationHook { - url: string; - path: string; - query: Record; - route: (url: string, replace?: boolean) => void; -} -export const useLocation: () => LocationHook; - -export const useRoute: () => { - path: string; - query: Record; - params: Record; -}; - -interface RoutableProps { - path?: string; - default?: boolean; -} - -export interface RouteProps extends RoutableProps { - component: AnyComponent; -} - -export function Route(props: RouteProps & Partial): VNode; - -declare module 'preact' { - namespace JSX { - interface IntrinsicAttributes extends RoutableProps {} - } - interface Attributes extends RoutableProps {} -} diff --git a/preact-iso/src/router.js b/preact-iso/src/router.js deleted file mode 100644 index 748c0db..0000000 --- a/preact-iso/src/router.js +++ /dev/null @@ -1,216 +0,0 @@ -import { h, createContext, cloneElement, toChildArray } from 'preact'; -import { useContext, useMemo, useReducer, useLayoutEffect, useRef } from 'preact/hooks'; - -let push; -const UPDATE = (state, url) => { - push = undefined; - if (url && url.type === 'click') { - // ignore events the browser takes care of already: - if (url.ctrlKey || url.metaKey || url.altKey || url.shiftKey || url.button !== 0) { - return state; - } - - const link = url.target.closest('a[href]'); - if ( - !link || - link.origin != location.origin || - /^#/.test(link.getAttribute('href')) || - !/^(_?self)?$/i.test(link.target) - ) { - return state; - } - - push = true; - url.preventDefault(); - url = link.href.replace(location.origin, ''); - } else if (typeof url === 'string') { - push = true; - } else if (url && url.url) { - push = !url.replace; - url = url.url; - } else { - url = location.pathname + location.search; - } - - if (push === true) history.pushState(null, '', url); - else if (push === false) history.replaceState(null, '', url); - return url; -}; - -export const exec = (url, route, matches) => { - url = url.split('/').filter(Boolean); - route = (route || '').split('/').filter(Boolean); - for (let i = 0, val, rest; i < Math.max(url.length, route.length); i++) { - let [, m, param, flag] = (route[i] || '').match(/^(:?)(.*?)([+*?]?)$/); - val = url[i]; - // segment match: - if (!m && param == val) continue; - // /foo/* match - if (!m && val && flag == '*') { - matches.rest = '/' + url.slice(i).map(decodeURIComponent).join('/'); - break; - } - // segment mismatch / missing required field: - if (!m || (!val && flag != '?' && flag != '*')) return; - rest = flag == '+' || flag == '*'; - // rest (+/*) match: - if (rest) val = url.slice(i).map(decodeURIComponent).join('/'); - // normal/optional field: - else if (val) val = decodeURIComponent(val); - matches.params[param] = val; - if (!(param in matches)) matches[param] = val; - if (rest) break; - } - return matches; -}; - -export function LocationProvider(props) { - const [url, route] = useReducer(UPDATE, props.url || location.pathname + location.search); - const wasPush = push === true; - - const value = useMemo(() => { - const u = new URL(url, location.origin); - const path = u.pathname.replace(/(.)\/$/g, '$1'); - // @ts-ignore-next - return { - url, - path, - query: Object.fromEntries(u.searchParams), - route: (url, replace) => route({ url, replace }), - wasPush - }; - }, [url]); - - useLayoutEffect(() => { - addEventListener('click', route); - addEventListener('popstate', route); - - return () => { - removeEventListener('click', route); - removeEventListener('popstate', route); - }; - }, []); - - // @ts-ignore - return h(LocationProvider.ctx.Provider, { value }, props.children); -} - -const RESOLVED = Promise.resolve(); -export function Router(props) { - const [c, update] = useReducer(c => c + 1, 0); - - const { url, query, wasPush, path } = useLocation(); - const { rest = path, params = {} } = useContext(RouteContext); - - const isLoading = useRef(false); - const prevRoute = useRef(path); - // Monotonic counter used to check if an un-suspending route is still the current route: - const count = useRef(0); - // The current route: - const cur = useRef(); - // Previous route (if current route is suspended): - const prev = useRef(); - // A not-yet-hydrated DOM root to remove once we commit: - const pendingBase = useRef(); - // has this component ever successfully rendered without suspending: - const hasEverCommitted = useRef(false); - // was the most recent render successful (did not suspend): - const didSuspend = useRef(); - didSuspend.current = false; - - cur.current = useMemo(() => { - // This hack prevents Preact from diffing when we swap `cur` to `prev`: - if (this.__v && this.__v.__k) this.__v.__k.reverse(); - - count.current++; - - prev.current = cur.current; - - let p, d, m; - toChildArray(props.children).some(vnode => { - const matches = exec(rest, vnode.props.path, (m = { path: rest, query, params, rest: '' })); - if (matches) return (p = cloneElement(vnode, m)); - if (vnode.props.default) d = cloneElement(vnode, m); - }); - - return h(RouteContext.Provider, { value: m }, p || d); - }, [url]); - - // Reset previous children - if rendering succeeds synchronously, we shouldn't render the previous children. - const p = prev.current; - prev.current = null; - - // This borrows the _childDidSuspend() solution from compat. - this.__c = e => { - // Mark the current render as having suspended: - didSuspend.current = true; - - // The new route suspended, so keep the previous route around while it loads: - prev.current = p; - - // Fire an event saying we're waiting for the route: - if (props.onLoadStart) props.onLoadStart(url); - isLoading.current = true; - - // Re-render on unsuspend: - let c = count.current; - e.then(() => { - // Ignore this update if it isn't the most recently suspended update: - if (c !== count.current) return; - - // Successful route transition: un-suspend after a tick and stop rendering the old route: - prev.current = null; - RESOLVED.then(update); - }); - }; - - useLayoutEffect(() => { - const currentDom = this.__v && this.__v.__e; - - // Ignore suspended renders (failed commits): - if (didSuspend.current) { - // If we've never committed, mark any hydration DOM for removal on the next commit: - if (!hasEverCommitted.current && !pendingBase.current) { - pendingBase.current = currentDom; - } - return; - } - - // If this is the first ever successful commit and we didn't use the hydration DOM, remove it: - if (!hasEverCommitted.current && pendingBase.current) { - if (pendingBase.current !== currentDom) pendingBase.current.remove(); - pendingBase.current = null; - } - - // Mark the component has having committed: - hasEverCommitted.current = true; - - // The route is loaded and rendered. - if (prevRoute.current !== path) { - if (wasPush) scrollTo(0, 0); - if (props.onLoadEnd && isLoading.current) props.onLoadEnd(url); - if (props.onRouteChange) props.onRouteChange(url); - - isLoading.current = false; - prevRoute.current = path; - } - }, [path, wasPush, c]); - - // Note: curChildren MUST render first in order to set didSuspend & prev. - return [h(RenderRef, { r: cur }), h(RenderRef, { r: prev })]; -} - -// Lazily render a ref's current value: -const RenderRef = ({ r }) => r.current; - -Router.Provider = LocationProvider; - -/** @typedef {{ url: string, path: string, query: object, route, wasPush: boolean }} RouteInfo */ - -LocationProvider.ctx = createContext(/** @type {RouteInfo} */ ({})); -const RouteContext = createContext({}); - -export const Route = props => h(props.component, props); - -export const useLocation = () => useContext(LocationProvider.ctx); -export const useRoute = () => useContext(RouteContext); diff --git a/preact-iso/test/match.test.js b/preact-iso/test/match.test.js deleted file mode 100644 index 1576528..0000000 --- a/preact-iso/test/match.test.js +++ /dev/null @@ -1,107 +0,0 @@ -import { describe, it, expect } from '@jest/globals'; -import { exec } from '../src/router.js'; - -function execPath(path, pattern, opts) { - return exec(path, pattern, { path, query: {}, params: {}, ...(opts || {}) }); -} - -describe('match', () => { - it('Base route', () => { - const accurateResult = execPath('/', '/'); - expect(accurateResult).toEqual({ path: '/', params: {}, query: {} }); - - const inaccurateResult = execPath('/user/1', '/'); - expect(inaccurateResult).toEqual(undefined); - }); - - it('Param route', () => { - const accurateResult = execPath('/user/2', '/user/:id'); - expect(accurateResult).toEqual({ path: '/user/2', params: { id: '2' }, id: '2', query: {} }); - - const inaccurateResult = execPath('/', '/user/:id'); - expect(inaccurateResult).toEqual(undefined); - }); - - it('Param rest segment', () => { - const accurateResult = execPath('/user/foo', '/user/*'); - expect(accurateResult).toEqual({ path: '/user/foo', params: {}, query: {}, rest: '/foo' }); - - const inaccurateResult = execPath('/', '/user/:id/*'); - expect(inaccurateResult).toEqual(undefined); - }); - - it('Param route with rest segment', () => { - const accurateResult = execPath('/user/2/foo', '/user/:id/*'); - expect(accurateResult).toEqual({ path: '/user/2/foo', params: { id: '2' }, id: '2', query: {}, rest: '/foo' }); - - const accurateResult2 = execPath('/user/2/foo/bar/bob', '/user/:id/*'); - expect(accurateResult2).toEqual({ - path: '/user/2/foo/bar/bob', - params: { id: '2' }, - id: '2', - query: {}, - rest: '/foo/bar/bob' - }); - - const inaccurateResult = execPath('/', '/user/:id/*'); - expect(inaccurateResult).toEqual(undefined); - }); - - it('Optional param route', () => { - const accurateResult = execPath('/user', '/user/:id?'); - expect(accurateResult).toEqual({ path: '/user', params: { id: undefined }, id: undefined, query: {} }); - - const inaccurateResult = execPath('/', '/user/:id?'); - expect(inaccurateResult).toEqual(undefined); - }); - - it('Optional rest param route "/:x*"', () => { - const accurateResult = execPath('/user', '/user/:id?'); - expect(accurateResult).toEqual({ path: '/user', params: { id: undefined }, id: undefined, query: {} }); - - const inaccurateResult = execPath('/', '/user/:id?'); - expect(inaccurateResult).toEqual(undefined); - }); - - it('Rest param route "/:x+"', () => { - const matchedResult = execPath('/user/foo', '/user/:id+'); - expect(matchedResult).toEqual({ path: '/user/foo', params: { id: 'foo' }, id: 'foo', query: {} }); - - const matchedResultWithSlash = execPath('/user/foo/bar', '/user/:id+'); - expect(matchedResultWithSlash).toEqual({ - path: '/user/foo/bar', - params: { id: 'foo/bar' }, - id: 'foo/bar', - query: {} - }); - - const emptyResult = execPath('/user', '/user/:id+'); - expect(emptyResult).toEqual(undefined); - - const mismatchedResult = execPath('/', '/user/:id+'); - expect(mismatchedResult).toEqual(undefined); - }); - - it('Handles leading/trailing slashes', () => { - const result = execPath('/about-late/_SEGMENT1_/_SEGMENT2_/', '/about-late/:seg1/:seg2/'); - expect(result).toEqual({ - path: '/about-late/_SEGMENT1_/_SEGMENT2_/', - params: { - seg1: '_SEGMENT1_', - seg2: '_SEGMENT2_' - }, - seg1: '_SEGMENT1_', - seg2: '_SEGMENT2_', - query: {} - }); - }); - - it('should not overwrite existing properties', () => { - const result = execPath('/foo/bar', '/:path/:query', { path: '/custom-path' }); - expect(result).toEqual({ - params: { path: 'foo', query: 'bar' }, - path: '/custom-path', - query: {} - }); - }); -}); diff --git a/preact-iso/test/router.test.js b/preact-iso/test/router.test.js deleted file mode 100644 index e1f4bf5..0000000 --- a/preact-iso/test/router.test.js +++ /dev/null @@ -1,535 +0,0 @@ -import { jest, describe, it, beforeEach, expect } from '@jest/globals'; -import { h, render } from 'preact'; -import { html } from 'htm/preact'; -import { LocationProvider, Router, useLocation, Route, useRoute } from '../src/router.js'; -import lazy, { ErrorBoundary } from '../src/lazy.js'; - -Object.defineProperty(window, 'scrollTo', { value() {} }); - -const sleep = ms => new Promise(r => setTimeout(r, ms)); - -// delayed lazy() -const groggy = (component, ms) => lazy(() => sleep(ms).then(() => component)); - -describe('Router', () => { - let scratch; - beforeEach(() => { - if (scratch) { - render(null, scratch); - scratch.remove(); - } - scratch = document.createElement('scratch'); - document.body.appendChild(scratch); - history.replaceState(null, null, '/'); - }); - - it('should switch between synchronous routes', async () => { - const Home = jest.fn(() => html`

    Home

    `); - const Profiles = jest.fn(() => html`

    Profiles

    `); - const Profile = jest.fn(({ params }) => html`

    Profile: ${params.id}

    `); - const Fallback = jest.fn(() => html`

    Fallback

    `); - const stack = []; - let loc; - render( - html` - <${LocationProvider}> - <${Router} - onRouteChange=${url => { - stack.push(url); - }} - > - <${Home} path="/" /> - <${Profiles} path="/profiles" /> - <${Profile} path="/profiles/:id" /> - <${Fallback} default /> - - <${() => { - loc = useLocation(); - }} /> - - `, - scratch - ); - - expect(scratch).toHaveProperty('textContent', 'Home'); - expect(Home).toHaveBeenCalledWith({ path: '/', query: {}, params: {}, rest: '' }, expect.anything()); - expect(Profiles).not.toHaveBeenCalled(); - expect(Profile).not.toHaveBeenCalled(); - expect(Fallback).not.toHaveBeenCalled(); - expect(loc).toMatchObject({ - url: '/', - path: '/', - query: {}, - route: expect.any(Function) - }); - - Home.mockReset(); - loc.route('/profiles'); - await sleep(1); - - expect(scratch).toHaveProperty('textContent', 'Profiles'); - expect(Home).not.toHaveBeenCalled(); - expect(Profiles).toHaveBeenCalledWith({ path: '/profiles', query: {}, params: {}, rest: '' }, expect.anything()); - expect(Profile).not.toHaveBeenCalled(); - expect(Fallback).not.toHaveBeenCalled(); - - expect(loc).toMatchObject({ - url: '/profiles', - path: '/profiles', - query: {} - }); - - Profiles.mockReset(); - loc.route('/profiles/bob'); - await sleep(1); - - expect(scratch).toHaveProperty('textContent', 'Profile: bob'); - expect(Home).not.toHaveBeenCalled(); - expect(Profiles).not.toHaveBeenCalled(); - expect(Profile).toHaveBeenCalledWith( - { path: '/profiles/bob', query: {}, params: { id: 'bob' }, id: 'bob', rest: '' }, - expect.anything() - ); - expect(Fallback).not.toHaveBeenCalled(); - - expect(loc).toMatchObject({ - url: '/profiles/bob', - path: '/profiles/bob', - query: {} - }); - - Profile.mockReset(); - loc.route('/other?a=b&c=d'); - await sleep(1); - - expect(scratch).toHaveProperty('textContent', 'Fallback'); - expect(Home).not.toHaveBeenCalled(); - expect(Profiles).not.toHaveBeenCalled(); - expect(Profile).not.toHaveBeenCalled(); - expect(Fallback).toHaveBeenCalledWith( - { default: true, path: '/other', query: { a: 'b', c: 'd' }, params: {}, rest: '' }, - expect.anything() - ); - - expect(loc).toMatchObject({ - url: '/other?a=b&c=d', - path: '/other', - query: { a: 'b', c: 'd' } - }); - expect(stack).toEqual(['/profiles', '/profiles/bob', '/other?a=b&c=d']); - }); - - it('should wait for asynchronous routes', async () => { - const route = name => html` -

    ${name}

    -

    hello

    - `; - const A = jest.fn(groggy(() => route('A'), 1)); - const B = jest.fn(groggy(() => route('B'), 1)); - const C = jest.fn(groggy(() => html`

    C

    `, 1)); - let loc; - render( - html` - <${ErrorBoundary}> - <${LocationProvider}> - <${Router}> - <${A} path="/" /> - <${B} path="/b" /> - <${C} path="/c" /> - - <${() => { - loc = useLocation(); - }} /> - - - `, - scratch - ); - - expect(scratch).toHaveProperty('innerHTML', ''); - expect(A).toHaveBeenCalledWith({ path: '/', query: {}, params: {}, rest: '' }, expect.anything()); - - A.mockClear(); - await sleep(10); - - expect(scratch).toHaveProperty('innerHTML', '

    A

    hello

    '); - expect(A).toHaveBeenCalledWith({ path: '/', query: {}, params: {}, rest: '' }, expect.anything()); - - A.mockClear(); - loc.route('/b'); - - expect(scratch).toHaveProperty('innerHTML', '

    A

    hello

    '); - expect(A).not.toHaveBeenCalled(); - - await sleep(1); - - expect(scratch).toHaveProperty('innerHTML', '

    A

    hello

    '); - // We should never re-invoke while loading (that would be a remount of the old route): - //expect(A).not.toHaveBeenCalled(); - //expect(B).toHaveBeenCalledWith({ path: '/b', query: {}, params: {}, rest: '' }, expect.anything()); - - B.mockClear(); - await sleep(10); - - expect(scratch).toHaveProperty('innerHTML', '

    B

    hello

    '); - expect(A).not.toHaveBeenCalled(); - expect(B).toHaveBeenCalledWith({ path: '/b', query: {}, params: {}, rest: '' }, expect.anything()); - - B.mockClear(); - loc.route('/c'); - loc.route('/c?1'); - loc.route('/c'); - - expect(scratch).toHaveProperty('innerHTML', '

    B

    hello

    '); - expect(B).not.toHaveBeenCalled(); - - await sleep(1); - - loc.route('/c'); - loc.route('/c?2'); - loc.route('/c'); - - expect(scratch).toHaveProperty('innerHTML', '

    B

    hello

    '); - // We should never re-invoke
    while loading (that would be a remount of the old route): - expect(B).not.toHaveBeenCalled(); - expect(C).toHaveBeenCalledWith({ path: '/c', query: {}, params: {}, rest: '' }, expect.anything()); - - C.mockClear(); - await sleep(10); - - expect(scratch).toHaveProperty('innerHTML', '

    C

    '); - expect(B).not.toHaveBeenCalled(); - expect(C).toHaveBeenCalledWith({ path: '/c', query: {}, params: {}, rest: '' }, expect.anything()); - - // "instant" routing to already-loaded routes - - C.mockClear(); - B.mockClear(); - loc.route('/b'); - await sleep(1); - - expect(scratch).toHaveProperty('innerHTML', '

    B

    hello

    '); - expect(C).not.toHaveBeenCalled(); - // expect(B).toHaveBeenCalledTimes(1); - expect(B).toHaveBeenCalledWith({ path: '/b', query: {}, params: {}, rest: '' }, expect.anything()); - - B.mockClear(); - loc.route('/'); - await sleep(1); - - expect(scratch).toHaveProperty('innerHTML', '

    A

    hello

    '); - expect(B).not.toHaveBeenCalled(); - // expect(A).toHaveBeenCalledTimes(1); - expect(A).toHaveBeenCalledWith({ path: '/', query: {}, params: {}, rest: '' }, expect.anything()); - }); - - describe('intercepted VS external links', () => { - const shouldIntercept = [null, '', '_self', 'self', '_SELF']; - const shouldNavigate = ['_top', '_parent', '_blank', 'custom', '_BLANK']; - - // prevent actual navigations (not implemented in JSDOM) - const clickHandler = jest.fn(e => e.preventDefault()); - - const Route = jest.fn( - () => html` -
    - ` - ); - - let pushState, loc; - - beforeAll(() => { - pushState = jest.spyOn(history, 'pushState'); - addEventListener('click', clickHandler); - }); - - afterAll(() => { - pushState.mockRestore(); - removeEventListener('click', clickHandler); - }); - - beforeEach(async () => { - render( - html` - <${LocationProvider}> - <${Router}> - <${Route} default /> - - <${() => { - loc = useLocation(); - }} /> - - `, - scratch - ); - await sleep(10); - Route.mockClear(); - clickHandler.mockClear(); - pushState.mockClear(); - }); - - const getName = target => (target == null ? 'no target attribute' : `target="${target}"`); - - // these should all be intercepted by the router. - for (const target of shouldIntercept) { - it(`should intercept clicks on links with ${getName(target)}`, async () => { - await sleep(10); - - const sel = target == null ? `a:not([target])` : `a[target="${target}"]`; - const el = scratch.querySelector(sel); - if (!el) throw Error(`Unable to find link: ${sel}`); - const url = el.getAttribute('href'); - el.click(); - await sleep(1); - expect(loc).toMatchObject({ url }); - expect(Route).toHaveBeenCalledTimes(1); - expect(pushState).toHaveBeenCalledWith(null, '', url); - expect(clickHandler).toHaveBeenCalled(); - }); - } - - // these should all navigate. - for (const target of shouldNavigate) { - it(`should allow default browser navigation for links with ${getName(target)}`, async () => { - await sleep(10); - - const sel = target == null ? `a:not([target])` : `a[target="${target}"]`; - const el = scratch.querySelector(sel); - if (!el) throw Error(`Unable to find link: ${sel}`); - el.click(); - await sleep(1); - expect(Route).not.toHaveBeenCalled(); - expect(pushState).not.toHaveBeenCalled(); - expect(clickHandler).toHaveBeenCalled(); - }); - } - }); - - it('should scroll to top when navigating forward', async () => { - const scrollTo = jest.spyOn(window, 'scrollTo'); - - const Route = jest.fn(() => html``); - let loc; - render( - html` - <${LocationProvider}> - <${Router}> - <${Route} default /> - - <${() => { - loc = useLocation(); - }} /> - - `, - scratch - ); - - await sleep(20); - - expect(scrollTo).not.toHaveBeenCalled(); - expect(Route).toHaveBeenCalledTimes(1); - Route.mockClear(); - - loc.route('/programmatic'); - await sleep(10); - expect(loc).toMatchObject({ url: '/programmatic' }); - expect(scrollTo).toHaveBeenCalledWith(0, 0); - expect(scrollTo).toHaveBeenCalledTimes(1); - expect(Route).toHaveBeenCalledTimes(1); - Route.mockClear(); - scrollTo.mockClear(); - - scratch.querySelector('a').click(); - await sleep(10); - expect(loc).toMatchObject({ url: '/link' }); - expect(scrollTo).toHaveBeenCalledWith(0, 0); - expect(scrollTo).toHaveBeenCalledTimes(1); - expect(Route).toHaveBeenCalledTimes(1); - Route.mockClear(); - - await sleep(10); - scrollTo.mockRestore(); - }); - - it('should ignore clicks on anchor links', async () => { - let loc; - const pushState = jest.spyOn(history, 'pushState'); - - const Route = jest.fn( - () => html` - - ` - ); - render( - html` - <${LocationProvider}> - <${Router}> - <${Route} path="/" /> - <${Route} path="/other" /> - <${Route} default /> - - <${() => { - loc = useLocation(); - }} /> - - `, - scratch - ); - - expect(Route).toHaveBeenCalledTimes(1); - Route.mockClear(); - await sleep(20); - - scratch.querySelector('a[href="#foo"]').click(); - await sleep(20); - // NOTE: we don't (currently) propagate in-page anchor navigations into context, to avoid useless renders. - expect(loc).toMatchObject({ url: '/' }); - expect(Route).not.toHaveBeenCalled(); - expect(pushState).not.toHaveBeenCalled(); - expect(location.hash).toEqual('#foo'); - - await sleep(10); - - scratch.querySelector('a[href="/other#bar"]').click(); - await sleep(10); - expect(Route).toHaveBeenCalledTimes(1); - expect(loc).toMatchObject({ url: '/other#bar', path: '/other' }); - expect(pushState).toHaveBeenCalled(); - expect(location.hash).toEqual('#bar'); - - pushState.mockRestore(); - }); - - it('should normalize children', async () => { - let loc; - const pushState = jest.spyOn(history, 'pushState'); - const Route = jest.fn(() => html`foo`); - - const routes = ['/foo', '/bar']; - render( - html` - <${LocationProvider}> - <${Router}> - ${routes.map(route => html`<${Route} path=${route} />`)} - <${Route} default /> - - <${() => { - loc = useLocation(); - }} /> - - `, - scratch - ); - - expect(Route).toHaveBeenCalledTimes(1); - Route.mockClear(); - await sleep(20); - - scratch.querySelector('a[href="/foo#foo"]').click(); - await sleep(20); - expect(Route).toHaveBeenCalledTimes(1); - expect(loc).toMatchObject({ url: '/foo#foo', path: '/foo' }); - expect(pushState).toHaveBeenCalled(); - - pushState.mockRestore(); - }); - - it('should match nested routes', async () => { - let route; - const Inner = () => html` - <${Router}> - <${Route} - path="/bob" - component=${() => { - route = useRoute(); - return null; - }} - /> - - `; - - render( - html` - <${LocationProvider}> - <${Router}> - <${Route} path="/foo/:id/*" component=${Inner} /> - - - - `, - scratch - ); - - scratch.querySelector('a[href="/foo/bar/bob"]').click(); - await sleep(20); - expect(route).toMatchObject({ path: '/bob', params: { id: 'bar' } }); - }); - - it('should append params in nested routes', async () => { - let params; - const Inner = () => html` - <${Router}> - <${Route} - path="/bob" - component=${() => { - params = useRoute().params; - return null; - }} - /> - - `; - - render( - html` - <${LocationProvider}> - <${Router}> - <${Route} path="/foo/:id/*" component=${Inner} /> - - - - `, - scratch - ); - - scratch.querySelector('a[href="/foo/bar/bob"]').click(); - await sleep(20); - expect(params).toMatchObject({ id: 'bar' }); - }); - - it('should replace the current URL', async () => { - const pushState = jest.spyOn(history, 'pushState'); - const replaceState = jest.spyOn(history, 'replaceState'); - let loc; - - render( - html` - <${LocationProvider}> - <${Router}> - <${Route} path="/foo" component=${() => null} /> - - <${() => { - loc = useLocation(); - }} /> - - `, - scratch - ); - - await sleep(20); - loc.route("/foo", true); - expect(pushState).not.toHaveBeenCalled(); - expect(replaceState).toHaveBeenCalledWith(null, "", "/foo"); - - pushState.mockRestore(); - replaceState.mockRestore(); - }); -}); diff --git a/preact-iso/yarn.lock b/preact-iso/yarn.lock deleted file mode 100644 index b286172..0000000 --- a/preact-iso/yarn.lock +++ /dev/null @@ -1,2578 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" - integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.0" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== - -"@babel/helpers@^7.23.0": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" - integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - 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" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/template@^7.22.15", "@babel/template@^7.3.3": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" - integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@types/babel__core@^7.1.14": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" - integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" - integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" - integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" - integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== - dependencies: - "@babel/types" "^7.20.7" - -"@types/graceful-fs@^4.1.3": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" - integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" - integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" - integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jsdom@^20.0.0": - version "20.0.1" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" - integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== - dependencies: - "@types/node" "*" - "@types/tough-cookie" "*" - parse5 "^7.0.0" - -"@types/node@*": - version "20.8.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.2.tgz#d76fb80d87d0d8abfe334fc6d292e83e5524efc4" - integrity sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/tough-cookie@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" - integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== - -"@types/yargs-parser@*": - version "21.0.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" - integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== - -"@types/yargs@^17.0.8": - version "17.0.26" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.26.tgz#388e5002a8b284ad7b4599ba89920a6d74d8d79a" - integrity sha512-Y3vDy2X6zw/ZCumcwLpdhM5L7jmyGpmBCTYMHDLqT2IKVMYRRLdv6ZakA+wxhra6Z/3bwhNbNl9bDGXaFU+6rw== - dependencies: - "@types/yargs-parser" "*" - -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -acorn-globals@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" - integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== - dependencies: - acorn "^8.1.0" - acorn-walk "^8.0.2" - -acorn-walk@^8.0.2: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.1.0, acorn@^8.8.1: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.9: - version "4.22.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== - dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001541: - version "1.0.30001546" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz#10fdad03436cfe3cc632d3af7a99a0fb497407f0" - integrity sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -cssstyle@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" - integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== - dependencies: - rrweb-cssom "^0.6.0" - -data-urls@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -data-urls@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" - integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^12.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decimal.js@^10.4.2, decimal.js@^10.4.3: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - -dedent@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" - integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -electron-to-chromium@^1.4.535: - version "1.4.543" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.543.tgz#51116ffc9fba1ee93514d6a40d34676aa6d7d1c4" - integrity sha512-t2ZP4AcGE0iKCCQCBx/K2426crYdxD3YU6l0uK2EO3FZH0pbC4pFz/sZm2ruZsND6hQBTcDWWlo/MLpiOdif5g== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - -htm@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" - integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ== - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-core-module@^2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== - dependencies: - has "^1.0.3" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" - integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-jsdom@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" - integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/jsdom" "^20.0.0" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - jsdom "^20.0.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsdom@^20.0.0: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" - integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== - dependencies: - abab "^2.0.6" - acorn "^8.8.1" - acorn-globals "^7.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.2" - decimal.js "^10.4.2" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" - parse5 "^7.1.1" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - ws "^8.11.0" - xml-name-validator "^4.0.0" - -jsdom@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" - integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== - dependencies: - abab "^2.0.6" - cssstyle "^3.0.0" - data-urls "^4.0.0" - decimal.js "^10.4.3" - domexception "^4.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.4" - parse5 "^7.1.2" - rrweb-cssom "^0.6.0" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^12.0.1" - ws "^8.13.0" - xml-name-validator "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.2, nwsapi@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@^7.0.0, parse5@^7.1.1, parse5@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -preact-render-to-string@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.2.2.tgz#eb086b6db5d57468ab2c184896884fb0a818245d" - integrity sha512-YDfXQiVeYZutFR8/DpxLSbW3W6b7GgjBExRBxOOqcjrGq5rA9cziitQdNPMZe4RVMSdfBnf4hYqyeLs/KvtIuA== - dependencies: - pretty-format "^3.8.0" - -preact@10.15.1: - version "10.15.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.15.1.tgz#a1de60c9fc0c79a522d969c65dcaddc5d994eede" - integrity sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g== - -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-format@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" - integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.1, punycode@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pure-rand@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" - integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.20.0: - version "1.22.6" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" - integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rrweb-cssom@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" - integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" - integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== - dependencies: - xmlchars "^2.2.0" - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "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== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - -tr46@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" - integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== - dependencies: - punycode "^2.3.0" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -v8-to-istanbul@^9.0.1: - version "9.1.3" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" - integrity sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -w3c-xmlserializer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" - integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== - dependencies: - xml-name-validator "^4.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -whatwg-url@^12.0.0, whatwg-url@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" - integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== - dependencies: - tr46 "^4.1.1" - webidl-conversions "^7.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^8.11.0, ws@^8.13.0: - version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" - integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==