From 1a217da7ca95cecff26699e44697b215e75b0475 Mon Sep 17 00:00:00 2001 From: Jared Date: Mon, 6 Jan 2025 01:58:53 -0700 Subject: [PATCH] Rewrite the docs site to use Astro instead of NextJS This commit also does the following: - Removes ads - Adds search - Adds a new JSON based documentation system - Removes translations --- .env.example | 3 +- .eslintrc | 17 - .github/question.png | Bin 16754 -> 0 bytes .gitignore | 5 +- .gitmodules | 4 - .npmrc | 3 + Custom Markdown.md | 45 - Jenkinsfile | 29 +- LICENSE | 2 +- README.md | 182 +- biome.json | 33 + crowdin.yml | 22 - docs/versions.json | 38 + nginx.conf | 23 +- package-lock.json | 5975 ---------------- package.json | 76 +- packages/docs-build/package.json | 32 + packages/docs-build/src/index.ts | 304 + packages/docs-build/src/util.ts | 208 + packages/docs-build/tsconfig.json | 21 + packages/docs-build/tsup.config.ts | 11 + packages/docs-model/package.json | 21 + packages/docs-model/src/Comment.ts | 248 + packages/docs-model/src/Extra.ts | 278 + packages/docs-model/src/Member.ts | 1009 +++ packages/docs-model/src/Page.ts | 434 ++ packages/docs-model/src/Type.ts | 395 + packages/docs-model/src/Util.ts | 124 + packages/docs-model/src/index.ts | 7 + packages/docs-model/src/types.d.ts | 327 + packages/docs-model/tsconfig.json | 17 + packages/docs-model/tsup.config.ts | 11 + packages/docs-search/docker-compose.yml | 10 + packages/docs-search/package.json | 29 + packages/docs-search/src/generate.ts | 6 + packages/docs-search/src/index.ts | 165 + packages/docs-search/tsconfig.json | 21 + packages/docs-search/tsup.config.ts | 11 + packages/docs-site/.gitignore | 27 + packages/docs-site/astro.config.ts | 47 + packages/docs-site/ec.config.mjs | 41 + packages/docs-site/package.json | 48 + .../src/components/ComponentLogic.astro | 7 + .../src/components/ComponentLogic.ts | 515 ++ .../src/components/ComponentProvider.astro | 23 + .../docs-site/src/components/Search.astro | 28 + .../src/components/icons/CraftTweaker.astro | 92 + .../src/components/icons/CurseForge.astro | 12 + .../src/components/icons/Discord.astro | 13 + .../src/components/icons/Github.astro | 13 + .../src/components/icons/Modrinth.astro | 11 + .../src/components/markdown/Group.astro | 71 + .../src/components/markdown/InlineCode.astro | 9 + .../src/components/markdown/Markdown.astro | 9 + .../src/components/nav/NavIcon.astro | 12 + .../docs-site/src/components/nav/Navbar.astro | 50 + .../src/components/nav/PageNav.astro | 36 + .../src/components/nav/side/NavFolder.astro | 46 + .../src/components/nav/side/NavItem.astro | 26 + .../src/components/nav/side/SideNav.astro | 27 + .../nav/side/SideNavController.astro | 4 + .../src/components/page/EnumPage.astro | 33 + .../src/components/page/EventPage.astro | 34 + .../src/components/page/Heading.astro | 20 + .../src/components/page/MarkdownPage.astro | 15 + .../src/components/page/TypePage.astro | 33 + .../page/components/comments/Comment.astro | 55 + .../page/components/comments/Comments.astro | 12 + .../comments/type/BoldComment.astro | 12 + .../comments/type/CodeComment.astro | 14 + .../comments/type/ItalicsComment.astro | 12 + .../comments/type/LinkComment.astro | 42 + .../comments/type/ListComment.astro | 14 + .../comments/type/ListItemComment.astro | 14 + .../comments/type/NewLineComment.astro | 9 + .../comments/type/ParagraphComment.astro | 18 + .../comments/type/PlaintextComment.astro | 26 + .../comments/type/RootComment.astro | 12 + .../components/members/ConstructorGroup.astro | 34 + .../page/components/members/Member.astro | 42 + .../page/components/members/MemberGroup.astro | 91 + .../components/members/OperatorGroup.astro | 53 + .../page/components/members/Returns.astro | 31 + .../members/type/CasterMember.astro | 30 + .../members/type/ConstructorMember.astro | 51 + .../components/members/type/FieldMember.astro | 32 + .../members/type/GetterMember.astro | 30 + .../members/type/MethodMember.astro | 63 + .../members/type/OperatorMember.astro | 141 + .../members/type/SetterMember.astro | 43 + .../components/parameters/Parameter.astro | 44 + .../components/parameters/Parameters.astro | 29 + .../page/components/types/Type.astro | 64 + .../components/types/TypeParameters.astro | 21 + .../components/types/type/ArrayType.astro | 11 + .../components/types/type/BasicType.astro | 10 + .../components/types/type/GenericType.astro | 13 + .../page/components/types/type/JavaType.astro | 25 + .../types/type/overrides/ConsumerType.astro | 20 + .../types/type/overrides/FunctionType.astro | 28 + .../types/type/overrides/MapType.astro | 12 + .../types/type/overrides/PredicateType.astro | 21 + .../components/page/parts/Constructors.astro | 31 + .../components/page/parts/Description.astro | 22 + .../components/page/parts/EnumConstants.astro | 53 + .../page/parts/EventListening.astro | 18 + .../components/page/parts/EventParent.astro | 20 + .../src/components/page/parts/Extends.astro | 34 + .../components/page/parts/Implements.astro | 62 + .../src/components/page/parts/Importing.astro | 16 + .../src/components/page/parts/Loaders.astro | 37 + .../src/components/page/parts/Members.astro | 41 + .../src/components/page/parts/Operators.astro | 29 + .../src/components/theme/ThemeHolder.astro | 28 + .../src/components/util/MaybeLink.astro | 12 + .../components/version/VersionSelector.astro | 37 + packages/docs-site/src/content.config.ts | 14 + packages/docs-site/src/env.d.ts | 21 + packages/docs-site/src/icons/chevron-left.svg | 1 + .../docs-site/src/icons/chevron-right.svg | 1 + packages/docs-site/src/icons/link.svg | 1 + packages/docs-site/src/icons/menu.svg | 1 + packages/docs-site/src/icons/minus.svg | 1 + packages/docs-site/src/icons/moon.svg | 1 + packages/docs-site/src/icons/plus.svg | 1 + packages/docs-site/src/icons/search.svg | 1 + packages/docs-site/src/icons/sun.svg | 1 + packages/docs-site/src/icons/x.svg | 1 + packages/docs-site/src/layouts/Layout.astro | 85 + packages/docs-site/src/middleware.ts.d | 12 + .../src/pages/[version]/en/[...slug].astro | 155 + .../docs-site/src/pages/[version]/index.astro | 15 + packages/docs-site/src/pages/index.astro | 4 + packages/docs-site/src/styles/index.css | 293 + packages/docs-site/src/styles/markdown.css | 129 + packages/docs-site/src/util/Constants.ts | 13 + packages/docs-site/src/util/WebSafeUtil.ts | 49 + packages/docs-site/tailwind.config.mjs | 74 + packages/docs-site/todo.txt | 2 + packages/docs-site/tsconfig.json | 27 + packages/ec-copy-in-frame/package.json | 22 + packages/ec-copy-in-frame/src/index.ts | 146 + packages/ec-copy-in-frame/tsconfig.json | 19 + packages/ec-copy-in-frame/tsup.config.ts | 10 + packages/ec-default-frame-title/package.json | 23 + packages/ec-default-frame-title/src/index.ts | 26 + packages/ec-default-frame-title/tsconfig.json | 19 + .../ec-default-frame-title/tsup.config.ts | 10 + packages/ec-example-comment/package.json | 23 + packages/ec-example-comment/src/index.ts | 146 + packages/ec-example-comment/tsconfig.json | 19 + packages/ec-example-comment/tsup.config.ts | 10 + packages/ec-language-override/package.json | 21 + packages/ec-language-override/src/index.ts | 23 + packages/ec-language-override/tsconfig.json | 19 + packages/ec-language-override/tsup.config.ts | 10 + packages/ec-rainbow-brackets/package.json | 21 + packages/ec-rainbow-brackets/src/index.ts | 146 + packages/ec-rainbow-brackets/tsconfig.json | 19 + packages/ec-rainbow-brackets/tsup.config.ts | 10 + .../remark-inject-url-version/package.json | 26 + .../remark-inject-url-version/src/index.ts | 25 + .../remark-inject-url-version/tsconfig.json | 19 + .../remark-inject-url-version/tsup.config.ts | 10 + packages/remark-rehype-renderers/package.json | 27 + packages/remark-rehype-renderers/src/index.ts | 442 ++ .../remark-rehype-renderers/tsconfig.json | 19 + .../remark-rehype-renderers/tsup.config.ts | 10 + packages/remark-search/package.json | 27 + packages/remark-search/src/index.ts | 174 + packages/remark-search/tsconfig.json | 22 + packages/remark-search/tsup.config.ts | 10 + packages/remark-table/package.json | 24 + packages/remark-table/src/index.ts | 57 + packages/remark-table/tsconfig.json | 19 + packages/remark-table/tsup.config.ts | 10 + pnpm-lock.yaml | 6339 +++++++++++++++++ pnpm-workspace.yaml | 2 + site | 1 - tools/build.ts | 246 - tools/search_index.ts | 72 - tools/types.ts | 38 - tools/utils.ts | 264 - tsconfig.json | 20 +- 184 files changed, 15833 insertions(+), 6782 deletions(-) delete mode 100644 .eslintrc delete mode 100644 .github/question.png delete mode 100644 .gitmodules create mode 100644 .npmrc delete mode 100644 Custom Markdown.md create mode 100644 biome.json delete mode 100644 crowdin.yml create mode 100644 docs/versions.json delete mode 100644 package-lock.json create mode 100644 packages/docs-build/package.json create mode 100644 packages/docs-build/src/index.ts create mode 100644 packages/docs-build/src/util.ts create mode 100644 packages/docs-build/tsconfig.json create mode 100644 packages/docs-build/tsup.config.ts create mode 100644 packages/docs-model/package.json create mode 100644 packages/docs-model/src/Comment.ts create mode 100644 packages/docs-model/src/Extra.ts create mode 100644 packages/docs-model/src/Member.ts create mode 100644 packages/docs-model/src/Page.ts create mode 100644 packages/docs-model/src/Type.ts create mode 100644 packages/docs-model/src/Util.ts create mode 100644 packages/docs-model/src/index.ts create mode 100644 packages/docs-model/src/types.d.ts create mode 100644 packages/docs-model/tsconfig.json create mode 100644 packages/docs-model/tsup.config.ts create mode 100644 packages/docs-search/docker-compose.yml create mode 100644 packages/docs-search/package.json create mode 100644 packages/docs-search/src/generate.ts create mode 100644 packages/docs-search/src/index.ts create mode 100644 packages/docs-search/tsconfig.json create mode 100644 packages/docs-search/tsup.config.ts create mode 100644 packages/docs-site/.gitignore create mode 100644 packages/docs-site/astro.config.ts create mode 100644 packages/docs-site/ec.config.mjs create mode 100644 packages/docs-site/package.json create mode 100644 packages/docs-site/src/components/ComponentLogic.astro create mode 100644 packages/docs-site/src/components/ComponentLogic.ts create mode 100644 packages/docs-site/src/components/ComponentProvider.astro create mode 100644 packages/docs-site/src/components/Search.astro create mode 100644 packages/docs-site/src/components/icons/CraftTweaker.astro create mode 100644 packages/docs-site/src/components/icons/CurseForge.astro create mode 100644 packages/docs-site/src/components/icons/Discord.astro create mode 100644 packages/docs-site/src/components/icons/Github.astro create mode 100644 packages/docs-site/src/components/icons/Modrinth.astro create mode 100644 packages/docs-site/src/components/markdown/Group.astro create mode 100644 packages/docs-site/src/components/markdown/InlineCode.astro create mode 100644 packages/docs-site/src/components/markdown/Markdown.astro create mode 100644 packages/docs-site/src/components/nav/NavIcon.astro create mode 100644 packages/docs-site/src/components/nav/Navbar.astro create mode 100644 packages/docs-site/src/components/nav/PageNav.astro create mode 100644 packages/docs-site/src/components/nav/side/NavFolder.astro create mode 100644 packages/docs-site/src/components/nav/side/NavItem.astro create mode 100644 packages/docs-site/src/components/nav/side/SideNav.astro create mode 100644 packages/docs-site/src/components/nav/side/SideNavController.astro create mode 100644 packages/docs-site/src/components/page/EnumPage.astro create mode 100644 packages/docs-site/src/components/page/EventPage.astro create mode 100644 packages/docs-site/src/components/page/Heading.astro create mode 100644 packages/docs-site/src/components/page/MarkdownPage.astro create mode 100644 packages/docs-site/src/components/page/TypePage.astro create mode 100644 packages/docs-site/src/components/page/components/comments/Comment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/Comments.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/BoldComment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/CodeComment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/ItalicsComment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/LinkComment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/ListComment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/ListItemComment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/NewLineComment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/ParagraphComment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/PlaintextComment.astro create mode 100644 packages/docs-site/src/components/page/components/comments/type/RootComment.astro create mode 100644 packages/docs-site/src/components/page/components/members/ConstructorGroup.astro create mode 100644 packages/docs-site/src/components/page/components/members/Member.astro create mode 100644 packages/docs-site/src/components/page/components/members/MemberGroup.astro create mode 100644 packages/docs-site/src/components/page/components/members/OperatorGroup.astro create mode 100644 packages/docs-site/src/components/page/components/members/Returns.astro create mode 100644 packages/docs-site/src/components/page/components/members/type/CasterMember.astro create mode 100644 packages/docs-site/src/components/page/components/members/type/ConstructorMember.astro create mode 100644 packages/docs-site/src/components/page/components/members/type/FieldMember.astro create mode 100644 packages/docs-site/src/components/page/components/members/type/GetterMember.astro create mode 100644 packages/docs-site/src/components/page/components/members/type/MethodMember.astro create mode 100644 packages/docs-site/src/components/page/components/members/type/OperatorMember.astro create mode 100644 packages/docs-site/src/components/page/components/members/type/SetterMember.astro create mode 100644 packages/docs-site/src/components/page/components/parameters/Parameter.astro create mode 100644 packages/docs-site/src/components/page/components/parameters/Parameters.astro create mode 100644 packages/docs-site/src/components/page/components/types/Type.astro create mode 100644 packages/docs-site/src/components/page/components/types/TypeParameters.astro create mode 100644 packages/docs-site/src/components/page/components/types/type/ArrayType.astro create mode 100644 packages/docs-site/src/components/page/components/types/type/BasicType.astro create mode 100644 packages/docs-site/src/components/page/components/types/type/GenericType.astro create mode 100644 packages/docs-site/src/components/page/components/types/type/JavaType.astro create mode 100644 packages/docs-site/src/components/page/components/types/type/overrides/ConsumerType.astro create mode 100644 packages/docs-site/src/components/page/components/types/type/overrides/FunctionType.astro create mode 100644 packages/docs-site/src/components/page/components/types/type/overrides/MapType.astro create mode 100644 packages/docs-site/src/components/page/components/types/type/overrides/PredicateType.astro create mode 100644 packages/docs-site/src/components/page/parts/Constructors.astro create mode 100644 packages/docs-site/src/components/page/parts/Description.astro create mode 100644 packages/docs-site/src/components/page/parts/EnumConstants.astro create mode 100644 packages/docs-site/src/components/page/parts/EventListening.astro create mode 100644 packages/docs-site/src/components/page/parts/EventParent.astro create mode 100644 packages/docs-site/src/components/page/parts/Extends.astro create mode 100644 packages/docs-site/src/components/page/parts/Implements.astro create mode 100644 packages/docs-site/src/components/page/parts/Importing.astro create mode 100644 packages/docs-site/src/components/page/parts/Loaders.astro create mode 100644 packages/docs-site/src/components/page/parts/Members.astro create mode 100644 packages/docs-site/src/components/page/parts/Operators.astro create mode 100644 packages/docs-site/src/components/theme/ThemeHolder.astro create mode 100644 packages/docs-site/src/components/util/MaybeLink.astro create mode 100644 packages/docs-site/src/components/version/VersionSelector.astro create mode 100644 packages/docs-site/src/content.config.ts create mode 100644 packages/docs-site/src/env.d.ts create mode 100644 packages/docs-site/src/icons/chevron-left.svg create mode 100644 packages/docs-site/src/icons/chevron-right.svg create mode 100644 packages/docs-site/src/icons/link.svg create mode 100644 packages/docs-site/src/icons/menu.svg create mode 100644 packages/docs-site/src/icons/minus.svg create mode 100644 packages/docs-site/src/icons/moon.svg create mode 100644 packages/docs-site/src/icons/plus.svg create mode 100644 packages/docs-site/src/icons/search.svg create mode 100644 packages/docs-site/src/icons/sun.svg create mode 100644 packages/docs-site/src/icons/x.svg create mode 100644 packages/docs-site/src/layouts/Layout.astro create mode 100644 packages/docs-site/src/middleware.ts.d create mode 100644 packages/docs-site/src/pages/[version]/en/[...slug].astro create mode 100644 packages/docs-site/src/pages/[version]/index.astro create mode 100644 packages/docs-site/src/pages/index.astro create mode 100644 packages/docs-site/src/styles/index.css create mode 100644 packages/docs-site/src/styles/markdown.css create mode 100644 packages/docs-site/src/util/Constants.ts create mode 100644 packages/docs-site/src/util/WebSafeUtil.ts create mode 100644 packages/docs-site/tailwind.config.mjs create mode 100644 packages/docs-site/todo.txt create mode 100644 packages/docs-site/tsconfig.json create mode 100644 packages/ec-copy-in-frame/package.json create mode 100644 packages/ec-copy-in-frame/src/index.ts create mode 100644 packages/ec-copy-in-frame/tsconfig.json create mode 100644 packages/ec-copy-in-frame/tsup.config.ts create mode 100644 packages/ec-default-frame-title/package.json create mode 100644 packages/ec-default-frame-title/src/index.ts create mode 100644 packages/ec-default-frame-title/tsconfig.json create mode 100644 packages/ec-default-frame-title/tsup.config.ts create mode 100644 packages/ec-example-comment/package.json create mode 100644 packages/ec-example-comment/src/index.ts create mode 100644 packages/ec-example-comment/tsconfig.json create mode 100644 packages/ec-example-comment/tsup.config.ts create mode 100644 packages/ec-language-override/package.json create mode 100644 packages/ec-language-override/src/index.ts create mode 100644 packages/ec-language-override/tsconfig.json create mode 100644 packages/ec-language-override/tsup.config.ts create mode 100644 packages/ec-rainbow-brackets/package.json create mode 100644 packages/ec-rainbow-brackets/src/index.ts create mode 100644 packages/ec-rainbow-brackets/tsconfig.json create mode 100644 packages/ec-rainbow-brackets/tsup.config.ts create mode 100644 packages/remark-inject-url-version/package.json create mode 100644 packages/remark-inject-url-version/src/index.ts create mode 100644 packages/remark-inject-url-version/tsconfig.json create mode 100644 packages/remark-inject-url-version/tsup.config.ts create mode 100644 packages/remark-rehype-renderers/package.json create mode 100644 packages/remark-rehype-renderers/src/index.ts create mode 100644 packages/remark-rehype-renderers/tsconfig.json create mode 100644 packages/remark-rehype-renderers/tsup.config.ts create mode 100644 packages/remark-search/package.json create mode 100644 packages/remark-search/src/index.ts create mode 100644 packages/remark-search/tsconfig.json create mode 100644 packages/remark-search/tsup.config.ts create mode 100644 packages/remark-table/package.json create mode 100644 packages/remark-table/src/index.ts create mode 100644 packages/remark-table/tsconfig.json create mode 100644 packages/remark-table/tsup.config.ts create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml delete mode 160000 site delete mode 100644 tools/build.ts delete mode 100644 tools/search_index.ts delete mode 100644 tools/types.ts delete mode 100644 tools/utils.ts diff --git a/.env.example b/.env.example index 07559b4fbcba..adc70d72f5b5 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1 @@ -CROWDIN_TOKEN= -CROWDIN_PROJECT_ID= \ No newline at end of file +TYPESENSE_API_KEY= \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index ffdea9f028ca..000000000000 --- a/.eslintrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "plugins": [ - "@typescript-eslint" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended" - ], - "rules": { - "no-unused-vars": "off", - "@typescript-eslint/no-namespace": 0, - "@typescript-eslint/ban-ts-comment": 0 - } - -} diff --git a/.github/question.png b/.github/question.png deleted file mode 100644 index 51807e261f6a343e759d7f233282c2effec3efb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16754 zcmd_RcU)85mp7`9kD~Yp3W_34L8OC%fP|(3f>f!Y1(0GunnLK!hDsM{QUWR^^dh|_ zp!7%(LN7r|2uUbXLP!Yk9{4>obLY z&oEzRK62#9nFm_xMn{euLmoMDRO{p)fMi>%I_Suey9y7~@0$4AEKfmnO^7cScN;9p zCnBS?Q|~->RdQADC_BbsZ^HfcG2KCHDt(reib9TR>+zSP z6nWI?f;dyx645ynZ)RW*1+~|=&jfVrSGDzU6mUFZ9*+Tjp9|#397s`w>koDDc~I?*I5w3)AYOd1BbkP{ejz>skR8 zPKXU15M_Md_pz{cZAM#NIe6XgR`!S`uX^>Hr_<#;eJu7EDUnmus&Y!K=V7N>nEJE` zHGTT?^YiaegDX>E6uQK#y7J%=k7u9jNG1dYatK`DAMMBtSTLS7dcT}A9_D)Yh65a- zs_L{9@CZv=8^jMcD@GC0CfhZ~0AycvB%G}73|`bW)^pO5Phek){ItyKA0O_;jt+emZO zuZ^t)2c%lAkL?alpu{Rio-~)LgN_|Ja^;v(v{HinD@!c-62z-v zp@C1*|I(x4T;q&O8>X&#TR^5klm^%^hSoGoauN)RtKuDvmnyYD?tidpVP)Eiavj85 z6|u<6a*smhleyd)l&Nkcdt*wVMIVX2{$1}YA_17ZWdS<(hm4o*JLIhu;h&zCuitqGGMCKYneH z((Rf&1PRjvP2U#pL`+R!l;4AUr*1dhw>HgtTO68nd3yU58DSNdg}hN(26N8|2u^=M zc|o{py$#teOh*MjoxBy(^LPVjBn=}M;q&jAGj52^q{?$e%oMg@lIzcp79E; z^lw8{z%T`u-`TkS+0a1y^T2eKZzd6K`ERc>{Tai`BFF6^J-)UmR5CnqyW$R!o9_~C zT+Rupw60ODa@rnl({dlwNVSc$Q5XP`o4ahTciAn z){s!QS-(RYBX4X=n&q1TaZKb~G?Z~@{`jO?*ooy}b z%&tm68TTCf>%P2kN3lke`ZxCpCM0IAk@V;ba*@96;L$D-1r?{_@<-{I;_?F{dbAD^ z9yvp;b4ZkgnhZbb%c9oVUQydT`frYhgVxbS(#FSDxF$Fq{ zd??`{d%1Oe-22SLaL`ntPH(r=)YKqXddW>L&8*W6t;YG4QL+#brAO&L!BN zLkMmQtn8Ao@9%Udr6QKKinPjCz?BvzyZ8ax*d&%KYba5?FCKf%Y;`Z=VAfmSKJGvC zLfhs4%y-^9FqTJR-~SW0`p+(Pz0BE|d$DUX64^jrIQ>1#(+q-6_xR{p02ekiwS~?< zBCwcFg*=k;QS@|OxmR82p-8pHG!f#2gK zYL6bVdtmV%7Rpg?zM}7OJs@JcEFgqzGW$3X89XRQso{|sGW$x`GK%V)Yz$o)Y}u9H z_8e_0s3m3k-95kmb-fgkjGk_Jh2g<9j})g&M85Nred2=6UE5(@2w=_(tq?=}`ptvJ zpCa-l!a|Q>1{A!q$&=x0S)2SfQybUT0!<;tK8)F+3FFo^MX+Mrc3XP>kRCW2dOwjq zEY};@>Gz1Fo@zz$P#GNdq1{`p&x5#{j6{yV@bhs#azy-H_ycHmhg=r&VxxMjT2L)r z+q*~qzI|J zC%;;krZ=0BA!dpbw8?O-E z7#p4q@&3#!wMm7f(kM?Fn*YcVj&{H`pd;q^B5u+6*>=}DW@Je<-WOSlpMpF0T@xXA z<)`FlRSr*(mr&-l0pV7rQ)tyfkirEnnatC^awdbPoi602)cnjVY>eboSl1Y&(O)WXQJm*}gUFb&7%6Zy*k(5#d?Bdv%Ti1GcF>Vs z@DJB$bo;QRMGeOVSnE2h29T&iaidJ)@;p-N^sTt z?v8HukiSqj*XOYPt+O#InQ#eZq zT;1z{ySLZ>sHJkF1M)8VB~YXXu|9qsC&9W*z~!l%E;9#>p#=DrbD*+rd|ewkx^K3UsltuR_2o zGO!XA021*W1r4Vx^Y5RALC`cYP6;>q}lyz6-@8RL!j zO|wzgLxUSdY#|GZp%VGwt1;70CTescLQI8Oy(-P3Uco-tq2Jif0*AK|uu$>69q`DY zFD~^bKeeN*+9M$;6%?5A6_|a6(8~w>r6SwzvCL7k02)l;}r%rf!pjqK+$32d2UK=?1Fr!?FO- z7}F4}Np68htXUygiosI=9B|_^Ssi2y@zGdpn{N83-u}6;(a;oB)}5{)2@V)ykg)XB zjE3K9X0=G!0I6LD`WA{Opt$e5q)|4(w&@b{V8++DGCk*+2r{Bb8|)7mh7G@!agdqf zi%OYXzd$Q;NLa#mIL%Hp&AVmdb%qp5@vgy4k_PYipsQh$WdpV`B5pSK=;Glon+YDe z8oatw^rpZV67HFHoTV{HQ{NqJ2p-A!U@)8*ZMWvp`T;|~dg&%eXqvxAzNlaAeP3Dw zvecE7xo4eHZ1cIWU-QA%<~@pZO2Ze%b~{%ZMY(1274C8w-H^PEeY@_DMZR{+lul1b zeX^zhowOK494rE2GieTSIMj0}LQeWb6+b^Sxa*vr!k?GUXevDB*jcr{|D0j|$j$6I zW81E(P-8^p=lp(Wf6J4sv-ICakv5?HLjic8wC?zATkRJY4dcc4MN@**{R=NDk;!~?6uzo=b zm?%&UcDMDC>str5i6jFW zslt0v!av)Zqt)KCUJQxi*U(??dDfeSv1eKdwrR$duu71#&MB?aT6WtKBgnH(?C|nO zR5tDX#IcMY*D8&(R@tDBsRb}p2jJ6O%*$cPyJ-%vfw>o#%bfp6J#GADU~}I-#x)z2 zA$vWu1M0U}AaSp!E3Ip&?@5oDly@iLc$_fT9ZdjX#gmbup z$md)##GX0Z8_yU|L|Z2u8|avi*_2Xfgj!&PN8Qp4uVf{T+SRA-UcKgNt^a$-Pb3~Q z!rHB+mqAjX)otWe-hQnf-pO(|>}slt$tO<*2#C!479r`A={(w)?OY$M(v&{oaS7Uy zi1C&ByxHmMEzQnfds*9ilFS0p+Lt*aL_ZLg>5o%M-$x*XB1R)>hS*nbKwPTusDmwL~ZuywbDk6kxs zV>_N-7BT-De@a2I{i7E=5wii`-zf=nx?WQjhruLZ=!&<-VrRUaJQPHgo&|^O;jH5D zW0*Cc9+`|iK`2$6Ow8CeeI5du;C@Lwp74&S4x$d{WRQwBdVTbRP6n!Ry>;=QEQ*Uo z7(f#c>~L9H>8NYpp-QScUHzoz;`~1crZ$v{TqXn7-Tm}OOovpfYY-wj0@D%hwNgO+ znY&iQFI(~3d;Da1^gzVPci`~vuvpveUt8^Yz33mPr*YoNn2xjK5x)j^PbCD+41ShY zz``=u>hoy#;dllHMs(x#3C$2583dG7C+gllzHCH?an$xt6Bbo_451;zdZgX~m3%!A zdiSR4xdjnsmp+t=T8k1%9D(jj$9$D-9!kNRKpaB5C~7ov?4NjNSQX6O=3v7a=o1D< zD$ij%?$q_>S28ZdY`{Wa84~K>T3(}Nb?eMg&X!migC?3^5Ac=sc1PC_m3!!!g6%zz z9x?CXkcLyP4t+VM7hy~9$YQQBI;{3)*P=?b`R6OB_%2yWnb$3yBCUd@Lk}kZy(LQGRqxY)r;w}Hoi$ND;RS2>eVHI3TD|sb5 zIAu=c%qbV{ckKHdtN<6Rg-xdL4F@w1{;}06kDdHN8Mlp3azydI9GBtsHYi^~H@n<| z;=WfyIL*puzD#x@oy^b;d%FOc8uYc(aI0w^rInOqE&GJ+hOc$KDz}chb4zoR-Nh@_vD$9cDb+T92eIYR8wc%K zsury+vRiHcWwQM_6NAI^C58FA-dmzk*gMA0(>a4gQ*6yga>`7pn;lSDuZkLHkZRJa zVDfxQ`lJqxQrjz;s{`HDizT{u7}MMWYvm}oQ#}{tRJ_!}@Pro{Op>C3Ih!^EgZ1A^SwI+cKtr~vdr_L!0 zhlHfBC-_~@!4aNC%^nX*{!OlQ(d$Mh}mr?8N9%o+jmMwuu2$JA}f zSY^bWr8iTwu**sXDATiw<+Ps#6NJrYbXw-aT^mWPeaEcwM|9G*$Hm4JYdVz1le1wx z(12OE=m`9d<4-t9I0CV@&a8;sup=xP^CiMyc__#42Pvt7p2`4;LiyxD~wr66^+8&clyuH`AD8q%rbABC7i2!= z@9j+|{p#n#_q^HATLbuN&q$a}nijN4S;3&Yxw^oQl&MnLUOTBo0jRYm<$(Yfe)t-D zSAi@YoYy!H4%lI_O|%VjZU(OUtNlA>`=5p2f0N$-pImyEeMoA5Qg{G$eRe<;q`vtd zVY&Zrw0V5EHbGS-Y>mQ~sk*&TP^SpIxm^9-oeQa=_CuECWw{dSAk}~^zTxHrCO(-Z zzIZsc8UYByF3>Oy-hixS;Od8=@rtdga4o|0O@o83>!fR$xpt0YIr!lvK?iJ#xa`4G zhonfC?*HUza|(L75A9Ait+*2}aE-YmthTe#=sKJ1>B zx2vCw*9r5KCT5BySlG#Ulk+2WtT^rK_V6X z+-a>Idbp5Ow$S?U{({}U z#lBJ~^`0y1eAq=M|J;Be8d4_E(IAWBRMbu(>~!9f?|gHNB4|O6VAhLD`1IH`BgwB; zIg8ys<$U&zz%1OTub)jrL@{smds}Lub-Ptym4RDuxqP{Cm^>Tb2y4tH&xG;yOxw6c z%9bHb@;H$DxO%u3ss;iU7#O$e!7}-b2hRD~j~$R-{G-Gy|0s}oqmk60{<(w6gDH+f zWDNg;m;+lW=mRTN!`C7P?_cRjKEpF19C?HH=?tc$uqS!uAwRtOjz;M4_?ty7U*@q^ zdP~WggP(gcx^Y7nHv3}9GPe+-;;aoSYL}>JRJyDz%xuJWW5rYap_1wH8dKWR==q{2 z0j4&PTiNYnuAZay2#24GCg4y#&)`BeM|oMr_1{U71bv0&--1~v|BSK|4;(_$c-l_VW2((|E z`@^KjjjPJTdRMuiIhCm9ifdwJqMzar7&YJW+OP6k4xW%wqd~X7w4!D`rND{nElR|t zlBHPBYuC2g1Q1tT_aq7w3p!VxZWb;>OLz)c*XWGAV$|5w{KWg!2fBR^<&Q_#@?!=9 z9{W#=#+M+|k}Dx<3-#;^F#Rx<>_$iKY7fh%qi1QnH*psQd!4eP!PQRkd2iF@1C!23 zyc!0`i6gjk2gX0y93&KyC?R=k(9lJmRLqg4dVSQ2aI-^?ofurJz~Nhw-ac!<+Bo2B zoz@NWb!x0s4}P3NOeiE|`#se&0;O9Jk^K1?QQ0{Hx-r?*3a|d0tBQO1cvTu6V+ak~@0z-ske(1v zJCT!Z1Txh(yV;lh{(FOGCT1-r4zji?(rv`d(&N3IW=L41RV^9u!()u6{M&)+MoHT^1XE2*m#~hxMq(Wt@OJ&)NmKuXS91c3T8q zXb_?AcDMA1v-~56%y!*-4&RrjI&M^Yd7(4da!3s=`K7{E?=mp4yl&+o);QCMSq zF^%8eoD4xp>4=QWfAYftt|bT#JmZ&)p)+%>+;bR2+z`NL7KyT##$)pg?=fQv}LtjAKES2RSu= z)QQ?)IAJRpiohY&<-KP*eAfYO>uE0ws?=LgV|A$&conGq{$ z<&C8`tW@YKAp|VEZxAA#TZw#KQ&9?JcSACCWn zr{l8-Z|8i6>16)6FQSot_+-%jLv!of{Z`;b5k)z+3f!Jg>EL`pyXLB;WSDL8x4qXv zv2?FW({|&Lq`)BqnE|8x`BkoRYmXq)pSF39;A$&LV2J*xzc&Ie`FDUxU&o0s>Qe*H zPUIPn6hvW&rS%1(r+AO$#Gs5rJ=)b-d6{Q9FpNBA>Ff3*FumOomqm44C^mRjGU;6t zrhYoY>&&*&P)I>-fFf~cbfGZoBWBfW9{^{%hcB6j@hVwf6VtBw>d|IfT<4eB&y)_O zi*5|gazN**Wh@OowW}ru&wNCghy+X%oBq`Gbu$`Vv%t4XM5p? z^;cDOa9; zc#?F_hdGuvdtgP&Mwi7aCXPDP3M^kJH0tm7sS*b_jV%t>-Z+~-Y5uGG-=Oj|0c5bG zRQFYk>Sp4gdY*?{`b19e#)EsyG5GNH^Yz~HCOqUAo^4%*SN#OC1DPISoPt`_wcXg_ zkIOh~R9;XawcSwk0jnVGe}I=&uV#MHqd=J)P|%ZGHA{mAiAot~OnaMWpH>Yg?#A&| zD|zCQxU$(p=ckr2z70&xE0*AQIX%(a>Jv_M7!SRjAy%u`YGb4?)$=*?9d< zp}lMNoyvZlx}p8XgN}cOn41Zk*}|j5RWcvv@;bQ0qzUOe)+P-HCv6uVgB;72N3=J_ zZYU~0@zA(4{mnVZ!NSbfqG;0J(Z0>LFdz9`?k3MEy*N3~hn1q36NvB9XP~9GJf)`n z?#H=3i`+Ud9DrO{nQ8qjwx_J24Ld!9QKm&AitDX18}?-Ma>qzL^hW`HW1TCLrcSai z#Js4MJsO=U^q9)DEm3b!6jTYkmdv|M<~x06>x6Hqk#|ua8sSARma>v4Rh5!NDadi> zOLg~b(S)GJR9o(}(Nt1w<~fPmUb)rxl-k!HZ$TB8Uy<$!gmiAblfPD|xf!_Qya@-) zPS=rx7`(X;#;e#UW6(Q=y%=}N{T~qA^EKq&zk}e|cY1tiatWnP$nBCy@+F%KsUORV z-AQ4N>gAWusC;geL*rxgJbyAtB^COT6I}tt>qAqB@D}q=x8xLaQ5AP0^w)>GML0Zc z8*f+rtcdw?e(ur56}RF-xA?Jfi)CM@6sB3fa}i3M%pFv3OBNxr)jNaH8>IvCw^v^? z?VcCJZ2kCM5m~sfQvQrOkUScH8Fi+sl$6oGGm2;9^H@W>-Czbopn7(YS57*&Lm%S1YxHlLR zClUI|+-N&bC(orqT!VG4u*y2mlS9bOATG_@h-72(^oW(l!OQW^W*)>Fl(DIW>L;bQ zpYHamRft&4se{D0EKlgAOfGq>yLVBAD>%S|~W27P%g$Y^5OvOjIFoiGyd=t;a zC(#Q8H96?S!d>=>h-uflfNXiZ(y=4Yv&0VeBu)qP_6;L_-tkrJw$jL@<||a|ib-Vl zx}GK+pI?p^OlgT?SG~L|Bv5x<8Gg~S)N8jMmFY6#OKQ1Awgb+ zk$MkgJ!aUD@G?!tk4aOv_FCX73&k5N8kIHxd7|UduY8C;7&6l zf=qqZL{bdb3TISrtJZF@d7z9X7zTj?o9>ZGS)ZzsFp62-_R;q_Y)Zt>6HK5da&^iR zl)gxX7`ys!_widGEHjt>3SJmaxga+g-l2WYAsg3-vdZArVy=FI+2QYM(mv5Dn z$A7?FrCHQ6;4k`rIp(8ntt<^|Wegzo2&vob5A+G;x}()+;A(z&#kZ+53z3DR%v_IX z{SOSrT4lcPdWFY)C|;7@efP}^f94rb!g2!7%yp)H?8%H_$miOtA)GPQ$X8SAg_+Ms zn@4vNHo+EVqk#EGN#8D*x|Q73RkWOud4{MqDc{#4^sY-(k_mLvL0W(D zZ$vJ9&wdDKE2YpsQf`^J7=|?@u?ds!`++zpJIjLglGUsJwI-Dpb54I zgb3W5dj?|_S3_f10I|kD;_C+ofcGEK?ft{DVVQ$K_rLYD<}8uX=$UCr1@QC{bCCL1 z%L8f!5Sq>_k}*IRkLbMpS7tg(X@~Vc2*dw{3%6T1AZL=<&gJtPYZP0a-m0!Tu6;0q zU(o*|FAp&6P$V0`b{*0A`C&)uxBwD67xwNa z2l~91Q|Z$O2%hJ509^E~!ve$9?*GBls&)f{U0E2R;}0NK7{h&&@Y(xZUib7%ZRt;A zU$<-a&AVjlf^OreI9#>$9#TAf_Y{?zf`42Ti6|ALhyp!TKV&evh}@T*MNKBdhhAV_ z%w(>_hHy1Y8U)xG{aaX&5STL3A2_Z!PT3o-tX>-ZNRf-`Zc<(C{$Y_dYgtcl+keNw zwrcu^ih++U$=$8F9Rjqja{Dj?;RW&=y7*3ICC*lQz^FK1v2XEJuS`f%z>{ZDm22ai zB|<-E`LvNwf7li#Hm$;J{ol_DKY)#}ylI!1O+32#KGce<%AMtsSt+5^ty9l5^*6Jz%e_3B^#Kgj z=RBIcE>`A<2s4?!>0+Os-7#w78#=RU*WYPJzpgKGY4 zGHumoi7jB)e0CTEJT>UgqgTGVFA3xT#(tT8JuNrH)X;&m4+R!(i{e25JHDe$_^EsQ z_P|J!psK68n*E24hgj|0D`|xs>}mvnPxHDU>*ugsvC`PjqM!5RntxtTcH%A8aH07V z0uah^ZQpL>R)2cJ=gd3qpJ#FBPj)v(Z%1i}cob9O)T>e-2KgYx8bA35sS$Fv*F4A^ zwO?CRFHL2&V3ube)2HD$v3LwSKm39~lmMME$EFd{E5u12O)OdPp!&tU_UPI8Wojl1 zBNFbaM!tmaA@}0@CBufa+sUpedg6*crV(YJpRzXsy#vkCRZ!UM1+zalC8BHOlbxJW zs(WHIuitOuVjH^n^Ln1ZXJY@tnI~rLW4~bLW;;KU7MAfln8kSIkl~aPj*+ZYzSC3O zTr7hrj!rv_gh~;=Q#C0;iNUt$q}H3u3oT=5)lV1+~AZ=72#JwtOfq4C;c)NstY}g%)X#YX>$lT-*xo5#*W6wsN z^oTt3i1Zk<`om0TH*hrdH4r+=Er>x^KeXrA={?$|| zWi*}d{OVXX{Y0-{eUPr>=2m6JZt9r`f__A78yd1c=-aV%bcjn(B#duZ?+MT0!iFt%WmZ1x z+|pt`{rcVBWa)O};f#-e*(D!f^x1IeNq9kz(R_X(Z!4|`H){IzcvM=Eu$6LEBj2&D5^0GJ;+AiJC{N-doY?mB6l z{XBsPzx*z4?unXL$%lV~;feCP&_{uz)8?iPJraD%WyN{BrMy4$8qKMl=dlHi=MA6% zWr+z=aq$U9ID!J%T+&>lgg%vM<}49wD6JHMbF)nc+))ww);w@!e9a=t4XZ(ZxZZ7>RGAPE{rR3~q+X)4p1ETsN4`BF%4x<`= zMCEnW$;ZWlOGf8cdt$0PbrY<4O2`>Ki5Qve&YE`|egqHsamn+Lk+ED+fJ+Jj(Wha9 z3N8@nTdG$w#%u2Z3_@5;>zP`6aL$Xz$su>XxT(!+@NecjVY&tmx3%V3%!=LQmRJ*B zNuq#1U<2evAz)!tVxwKwC=CG7F~`&K-k(?1Xst5+AzBUSY#>+v2y0od>IESvzsMXF z~Y?qE`1Dj#*P*ccW7 zDD^vUtlqfWw=^d)BbibM zoW1YXB2@j|?0pczNm&vQI!X^HNRXcaal@5_c#O+`Y;siqZY87&58fM^MDy7IA8=xn zv$#+@6R6!bugde9D`!ytlttT6cp!~ydp$*_%w~7uhb_WJMfLASB?3WwoT}9MPO$g1 zEgeDZz@kc3Lsqe20rYu%QGMz(GS7MXE@*l?-CG9LaKnawKa`vzBehTA(=4ftsQkwm z#_SQ^-QAv z_b*d`>&5C$hpv%|tmZ0okc{@-lrrS*?sQL4G%RxuKTkEVVQiD|XrUR;&_{z?-JZP7 z!Ow`_Hgm&*Zc^8WSf%!q7;$r9K6LWL^xp69MPTo~tSm)`YhG^OI^w5e(e?cFtc&}5 zQ3A>`4KtWdhmTRuc3c`9LASH)S0MyBIb84KYV3v1xn z!WQ{Bo89fD?phQmplH5p6hRI1r>wVU|4tAH+jr^~La9(aRgv^9uKMscYl77N`YLL# zw+M`?m)irE)NazaHp>6j(HF!zAVPBltJA69f}W;d$-YJ z6~&+pp$SrwJh|K3Kj2)9b??Qs~jIz z7kE7lv%V66-Vc^M+st{GHS)9X$I`kMrx_t`f%hj7GV~vFVKsRh@jI$%SX%eIBPoC5 z!C}Z4^(Y=o8;;+RvTgRKqYV-yr4%-nV~q< zAG-kz+ZCSro!Oz<>80Je+-r}^QkNJ>rnA>Me@Au8E&g*d=)C1mGIL9e& zZ+@-fLMZ|^}Ono~pHZf~!>X-di9Fem%*;^9DU|NA1$eN{bVdX5RT SNDFx6$O8?1_0oHGFaH;2GFBx3 diff --git a/.gitignore b/.gitignore index 0bdd05ef06c0..078a09ab6f8c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ build/ translations/en/ # dependencies -/node_modules +node_modules /.pnp .pnp.js @@ -26,4 +26,5 @@ yarn-error.log* docs_reverse_lookup.json .vscode/ -.env \ No newline at end of file +.env +dist \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index f6301272614e..000000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "site"] - path = site - url = https://github.com/CraftTweaker/Docs-Site.git - branch = main diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000000..af1979daeb67 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +save-prefix="" +link-workspace-packages=false +save-workspace-protocol=rolling \ No newline at end of file diff --git a/Custom Markdown.md b/Custom Markdown.md deleted file mode 100644 index f901597cbae9..000000000000 --- a/Custom Markdown.md +++ /dev/null @@ -1,45 +0,0 @@ -# Custom Markdown used - -While most of the docs are written in GitHub Flavoured Markdown, we use the [Remark-Directive](https://github.com/remarkjs/remark-directive) plugin to create some elements that stand out and help the user. - -### Required Mods - -To show that a mod is required for certain pages, we use the following syntax: - -``` -::requiredMod[Create]{builtIn=false modLink=https://www.curseforge.com/minecraft/mc-mods/create requiredMod=CreateTweaker requiredModLink=https://www.curseforge.com/minecraft/mc-mods/createtweaker} - -::requiredMod[Immersive Engineering]{builtIn=true} -``` - -`builtIn` defines whether the support is added by the mod in question (Like Thermal Series having the support be in their mod), or if an addon mod is required (Like CreateTweaker being required to add support for Create). - -`modLink` is a link to the mod's project page. - -`requiredMod` is the display name of the required addon. - -`requiredModLink` is the link to the required addon's project page. - -When rendered on the actual site, this turns into: -![required mods](.github/requiredMod.png) - -### Groups - -To group a section of a page together, allowing for it to be collapsed, you can use the following syntax: - -``` -:::group{name=groupName} -Content -::: -``` -or -``` -:::group{name="Group Name"} -Content -::: -``` - -`name` is the name of the group. - -When rendered on the actual site, this turns into: -![groups](.github/group.png) diff --git a/Jenkinsfile b/Jenkinsfile index 31f4b906174b..a216d833d647 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -3,28 +3,32 @@ pipeline { agent any environment { - CROWDIN_TOKEN = credentials('crowdin-token') - CROWDIN_PROJECT_ID = credentials('crowdin-project-id') - } + TYPESENSE_API_KEY = credentials('TYPESENSE_API_KEY') + } stages { stage('Setup') { steps { - echo 'Setting up npm' - sh 'npm ci' - sh 'cd site && npm ci' + echo 'Setting up pnpm' + sh 'pnpm i' + } + } + stage('Build Docs') { + steps { + echo 'Building docs' + sh 'pnpm build' } } - stage('Build') { + stage('Build Site') { steps { - echo 'Building files' - sh 'npm run-script build' + echo 'Building site' + sh 'pnpm site-build' } } stage('Deploy') { steps { - echo 'Deploying docker container' + echo 'Deploying files to folder' dir('site') { - sh "docker-compose up -d --build" + sh "cp -r dist/* /opt/crafttweaker_docs/" } } } @@ -32,7 +36,4 @@ pipeline { options { disableConcurrentBuilds() } - triggers { - cron('0 */24 * * *') - } } diff --git a/LICENSE b/LICENSE index 9595491de0c3..1a03533cc807 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Jared +Copyright (c) 2025 Jared Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 9f85943832e4..ce8c07ba386e 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,183 @@ # CraftTweaker-Documentation -Documentation for CraftTweaker -This is the source code for the documentation, you can find the actual site and documentation [here](http://docs.blamejared.com) +This repository contains the documentation for [CraftTweaker](https://github.com/CraftTweaker/CraftTweaker), a Minecraft mod that allows you to customize the game using a scripting language. +This repository is not meant to be used to view the documentation, instead you should visit [docs.blamejared.com](http://docs.blamejared.com). -### Setup: +## Setup: -Requires [npm and nodejs](https://nodejs.org/download/release/v16.18.1/) +Both node and pnpm are required to build the project. +```shell +node: "^>=18.17.1" +pnpm: "^9.12.1" +``` + +Clone the repository locally and install the dependencies. +```shell +git clone https://github.com/CraftTweaker/CraftTweaker-Documentation +pnpm install +``` + +This project uses pnpm workspaces, so you should **always run `pnpm install` from the top-level project directory**. Running `pnpm install` in the top-level project root will install dependencies for every package in the repo. + +## Project Structure + +```text +/ +│ 🛈 Contains handwritten documentation files +├── docs/ +│ │ 🛈 Contains the versions index, used to define versions and group them on the website. +│ ├── versions.json +│ │ 🛈 Contains the handwritten documentation files for a specific version. +│ └── / +│ │ 🛈 Contains the sidebar structure for the documentation. +│ └── docs.json +│ 🛈 Contains auto-generated documentation files. +├── docs_exported/ +│ │ 🛈 Contains the auto-generated documentation files for a specific version. +│ └── / +│ │ 🛈 Contains the auto-generated documentation files for a specific mod. +│ └── / +│ 🛈 Contains the TypeScript projects that handle building and processing the documentation files into a website. +└── packages/ + │ 🛈 Handles merging, processing and exporting the documentation files before they are built into a website. + ├── docs-build/ + │ 🛈 Contains the model for the json based documentation files, and general utilities used throughout the project. + ├── docs-model/ + │ 🛈 Handles generating TypeSense search indexes for the website. + ├── docs-search/ + │ 🛈 Astro based documentation website + ├── docs-site/ + │ 🛈 Expressive-Code plugin to put a "copy" button in the title of the frame + ├── ec-copy-in-frame/ + │ 🛈 Expressive-Code plugin to set the default frame title based on the language. + ├── ec-default-frame-title/ + │ 🛈 Expressive-Code plugin to generate rich example comments. + ├── ec-example-comment/ + │ 🛈 Expressive-Code plugin to override the language of a code block. + ├── ec-language-override/ + │ 🛈 Expressive-Code plugin to put rainbow brackets in the code blocks. + ├── ec-rainbow-brackets/ + │ 🛈 Remark plugin to inject the game version into links. + ├── remark-inject-url-version/ + │ 🛈 Remark-Rehype plugin that provides renderers for custom markdown directives. + ├── remark-rehype-renderers/ + │ 🛈 Remark plugin to generate searchable terms for the search index. + ├── remark-search/ + │ 🛈 Remark plugin to convert tables to responsive html + └── remark-table/ +``` + +## Contributing Documentation + +Handwritten documentation files are stored in the `docs` folder. Each version has its own folder, and each folder contains a `docs.json` file that defines the structure of the documentation for that version. + +### Adding or Removing Files +If you add or remove a file, please make sure to update the `docs.json` file. +### Previewing Your Changes + +To preview your changes as you are working on them, you should first build the documentation files and then start the website. + +```shell +pnpm build +pnpm site-dev ``` -git submodule init -git submodule update -npm install -cd site/ -npm install + +You can then navigate to `http://localhost:4321` in your browser to preview the website. + +Once the website is running, you can make changes to the files in `./packages/docs-site/src/docs/`. The website will automatically reload when you save a file. +When you are done making changes to the files, you can copy the files you changed back to the top level `./docs` folder. + +This process is a bit cumbersome, but right now, it is the best way to preview your changes as you are working on them. We are open to suggestions on how to improve this process. + +### Custom Markdown Directives + +While most of the docs are written in GitHub Flavoured Markdown, we use the [Remark-Directive](https://github.com/remarkjs/remark-directive) plugin to create some elements that stand out and help the user. + +#### Required Mods + +To show that a mod is required for certain pages, we use the following syntax: + +```markdown +::requiredMod[Create]{builtIn=false modLink=https://www.curseforge.com/minecraft/mc-mods/create requiredMod=CreateTweaker requiredModLink=https://www.curseforge.com/minecraft/mc-mods/createtweaker} + +::requiredMod[Immersive Engineering]{builtIn=true} ``` -### Build +`builtIn` defines whether the support is added by the mod in question (Like Thermal Series having the support be in their mod), or if an addon mod is required (Like CreateTweaker being required to add support for Create). + +`modLink` is a link to the mod's project page. + +`requiredMod` is the display name of the required addon. + +`requiredModLink` is the link to the required addon's project page. + +When rendered on the actual site, this turns into: +![required mods](.github/requiredMod.png) +#### Groups + +To group a section of a page together, allowing for it to be collapsed, you can use the following syntax: + +```markdown +:::group{name=groupName} +Content +::: ``` -npm run build +or +```markdown +:::group{name="Group Name"} +Content +::: ``` -### View Results +`name` is the name of the group. + +When rendered on the actual site, this turns into: +![groups](.github/group.png) + +### Adding a New Version +**This is currently not implemented, to make a new version, copy the files from an older version folder, and update the versions.json file manually** + +To add a new version to the site, simply run the following command: +```shell +pnpm new-version ``` -cd site -npm run dev +and follow the prompts. + +Once the files have been created, please go through and update any version numbers in the new files as needed, and remove any files that are no longer needed. + +### Auto-Generated Documentation + +The auto-generated documentation files are stored in the `docs_exported` folder. These files are generated by the [CraftTweaker-Annotation-Processors](https://github.com/CraftTweaker/CraftTweaker-Annotation-Processors) project and can be overwritten at random. + +If you find an issue with the auto-generated documentation, it needs to be fixed in the java code of the project that has the issue, fixing it on this repository will only be a temporary fix until the next time the auto-generated documentation is updated. + +Please see the [CraftTweaker-Annotation-Processors readme file](https://github.com/CraftTweaker/CraftTweaker-Annotation-Processors/blob/main/README.md) on how to set it up for your project. + +## Build + +The project can be built using the following commands: +```shell +pnpm build +pnpm site-build ``` -Look at the url that appears on your console, should contain `localhost`, paste that on the browser. -Ctrl C twice will stop the execution. \ No newline at end of file +The output will be in the `./dist` folder and can be served using any static file server such as nginx. + +## Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +|:-----------------------|:----------------------------------------------| +| `pnpm install` | Installs dependencies | +| `pnpm site-dev` | Runs the site in dev mode at `localhost:4321` | +| `pnpm site-build` | Builds the site | +| `pnpm site-preview` | Previews the built site | +| `pnpm site-full` | Builds and previews the site | +| `pnpm search-generate` | Generates the TypeSense search index | +| `pnpm build` | Builds the documentation files | +| `pnpm build-full` | Builds the documentation files and the site | \ No newline at end of file diff --git a/biome.json b/biome.json new file mode 100644 index 000000000000..2acdd3183b32 --- /dev/null +++ b/biome.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": ["./docs", "./docs_exported", "./packages/*/dist", "dist", "build", "./packages/docs-site/src/docs", "./packages/docs-site/public/**/*"] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "formatWithErrors": true + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double", + "semicolons": "always" + } + } +} diff --git a/crowdin.yml b/crowdin.yml deleted file mode 100644 index 25aa239f3152..000000000000 --- a/crowdin.yml +++ /dev/null @@ -1,22 +0,0 @@ -commit_message: '[ci skip]' -files: - - source: /docs/**/*.* - ignore: - - '*.sh' - - '*.js' - - '*.css' - - docs.json - translation: /translations/%two_letters_code%/%original_path%/%original_file_name% - - source: /docs/**/docs.json - translation: /translations/%two_letters_code%/%original_path%/%original_file_name% - type: txt - - source: /docs_exported - ignore: - - '*.js' - - '*.css' - - '*.sh' - - docs.json - translation: /translations_exported/%two_letters_code%/%original_path%/%original_file_name% - - source: /docs_exported/**/docs.json - translation: /translations_exported/%two_letters_code%/%original_path%/%original_file_name% - type: txt diff --git a/docs/versions.json b/docs/versions.json new file mode 100644 index 000000000000..bfe45c854077 --- /dev/null +++ b/docs/versions.json @@ -0,0 +1,38 @@ +{ + "latest": "1.21.1", + "all": { + "1.21": [ + "1.21.1", + "1.21" + ], + "1.20": [ + "1.20.6", + "1.20.5", + "1.20.4", + "1.20.3", + "1.20.2", + "1.20.1", + "1.20" + ], + "1.19": [ + "1.19.4", + "1.19.3", + "1.19" + ], + "1.18": [ + "1.18" + ], + "1.16": [ + "1.16" + ], + "1.12": [ + "1.12" + ], + "other": [ + "1.17", + "1.15", + "1.14", + "MineTweaker" + ] + } +} \ No newline at end of file diff --git a/nginx.conf b/nginx.conf index fc545c981da9..de7639d0bb22 100644 --- a/nginx.conf +++ b/nginx.conf @@ -1,6 +1,21 @@ server { - server_name docs.blamejared.com; - location / { - proxy_pass http://127.0.0.1:2901; - } + server_name docs.blamejared.com; + + root /opt/crafttweaker_docs; + + index index.html; + + location / { + try_files $uri $uri/ =404; + } + + location ~* \.(htaccess|htpasswd|env|ini|log|sh|bak)$ { + deny all; + } + + location ~* \.(?:ico|css|js|gif|jpe?g|png|svg|woff2?|eot|ttf|otf)$ { + expires 6M; + access_log off; + add_header Cache-Control "public"; + } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7c2b402b5178..000000000000 --- a/package-lock.json +++ /dev/null @@ -1,5975 +0,0 @@ -{ - "name": "crafttweaker-documentation", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "crafttweaker-documentation", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@crowdin/crowdin-api-client": "1.12.3", - "@types/fs-extra": "9.0.13", - "@types/lunr": "2.3.4", - "@types/node": "16.11.11", - "@typescript-eslint/eslint-plugin": "5.5.0", - "@typescript-eslint/parser": "5.5.0", - "axios": "0.24.0", - "cross-env": "7.0.3", - "deepmerge": "^4.2.2", - "dotenv": "10.0.0", - "eslint": "8.4.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "extract-zip": "^2.0.1", - "fs-extra": "10.0.0", - "github-slugger": "1.4.0", - "lunr": "2.3.9", - "remark-parse": "10.0.1", - "to-vfile": "7.2.2", - "ts-node": "10.4.0", - "typescript": "4.5.2", - "unified": "10.1.1" - } - }, - "node_modules/@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz", - "integrity": "sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.19.0", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@crowdin/crowdin-api-client": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/@crowdin/crowdin-api-client/-/crowdin-api-client-1.12.3.tgz", - "integrity": "sha512-FKlRJrFY4zWJeKLPWtP8To17T7NSBza+Dp0nx1JhptIQwX+hJDzcP5u2OdM3sd0k4l2IujAYN/P3fftgmDY/8w==", - "dev": true, - "dependencies": { - "axios": "0.21.3" - } - }, - "node_modules/@crowdin/crowdin-api-client/node_modules/axios": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.3.tgz", - "integrity": "sha512-JtoZ3Ndke/+Iwt5n+BgSli/3idTvpt5OjKyoCmz4LX5+lPiY5l7C1colYezhlxThjNa/NhngCUWZSZFypIFuaA==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/@types/lunr": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/lunr/-/lunr-2.3.4.tgz", - "integrity": "sha512-j4x4XJwZvorEUbA519VdQ5b9AOU9TSvfi8tvxMAfP8XzNLtFex7A8vFQwqOx3WACbV0KMXbACV3cZl4/gynQ7g==", - "dev": true - }, - "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", - "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", - "dev": true - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz", - "integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "5.5.0", - "@typescript-eslint/scope-manager": "5.5.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz", - "integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz", - "integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", - "debug": "^4.3.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz", - "integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz", - "integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz", - "integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz", - "integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.5.0", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-es7-plugin": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", - "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=", - "dev": true - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "node_modules/axe-core": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", - "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "node_modules/bail": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.1.tgz", - "integrity": "sha512-d5FoTAr2S5DSUPKl85WNm2yUwsINN8eidIdIwsOge2t33DaOfOdSmmsI11jMN3GmALCXaw+Y6HMVHDzePshFAA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", - "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.0.tgz", - "integrity": "sha512-oHqMj3eAuJ77/P5PaIRcqk+C3hdfNwyCD2DAUcD5gyXkegAuF2USC40CEqPscDk4I8FRGMTojGJQkXDsN5QlJA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-2.0.0.tgz", - "integrity": "sha512-YwaEtEvWLpFa6Wh3uVLrvirA/ahr9fki/NUd/Bd4OR6EdJ8D22hovYQEOUCBfQfcqnC4IAMGMsHXY1eXgL4ZZA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.0.tgz", - "integrity": "sha512-pE3Z15lLRxDzWJy7bBHBopRwfI20sbrMVLQTC7xsPglCHf4Wv1e167OgYAFP78co2XlhojDyAqA+IAJse27//g==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, - "node_modules/core-js-pure": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.3.tgz", - "integrity": "sha512-N3JruInmCyt7EJj5mAq3csCgGYgiSqu7p7TQp2KOztr180/OAIxyIvL1FCjzgmQk/t3Yniua50Fsak7FShI9lA==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/empower": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/empower/-/empower-1.3.1.tgz", - "integrity": "sha512-uB6/ViBaawOO/uujFADTK3SqdYlxYNn+N4usK9MRKZ4Hbn/1QSy8k2PezxCA2/+JGbF8vd/eOfghZ90oOSDZCA==", - "dev": true, - "dependencies": { - "core-js": "^2.0.0", - "empower-core": "^1.2.0" - } - }, - "node_modules/empower-core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-1.2.0.tgz", - "integrity": "sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ==", - "dev": true, - "dependencies": { - "call-signature": "0.0.2", - "core-js": "^2.0.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.0.tgz", - "integrity": "sha512-kv0XQcAQJL/VD9THQKhTQZVqkJKA+tIj/v2ZKNaIHRAADcJWFb+B/BAewUYuF6UVg1s2xC5qXVoDk0G8sKGeTA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.2.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.3", - "aria-query": "^4.2.2", - "array-includes": "^3.1.4", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.3.5", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.7", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.2.1", - "language-tags": "^1.0.5", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/espree": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", - "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", - "dev": true, - "dependencies": { - "acorn": "^8.6.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/espurify": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.1.tgz", - "integrity": "sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==", - "dev": true, - "dependencies": { - "core-js": "^2.0.0" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.0.tgz", - "integrity": "sha512-5OV8Toyq3oh4eq6sbWTYzlGdnMT/DPI5I0zxUBxjiigQsZycpkKF3kskkao3JyYGuYDHvhgJF+DrjMQp9SX86w==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.0.tgz", - "integrity": "sha512-t+2GlJ+hO9yagJ+jU3+HSh80VKvz/3cG2cxbGGm4S0hjKuhWQXgPVUVOZz3tqZzMjhmphZ+1TIJTlRZRoe6GCQ==", - "dev": true, - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.0.tgz", - "integrity": "sha512-QfrfjQV0LjoWQ1K1XSoEZkTAzSa14RKVMa5zg3SdAfzEmQzRM4+tbSFWb78creCeA9rNBzaZal92opi1TwPWZw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.0.tgz", - "integrity": "sha512-vGOtYkiaxwIiR0+Ng/zNId+ZZehGfINwTzdrDqc6iubbnQWhnPuYymOzOKUDqa2cSl59yHnEh2h6MvRLQsyNug==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", - "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", - "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.3", - "object.assign": "^4.1.2" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "dev": true, - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/mdast-util-from-markdown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.0.3.tgz", - "integrity": "sha512-8/GPJsE3h73C+PBFJ3cCdvegz07mLS8/5NfuIsP8q/cw/Ph/aximc6OYdfwerwcZqTYVu7WeXm/8+RDztxreZQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "parse-entities": "^3.0.0", - "power-assert": "^1.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.0.6.tgz", - "integrity": "sha512-yzyfAHhglgEDprJnsvoQVPSXy5OnQfgyatGTxh0XVpismB5+aECnsHY2I1oxsySf6t/2FeamjOLoxun47nVhvw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "parse-entities": "^3.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.2.tgz", - "integrity": "sha512-nIxVDZnm1ra2BcnUSUWe9LC3UBTQ/sqUp4do80xXhtCWxBYj7u70Qw2CH54oZu7jblDCxDO3tmNBSprV5EWndg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "parse-entities": "^3.0.0", - "power-assert": "^1.0.0" - } - }, - "node_modules/micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.1.tgz", - "integrity": "sha512-d/we+Gm9cqySOaPmtx109GEbG2dadb2myK9Tcm3aAx9Ug0IL4ucQtzKVoO+02HI10E76ncv9n/VEEF5ym0RzTQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "power-assert": "^1.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.1.tgz", - "integrity": "sha512-nAdDygUZK7WtHFkNi01PzS33jeWPKZXA6LEABQiCVDXvNNUjdQ9o4stT8jBu3BNsE3ZulfG5IGdfWuOWS/CS+w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "power-assert": "^1.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.1.tgz", - "integrity": "sha512-Wf3H6jLaO3iIlHEvblESXaKAr72nK7JtBbLLICPwuZc3eJkMcp4j8rJ5Xv1VbQWMCWWDvKUbVUbE2MfQNznwTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "parse-entities": "^3.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.0.tgz", - "integrity": "sha512-cJpFVM768h6zkd8qJ1LNRrITfY4gwFt+tziPcIf71Ui8yFzY9wG3snZQqiWVq93PG4Sw6YOtcNiKJfVIs9qfGg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz", - "integrity": "sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz", - "integrity": "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.1.tgz", - "integrity": "sha512-Zy7XuVepFWm8MqiqFywq4wFu4GXlksyC3e942GaQBXaaCWha3VbkZiTmOEBDCcvp1xKq/xZ2gGEIsCjU+SuEig==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "power-assert": "^1.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.0.tgz", - "integrity": "sha512-NZA01jHRNCt4KlOROn8/bGi6vvpEmlXld7EHcRH+aYWUfL3Wc8JLUNNlqUMKa0hhz6GrpUWsHtzPmKof57v0gQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.1.tgz", - "integrity": "sha512-UT0ylWEEy80RFYzK9pEaugTqaxoD/j0Y9WhHpSyitxd99zjoQz7JJ+iKuhPAgOW2MiPSUAx+c09dcqokeyaROA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/object-inspect": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", - "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-3.0.0.tgz", - "integrity": "sha512-AJlcIFDNPEP33KyJLguv0xJc83BNvjxwpuUIcetyXUsLpVXAUCePJ5kIoYtEN2R1ac0cYaRu/vk9dVFkewHQhQ==", - "dev": true, - "dependencies": { - "character-entities": "^2.0.0", - "character-entities-legacy": "^2.0.0", - "character-reference-invalid": "^2.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/power-assert": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.6.1.tgz", - "integrity": "sha512-VWkkZV6Y+W8qLX/PtJu2Ur2jDPIs0a5vbP0TpKeybNcIXmT4vcKoVkyTp5lnQvTpY/DxacAZ4RZisHRHLJcAZQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "empower": "^1.3.1", - "power-assert-formatter": "^1.4.1", - "universal-deep-strict-equal": "^1.2.1", - "xtend": "^4.0.0" - } - }, - "node_modules/power-assert-context-formatter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.2.0.tgz", - "integrity": "sha512-HLNEW8Bin+BFCpk/zbyKwkEu9W8/zThIStxGo7weYcFkKgMuGCHUJhvJeBGXDZf0Qm2xis4pbnnciGZiX0EpSg==", - "dev": true, - "dependencies": { - "core-js": "^2.0.0", - "power-assert-context-traversal": "^1.2.0" - } - }, - "node_modules/power-assert-context-reducer-ast": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.2.0.tgz", - "integrity": "sha512-EgOxmZ/Lb7tw4EwSKX7ZnfC0P/qRZFEG28dx/690qvhmOJ6hgThYFm5TUWANDLK5NiNKlPBi5WekVGd2+5wPrw==", - "dev": true, - "dependencies": { - "acorn": "^5.0.0", - "acorn-es7-plugin": "^1.0.12", - "core-js": "^2.0.0", - "espurify": "^1.6.0", - "estraverse": "^4.2.0" - } - }, - "node_modules/power-assert-context-reducer-ast/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/power-assert-context-traversal": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.2.0.tgz", - "integrity": "sha512-NFoHU6g2umNajiP2l4qb0BRWD773Aw9uWdWYH9EQsVwIZnog5bd2YYLFCVvaxWpwNzWeEfZIon2xtyc63026pQ==", - "dev": true, - "dependencies": { - "core-js": "^2.0.0", - "estraverse": "^4.1.0" - } - }, - "node_modules/power-assert-formatter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz", - "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", - "dev": true, - "dependencies": { - "core-js": "^2.0.0", - "power-assert-context-formatter": "^1.0.7", - "power-assert-context-reducer-ast": "^1.0.7", - "power-assert-renderer-assertion": "^1.0.7", - "power-assert-renderer-comparison": "^1.0.7", - "power-assert-renderer-diagram": "^1.0.7", - "power-assert-renderer-file": "^1.0.7" - } - }, - "node_modules/power-assert-renderer-assertion": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.2.0.tgz", - "integrity": "sha512-3F7Q1ZLmV2ZCQv7aV7NJLNK9G7QsostrhOU7U0RhEQS/0vhEqrRg2jEJl1jtUL4ZyL2dXUlaaqrmPv5r9kRvIg==", - "dev": true, - "dependencies": { - "power-assert-renderer-base": "^1.1.1", - "power-assert-util-string-width": "^1.2.0" - } - }, - "node_modules/power-assert-renderer-base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz", - "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=", - "dev": true - }, - "node_modules/power-assert-renderer-comparison": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.2.0.tgz", - "integrity": "sha512-7c3RKPDBKK4E3JqdPtYRE9cM8AyX4LC4yfTvvTYyx8zSqmT5kJnXwzR0yWQLOavACllZfwrAGQzFiXPc5sWa+g==", - "dev": true, - "dependencies": { - "core-js": "^2.0.0", - "diff-match-patch": "^1.0.0", - "power-assert-renderer-base": "^1.1.1", - "stringifier": "^1.3.0", - "type-name": "^2.0.1" - } - }, - "node_modules/power-assert-renderer-diagram": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.2.0.tgz", - "integrity": "sha512-JZ6PC+DJPQqfU6dwSmpcoD7gNnb/5U77bU5KgNwPPa+i1Pxiz6UuDeM3EUBlhZ1HvH9tMjI60anqVyi5l2oNdg==", - "dev": true, - "dependencies": { - "core-js": "^2.0.0", - "power-assert-renderer-base": "^1.1.1", - "power-assert-util-string-width": "^1.2.0", - "stringifier": "^1.3.0" - } - }, - "node_modules/power-assert-renderer-file": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.2.0.tgz", - "integrity": "sha512-/oaVrRbeOtGoyyd7e4IdLP/jIIUFJdqJtsYzP9/88R39CMnfF/S/rUc8ZQalENfUfQ/wQHu+XZYRMaCEZmEesg==", - "dev": true, - "dependencies": { - "power-assert-renderer-base": "^1.1.1" - } - }, - "node_modules/power-assert-util-string-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.2.0.tgz", - "integrity": "sha512-lX90G0igAW0iyORTILZ/QjZWsa1MZ6VVY3L0K86e2eKun3S4LKPH4xZIl8fdeMYLfOjkaszbNSzf1uugLeAm2A==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringifier": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.4.0.tgz", - "integrity": "sha512-cNsMOqqrcbLcHTXEVmkw9y0fwDwkdgtZwlfyolzpQDoAE1xdNGhQhxBUfiDvvZIKl1hnUEgMv66nHwtMz3OjPw==", - "dev": true, - "dependencies": { - "core-js": "^2.0.0", - "traverse": "^0.6.6", - "type-name": "^2.0.1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-vfile": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-7.2.2.tgz", - "integrity": "sha512-7WL+coet3qyaYb5vrVrfLtOUHgNv9E1D5SIsyVKmHKcgZefy77WMQRk7FByqGKNInoHOlY6xkTGymo29AwjUKg==", - "dev": true, - "dependencies": { - "is-buffer": "^2.0.0", - "vfile": "^5.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, - "node_modules/trough": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", - "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", - "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=", - "dev": true - }, - "node_modules/typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unified": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.1.tgz", - "integrity": "sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", - "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universal-deep-strict-equal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz", - "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", - "dev": true, - "dependencies": { - "array-filter": "^1.0.0", - "indexof": "0.0.1", - "object-keys": "^1.0.0" - } - }, - "node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/vfile": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.1.0.tgz", - "integrity": "sha512-4o7/DJjEaFPYSh0ckv5kcYkJTHQgCKdL8ozMM1jLAxO9ox95IzveDPXCZp08HamdWq8JXTkClDvfAKaeLQeKtg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", - "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz", - "integrity": "sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==", - "dev": true, - "requires": { - "core-js-pure": "^3.19.0", - "regenerator-runtime": "^0.13.4" - } - }, - "@crowdin/crowdin-api-client": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/@crowdin/crowdin-api-client/-/crowdin-api-client-1.12.3.tgz", - "integrity": "sha512-FKlRJrFY4zWJeKLPWtP8To17T7NSBza+Dp0nx1JhptIQwX+hJDzcP5u2OdM3sd0k4l2IujAYN/P3fftgmDY/8w==", - "dev": true, - "requires": { - "axios": "0.21.3" - }, - "dependencies": { - "axios": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.3.tgz", - "integrity": "sha512-JtoZ3Ndke/+Iwt5n+BgSli/3idTvpt5OjKyoCmz4LX5+lPiY5l7C1colYezhlxThjNa/NhngCUWZSZFypIFuaA==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - } - } - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/lunr": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/lunr/-/lunr-2.3.4.tgz", - "integrity": "sha512-j4x4XJwZvorEUbA519VdQ5b9AOU9TSvfi8tvxMAfP8XzNLtFex7A8vFQwqOx3WACbV0KMXbACV3cZl4/gynQ7g==", - "dev": true - }, - "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "@types/node": { - "version": "16.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", - "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", - "dev": true - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "dev": true - }, - "@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz", - "integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "5.5.0", - "@typescript-eslint/scope-manager": "5.5.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz", - "integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz", - "integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz", - "integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0" - } - }, - "@typescript-eslint/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz", - "integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz", - "integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz", - "integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.5.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true - }, - "acorn-es7-plugin": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", - "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "axe-core": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", - "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", - "dev": true - }, - "axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.4" - } - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "bail": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.1.tgz", - "integrity": "sha512-d5FoTAr2S5DSUPKl85WNm2yUwsINN8eidIdIwsOge2t33DaOfOdSmmsI11jMN3GmALCXaw+Y6HMVHDzePshFAA==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", - "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "character-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.0.tgz", - "integrity": "sha512-oHqMj3eAuJ77/P5PaIRcqk+C3hdfNwyCD2DAUcD5gyXkegAuF2USC40CEqPscDk4I8FRGMTojGJQkXDsN5QlJA==", - "dev": true - }, - "character-entities-legacy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-2.0.0.tgz", - "integrity": "sha512-YwaEtEvWLpFa6Wh3uVLrvirA/ahr9fki/NUd/Bd4OR6EdJ8D22hovYQEOUCBfQfcqnC4IAMGMsHXY1eXgL4ZZA==", - "dev": true - }, - "character-reference-invalid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.0.tgz", - "integrity": "sha512-pE3Z15lLRxDzWJy7bBHBopRwfI20sbrMVLQTC7xsPglCHf4Wv1e167OgYAFP78co2XlhojDyAqA+IAJse27//g==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, - "core-js-pure": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.3.tgz", - "integrity": "sha512-N3JruInmCyt7EJj5mAq3csCgGYgiSqu7p7TQp2KOztr180/OAIxyIvL1FCjzgmQk/t3Yniua50Fsak7FShI9lA==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", - "dev": true - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "empower": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/empower/-/empower-1.3.1.tgz", - "integrity": "sha512-uB6/ViBaawOO/uujFADTK3SqdYlxYNn+N4usK9MRKZ4Hbn/1QSy8k2PezxCA2/+JGbF8vd/eOfghZ90oOSDZCA==", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "empower-core": "^1.2.0" - } - }, - "empower-core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-1.2.0.tgz", - "integrity": "sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ==", - "dev": true, - "requires": { - "call-signature": "0.0.2", - "core-js": "^2.0.0" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.0.tgz", - "integrity": "sha512-kv0XQcAQJL/VD9THQKhTQZVqkJKA+tIj/v2ZKNaIHRAADcJWFb+B/BAewUYuF6UVg1s2xC5qXVoDk0G8sKGeTA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.2.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.3", - "aria-query": "^4.2.2", - "array-includes": "^3.1.4", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.3.5", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.7", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.2.1", - "language-tags": "^1.0.5", - "minimatch": "^3.0.4" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true - }, - "espree": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", - "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", - "dev": true, - "requires": { - "acorn": "^8.6.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - } - }, - "espurify": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.1.tgz", - "integrity": "sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==", - "dev": true, - "requires": { - "core-js": "^2.0.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "dev": true - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-alphabetical": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.0.tgz", - "integrity": "sha512-5OV8Toyq3oh4eq6sbWTYzlGdnMT/DPI5I0zxUBxjiigQsZycpkKF3kskkao3JyYGuYDHvhgJF+DrjMQp9SX86w==", - "dev": true - }, - "is-alphanumerical": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.0.tgz", - "integrity": "sha512-t+2GlJ+hO9yagJ+jU3+HSh80VKvz/3cG2cxbGGm4S0hjKuhWQXgPVUVOZz3tqZzMjhmphZ+1TIJTlRZRoe6GCQ==", - "dev": true, - "requires": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-decimal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.0.tgz", - "integrity": "sha512-QfrfjQV0LjoWQ1K1XSoEZkTAzSa14RKVMa5zg3SdAfzEmQzRM4+tbSFWb78creCeA9rNBzaZal92opi1TwPWZw==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.0.tgz", - "integrity": "sha512-vGOtYkiaxwIiR0+Ng/zNId+ZZehGfINwTzdrDqc6iubbnQWhnPuYymOzOKUDqa2cSl59yHnEh2h6MvRLQsyNug==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-plain-obj": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", - "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "jsx-ast-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", - "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", - "dev": true, - "requires": { - "array-includes": "^3.1.3", - "object.assign": "^4.1.2" - } - }, - "language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", - "dev": true - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "dev": true, - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "mdast-util-from-markdown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.0.3.tgz", - "integrity": "sha512-8/GPJsE3h73C+PBFJ3cCdvegz07mLS8/5NfuIsP8q/cw/Ph/aximc6OYdfwerwcZqTYVu7WeXm/8+RDztxreZQ==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "parse-entities": "^3.0.0", - "power-assert": "^1.0.0", - "unist-util-stringify-position": "^3.0.0" - } - }, - "mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromark": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.0.6.tgz", - "integrity": "sha512-yzyfAHhglgEDprJnsvoQVPSXy5OnQfgyatGTxh0XVpismB5+aECnsHY2I1oxsySf6t/2FeamjOLoxun47nVhvw==", - "dev": true, - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "parse-entities": "^3.0.0" - } - }, - "micromark-core-commonmark": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.2.tgz", - "integrity": "sha512-nIxVDZnm1ra2BcnUSUWe9LC3UBTQ/sqUp4do80xXhtCWxBYj7u70Qw2CH54oZu7jblDCxDO3tmNBSprV5EWndg==", - "dev": true, - "requires": { - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "parse-entities": "^3.0.0", - "power-assert": "^1.0.0" - } - }, - "micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-label": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.1.tgz", - "integrity": "sha512-d/we+Gm9cqySOaPmtx109GEbG2dadb2myK9Tcm3aAx9Ug0IL4ucQtzKVoO+02HI10E76ncv9n/VEEF5ym0RzTQ==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "power-assert": "^1.0.0" - } - }, - "micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-title": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.1.tgz", - "integrity": "sha512-nAdDygUZK7WtHFkNi01PzS33jeWPKZXA6LEABQiCVDXvNNUjdQ9o4stT8jBu3BNsE3ZulfG5IGdfWuOWS/CS+w==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "power-assert": "^1.0.0" - } - }, - "micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-decode-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.1.tgz", - "integrity": "sha512-Wf3H6jLaO3iIlHEvblESXaKAr72nK7JtBbLLICPwuZc3eJkMcp4j8rJ5Xv1VbQWMCWWDvKUbVUbE2MfQNznwTA==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "parse-entities": "^3.0.0" - } - }, - "micromark-util-encode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.0.tgz", - "integrity": "sha512-cJpFVM768h6zkd8qJ1LNRrITfY4gwFt+tziPcIf71Ui8yFzY9wG3snZQqiWVq93PG4Sw6YOtcNiKJfVIs9qfGg==", - "dev": true - }, - "micromark-util-html-tag-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz", - "integrity": "sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==", - "dev": true - }, - "micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "dev": true, - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz", - "integrity": "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.1.tgz", - "integrity": "sha512-Zy7XuVepFWm8MqiqFywq4wFu4GXlksyC3e942GaQBXaaCWha3VbkZiTmOEBDCcvp1xKq/xZ2gGEIsCjU+SuEig==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "power-assert": "^1.0.0" - } - }, - "micromark-util-symbol": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.0.tgz", - "integrity": "sha512-NZA01jHRNCt4KlOROn8/bGi6vvpEmlXld7EHcRH+aYWUfL3Wc8JLUNNlqUMKa0hhz6GrpUWsHtzPmKof57v0gQ==", - "dev": true - }, - "micromark-util-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.1.tgz", - "integrity": "sha512-UT0ylWEEy80RFYzK9pEaugTqaxoD/j0Y9WhHpSyitxd99zjoQz7JJ+iKuhPAgOW2MiPSUAx+c09dcqokeyaROA==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "object-inspect": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", - "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-3.0.0.tgz", - "integrity": "sha512-AJlcIFDNPEP33KyJLguv0xJc83BNvjxwpuUIcetyXUsLpVXAUCePJ5kIoYtEN2R1ac0cYaRu/vk9dVFkewHQhQ==", - "dev": true, - "requires": { - "character-entities": "^2.0.0", - "character-entities-legacy": "^2.0.0", - "character-reference-invalid": "^2.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "power-assert": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.6.1.tgz", - "integrity": "sha512-VWkkZV6Y+W8qLX/PtJu2Ur2jDPIs0a5vbP0TpKeybNcIXmT4vcKoVkyTp5lnQvTpY/DxacAZ4RZisHRHLJcAZQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "empower": "^1.3.1", - "power-assert-formatter": "^1.4.1", - "universal-deep-strict-equal": "^1.2.1", - "xtend": "^4.0.0" - } - }, - "power-assert-context-formatter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.2.0.tgz", - "integrity": "sha512-HLNEW8Bin+BFCpk/zbyKwkEu9W8/zThIStxGo7weYcFkKgMuGCHUJhvJeBGXDZf0Qm2xis4pbnnciGZiX0EpSg==", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "power-assert-context-traversal": "^1.2.0" - } - }, - "power-assert-context-reducer-ast": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.2.0.tgz", - "integrity": "sha512-EgOxmZ/Lb7tw4EwSKX7ZnfC0P/qRZFEG28dx/690qvhmOJ6hgThYFm5TUWANDLK5NiNKlPBi5WekVGd2+5wPrw==", - "dev": true, - "requires": { - "acorn": "^5.0.0", - "acorn-es7-plugin": "^1.0.12", - "core-js": "^2.0.0", - "espurify": "^1.6.0", - "estraverse": "^4.2.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "power-assert-context-traversal": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.2.0.tgz", - "integrity": "sha512-NFoHU6g2umNajiP2l4qb0BRWD773Aw9uWdWYH9EQsVwIZnog5bd2YYLFCVvaxWpwNzWeEfZIon2xtyc63026pQ==", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "estraverse": "^4.1.0" - } - }, - "power-assert-formatter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz", - "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "power-assert-context-formatter": "^1.0.7", - "power-assert-context-reducer-ast": "^1.0.7", - "power-assert-renderer-assertion": "^1.0.7", - "power-assert-renderer-comparison": "^1.0.7", - "power-assert-renderer-diagram": "^1.0.7", - "power-assert-renderer-file": "^1.0.7" - } - }, - "power-assert-renderer-assertion": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.2.0.tgz", - "integrity": "sha512-3F7Q1ZLmV2ZCQv7aV7NJLNK9G7QsostrhOU7U0RhEQS/0vhEqrRg2jEJl1jtUL4ZyL2dXUlaaqrmPv5r9kRvIg==", - "dev": true, - "requires": { - "power-assert-renderer-base": "^1.1.1", - "power-assert-util-string-width": "^1.2.0" - } - }, - "power-assert-renderer-base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz", - "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=", - "dev": true - }, - "power-assert-renderer-comparison": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.2.0.tgz", - "integrity": "sha512-7c3RKPDBKK4E3JqdPtYRE9cM8AyX4LC4yfTvvTYyx8zSqmT5kJnXwzR0yWQLOavACllZfwrAGQzFiXPc5sWa+g==", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "diff-match-patch": "^1.0.0", - "power-assert-renderer-base": "^1.1.1", - "stringifier": "^1.3.0", - "type-name": "^2.0.1" - } - }, - "power-assert-renderer-diagram": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.2.0.tgz", - "integrity": "sha512-JZ6PC+DJPQqfU6dwSmpcoD7gNnb/5U77bU5KgNwPPa+i1Pxiz6UuDeM3EUBlhZ1HvH9tMjI60anqVyi5l2oNdg==", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "power-assert-renderer-base": "^1.1.1", - "power-assert-util-string-width": "^1.2.0", - "stringifier": "^1.3.0" - } - }, - "power-assert-renderer-file": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.2.0.tgz", - "integrity": "sha512-/oaVrRbeOtGoyyd7e4IdLP/jIIUFJdqJtsYzP9/88R39CMnfF/S/rUc8ZQalENfUfQ/wQHu+XZYRMaCEZmEesg==", - "dev": true, - "requires": { - "power-assert-renderer-base": "^1.1.1" - } - }, - "power-assert-util-string-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.2.0.tgz", - "integrity": "sha512-lX90G0igAW0iyORTILZ/QjZWsa1MZ6VVY3L0K86e2eKun3S4LKPH4xZIl8fdeMYLfOjkaszbNSzf1uugLeAm2A==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "stringifier": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.4.0.tgz", - "integrity": "sha512-cNsMOqqrcbLcHTXEVmkw9y0fwDwkdgtZwlfyolzpQDoAE1xdNGhQhxBUfiDvvZIKl1hnUEgMv66nHwtMz3OjPw==", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "traverse": "^0.6.6", - "type-name": "^2.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "to-vfile": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-7.2.2.tgz", - "integrity": "sha512-7WL+coet3qyaYb5vrVrfLtOUHgNv9E1D5SIsyVKmHKcgZefy77WMQRk7FByqGKNInoHOlY6xkTGymo29AwjUKg==", - "dev": true, - "requires": { - "is-buffer": "^2.0.0", - "vfile": "^5.1.0" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, - "trough": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", - "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==", - "dev": true - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", - "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=", - "dev": true - }, - "typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "unified": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.1.tgz", - "integrity": "sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - } - }, - "unist-util-stringify-position": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", - "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, - "universal-deep-strict-equal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz", - "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", - "dev": true, - "requires": { - "array-filter": "^1.0.0", - "indexof": "0.0.1", - "object-keys": "^1.0.0" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "vfile": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.1.0.tgz", - "integrity": "sha512-4o7/DJjEaFPYSh0ckv5kcYkJTHQgCKdL8ozMM1jLAxO9ox95IzveDPXCZp08HamdWq8JXTkClDvfAKaeLQeKtg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "vfile-message": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", - "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index efe19a44df90..d53169d3e5bb 100644 --- a/package.json +++ b/package.json @@ -1,46 +1,34 @@ { - "name": "crafttweaker-documentation", - "version": "1.0.0", - "description": "Documentation for the CraftTweaker project", - "private": true, - "scripts": { - "download_translations": "tsc && node out/download_translations.js", - "build": "tsc && node out/build.js", - "test": "tsc && node out/test.js", - "serve": "tsc && node out/generate_reverse_lookup.js && node out/serve.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/CraftTweaker/CraftTweaker-Documentation.git" - }, - "author": "Jaredlll08", - "license": "MIT", - "type": "module", - "bugs": { - "url": "https://github.com/CraftTweaker/CraftTweaker-Documentation/issues" - }, - "homepage": "https://github.com/CraftTweaker/CraftTweaker-Documentation#readme", - "devDependencies": { - "@crowdin/crowdin-api-client": "1.12.3", - "@types/fs-extra": "9.0.13", - "@types/lunr": "2.3.4", - "@types/node": "16.11.11", - "@typescript-eslint/eslint-plugin": "5.5.0", - "@typescript-eslint/parser": "5.5.0", - "axios": "0.24.0", - "cross-env": "7.0.3", - "deepmerge": "^4.2.2", - "dotenv": "10.0.0", - "eslint": "8.4.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "extract-zip": "^2.0.1", - "fs-extra": "10.0.0", - "github-slugger": "1.4.0", - "lunr": "2.3.9", - "remark-parse": "10.0.1", - "to-vfile": "7.2.2", - "ts-node": "10.4.0", - "typescript": "4.5.2", - "unified": "10.1.1" - } + "name": "crafttweaker-documentation", + "version": "1.0.0", + "description": "Documentation for the CraftTweaker project", + "scripts": { + "site-dev": "pnpm -r --stream --filter \"./packages/docs-site\" dev", + "site-build": "pnpm -r --stream --filter \"./packages/docs-site\" build", + "site-preview": "pnpm -r --stream --filter \"./packages/docs-site\" preview", + "site-full": "pnpm -r --stream --filter \"./packages/docs-site\" build && pnpm -r --stream --filter \"./packages/docs-site\" preview", + "search-generate": "pnpm --filter \"./packages/docs-model\" build && pnpm --filter \"./packages/remark-search\" build && pnpm --filter \"./packages/docs-search\" build && pnpm --filter \"./packages/docs-search\" generate-search-index", + "build": "pnpm build-deps && pnpm -r --stream --filter \"./packages/docs-build\" build-docs", + "build-full": "pnpm build && pnpm site-build", + "build-deps": "pnpm -r --stream --filter \"./packages/**\" --filter \"!./packages/docs-site\" --filter \"!./packages/docs-build\" build" + }, + "workspaces": ["packages/*"], + "repository": { + "type": "git", + "url": "git+https://github.com/CraftTweaker/CraftTweaker-Documentation.git" + }, + "author": "Jaredlll08", + "license": "MIT", + "type": "module", + "bugs": { + "url": "https://github.com/CraftTweaker/CraftTweaker-Documentation/issues" + }, + "homepage": "https://github.com/CraftTweaker/CraftTweaker-Documentation", + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@types/node": "22.10.2", + "tsup": "8.3.5", + "tsx": "^4.19.2", + "typescript": "5.7.2" + } } diff --git a/packages/docs-build/package.json b/packages/docs-build/package.json new file mode 100644 index 000000000000..41693cda00e1 --- /dev/null +++ b/packages/docs-build/package.json @@ -0,0 +1,32 @@ +{ + "name": "docs-build", + "version": "1.0.0", + "license": "MIT", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + "types": "./dist/types.d.ts", + "default": "./dist/index.js" + }, + "files": ["dist"], + "scripts": { + "build-docs": "pnpm build && node --env-file=../../.env dist/index.js", + "build": "tsup", + "dev": "tsup --watch" + }, + "dependencies": { + "@types/fs-extra": "11.0.4", + "github-slugger": "^2.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "11.2.0", + "unist-util-visit": "^5.0.0", + "docs-model": "workspace:*", + "docs-search": "workspace:*", + "remark-directive": "^3.0.0", + "remark-inject-url-version": "workspace:1.0.0", + "remark-table": "workspace:1.0.0", + "remark": "^15.0.1" + } +} diff --git a/packages/docs-build/src/index.ts b/packages/docs-build/src/index.ts new file mode 100644 index 000000000000..d764981af4b9 --- /dev/null +++ b/packages/docs-build/src/index.ts @@ -0,0 +1,304 @@ +import fs from "fs-extra"; +import path from "node:path"; + +import {BUILD_DIR, checkForDuplicates, clearDirectory, DIST_DIR, DOCS_OUT_DIR, doJsonMerge, EXPORTED_DIR, getVersionsInDir, listFiles, OUT_DIR, walk, walkReversed,} from "./util"; +import type {Docs, PageMeta, Types} from "docs-model"; +import remarkIUV from "remark-inject-url-version"; +import remarkDirective from "remark-directive"; +import {remark} from "remark"; +import merge from "deepmerge"; +import {generateSearchIndex} from "docs-search" +console.time("Total"); +process.chdir(path.join("..", "..")); + +clearDirectory(BUILD_DIR); +clearDirectory(DIST_DIR); +await prepareBuildFolders(); +await prepareExportedBuildFolders(); +await mergeExported(); +await processMarkdown(); +await supplementMeta(); +await generateSearchIndex(); +await finalize(); +console.timeEnd("Total"); + +/** + * Creates the out directory and copies the base 'docs' folder to it. + */ +async function prepareBuildFolders(): Promise { + console.time("prepareBuildFolders"); + console.log("Starting build folder preparation"); + + fs.mkdirSync(OUT_DIR, { recursive: true }); + fs.copySync("docs", path.join(OUT_DIR)); + + console.log("Finished build folder preparation"); + console.timeEnd("prepareBuildFolders"); +} + +/** + * Creates the exported out directory and copies the base 'docs_exported' folder to it. + */ +async function prepareExportedBuildFolders(): Promise { + console.time("prepareExportedBuildFolders"); + console.log("Starting exported build folder preparation"); + + fs.mkdirSync(EXPORTED_DIR, { recursive: true }); + fs.copySync("docs_exported", EXPORTED_DIR); + + console.log("Finished exported build folder preparation"); + console.timeEnd("prepareExportedBuildFolders"); +} + +/** + * Loops through all the versions in the exported dir + * loops through all the folders in those version folders looking for a docs folder and docs.json file. + * If both files are found, check and report duplicate files, then copy the docs folder to the output directory. + * Merge the 'docs.json' files + */ +async function mergeExported(): Promise { + console.time("mergeExported"); + console.log("Starting merging"); + + const versions = getVersionsInDir(EXPORTED_DIR); + + for (const version of versions) { + console.log(`Copying '${version}' to output directory`); + const versionDir = path.join(EXPORTED_DIR, version); + const exportsSubDirs: string[] = fs.readdirSync(versionDir); + const docJsons: string[] = []; + + const mainJson = path.join(OUT_DIR, version, "docs.json"); + if (!fs.existsSync(mainJson)) { + console.error( + `'${version}' does not have a main 'docs.json' in directory '${mainJson}': this is a serious error!`, + ); + continue; + } + + + for (const subDirectory of exportsSubDirs) { + const subDir = path.join(versionDir, subDirectory); + const docsDir = path.join(subDir, "docs"); + const docsJson = path.join(subDir, "docs.json"); + + if (!fs.existsSync(docsDir)) { + console.error( + `${subDir} does not have a 'docs' folder, skipping.`, + ); + continue; + } + if (!fs.existsSync(docsJson)) { + console.error( + `${subDir} does not have a 'docs.json' file, skipping.`, + ); + continue; + } + + const dstDir = path.join(OUT_DIR, version, "content"); + const dupes = checkForDuplicates(docsDir, dstDir, true); + if (dupes.length > 0) { + console.error( + `Duplicate files were identified for '${docsDir}': docs merging will ignore these files!`, + ); + console.error(`Found files: ${dupes}`); + } + + fs.copySync(docsDir, dstDir, { + overwrite: false, + errorOnExist: false, + }); + + docJsons.push(docsJson); + } + + // Push this last so it can define the layout for the merge + docJsons.push(mainJson); + + console.log(`Merging 'docs.json' files for '${version}'`); + const mergedJson: Docs = doJsonMerge(docJsons); + fs.writeFileSync(mainJson, JSON.stringify(mergedJson)); + } + + console.log("Finished merging"); + console.timeEnd("mergeExported"); +} + +/** + * Loops through all the markdown files in the out directory and processes them with remark, injecting the version number into urls + */ +async function processMarkdown(): Promise { + console.time("processMarkdown"); + console.log("Starting processing markdown"); + + const fileList = listFiles(OUT_DIR, [], true, ["md"]); + + const filesForVersions = fileList.reduce>( + (acc, current) => { + const version = path.relative(OUT_DIR, current).split(path.sep)[0]; + if (!acc[version]) { + acc[version] = []; + } + const files = acc[version]; + files.push(current); + return acc; + }, + {}, + ); + for (const version of Object.keys(filesForVersions)) { + const markdown = remark().use(remarkIUV, version).use(remarkDirective); + for (const value of filesForVersions[version].values()) { + fs.writeFileSync( + value, + await markdown + .process(fs.readFileSync(value, "utf-8")) + .then((file) => file.value), + ); + } + } + console.log("Finished processing markdown"); + console.timeEnd("processMarkdown"); +} + +/** + * Generates the meta for each page, creating json files for each markdown file, adding the meta object to json files and adding everything to the types.json + */ +async function supplementMeta(): Promise { + console.time("supplementMeta"); + console.log("Starting supplementing docs meta"); + + for (const version of getVersionsInDir(OUT_DIR)) { + console.log(`Started ${version}`); + const docsJsonPath = path.join(OUT_DIR, version, "docs.json"); + const typesJsonPath = path.join(OUT_DIR, version, "types.json"); + const docsJson = JSON.parse(fs.readFileSync(docsJsonPath, "utf-8")); + const paths = walk(docsJson, []); + const reversePaths = walkReversed(docsJson.nav, {}, []); + const typesJson: Types = fs.existsSync(typesJsonPath) + ? JSON.parse(fs.readFileSync(typesJsonPath, "utf-8")) + : {}; + + paths.forEach((obj, i) => { + let pageMeta: PageMeta = { + folders: reversePaths[obj.path], + current: obj, + path: obj.path, + }; + // We want this to run last, so we can override the files if they (incorrectly) contain the information + const fillNav = (pageMeta: PageMeta, index: number) => { + if (index > 0) { + pageMeta.previous = { ...paths[index - 1] }; + pageMeta.previous.path = pageMeta.previous.path.replace( + /\.(md|json)/, + "", + ); + } + if (index < paths.length - 1) { + pageMeta.next = { ...paths[index + 1] }; + pageMeta.next.path = pageMeta.next.path.replace( + /\.(md|json)/, + "", + ); + } + }; + + if (obj.path.endsWith(".md")) { + const docsMetaJsonPath = obj.path.replace(/\.md/, ".json"); + const fullMetaJsonPath = path.join( + OUT_DIR, + version, + "content", + docsMetaJsonPath, + ); + if (fs.existsSync(fullMetaJsonPath)) { + const docsMetaJson = JSON.parse( + fs.readFileSync(fullMetaJsonPath, "utf-8"), + ); + pageMeta = merge(pageMeta, docsMetaJson); + } + fillNav(pageMeta, i); + fs.writeJSONSync(fullMetaJsonPath, pageMeta); + } else if (obj.path.endsWith(".json")) { + const fullJsonPath = path.join( + OUT_DIR, + version, + "content", + obj.path, + ); + const pageJson = JSON.parse( + fs.readFileSync(fullJsonPath, "utf-8"), + ); + pageMeta.path = `${pageJson.key}.json`; + pageJson.meta = merge(pageMeta, pageJson.meta ?? {}); + fillNav(pageJson.meta, i); + fs.writeJSONSync(fullJsonPath, pageJson); + //TODO find a way to not hardcode it + if ( + pageJson.kind === "type" || + pageJson.kind === "event" || + pageJson.kind === "enum" + ) { + if (!typesJson[pageJson.type.key]) { + typesJson[pageJson.type.key] = { + keys: [], + }; + } + typesJson[pageJson.type.key].keys.push(pageJson.key); + } + } + }); + fs.writeFileSync( + path.join(OUT_DIR, version, "types.json"), + JSON.stringify(typesJson), + ); + console.log(`Finished ${version}`); + } + console.log("Finished supplementing docs meta"); + console.timeEnd("supplementMeta"); +} + +async function finalize(): Promise { + console.time("finalize"); + console.log("Starting finalization"); + const outDir = OUT_DIR; + const docsOutDir = DOCS_OUT_DIR; + fs.mkdirsSync(docsOutDir); + const versions = getVersionsInDir(outDir); + for (const version of versions) { + console.log(`Finalizing pages ${version}`); + const verlangDir = path.join(docsOutDir, version); + fs.mkdirsSync(verlangDir); + fs.copySync(path.join(outDir, version), verlangDir); + console.log(`Finalized pages ${version}`); + } + fs.copyFileSync(path.join(outDir, "versions.json"), path.join(docsOutDir, "versions.json")) + + const siteDir = path.join("packages", "docs-site"); + const finalDir = path.join(siteDir, "src", "docs"); + clearDirectory(finalDir); + fs.copySync(docsOutDir, finalDir); + const publicDir = path.join(siteDir, "public"); + for (const version of versions) { + console.log(`Finalizing public /${version}`); + clearDirectory(path.join(publicDir, version)); + const verlangDir = path.join(publicDir, version, "en"); + fs.mkdirsSync(verlangDir); + const files: string[] = []; + listFiles(path.join(outDir, version), files, true); + console.time("finalize-public"); + console.log(`Copying files ${version}`); + for (const file of files) { + const newFilePath = path + .relative(path.join(outDir, version), file) + .replace(`content${path.sep}`, ""); + const dest = path.join(publicDir, version, "en", newFilePath); + fs.mkdirSync(path.dirname(dest), { recursive: true }); + fs.copyFileSync(file, dest); + } + console.log(`Copied files ${version}`); + console.timeEnd("finalize-public"); + console.log(`Finalized public ${version}`); + } + console.log("Finished finalization"); + console.timeEnd("finalize"); +} diff --git a/packages/docs-build/src/util.ts b/packages/docs-build/src/util.ts new file mode 100644 index 000000000000..65741c3e9205 --- /dev/null +++ b/packages/docs-build/src/util.ts @@ -0,0 +1,208 @@ +import fs from "fs-extra"; +import path from "node:path"; +import merge from "deepmerge"; +import type {Docs, DocsReverseLookup, Nav, Page} from "docs-model"; + +export const BUILD_DIR = path.join("build"); +export const DIST_DIR = path.join("dist"); +export const TMP_DIR = path.join(BUILD_DIR, "tmp"); +export const DOCS_OUT_DIR = path.join(BUILD_DIR, "docs"); +export const OUT_DIR = path.join(TMP_DIR, "out"); +export const EXPORTED_DIR = path.join(TMP_DIR, "exported"); + +/** + * Clears a directory of all files, creating it if it doesn't exist. + */ +export function clearDirectory(dir: string): void { + if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true }); + fs.mkdirSync(dir, { recursive: true }); +} + +/** + * Gets a list of versions based on files in the given directory. + */ +export function getVersionsInDir(dir: string): string[] { + return fs.readdirSync(dir).filter(value => fs.statSync(path.join(dir, value)).isDirectory()); +} + +/** + * Gets a list of versions based on files in the 'docs' or 'docs_exported' folders + */ +export function getVersions(exported = false): string[] { + return getVersionsInDir(exported ? "docs_exported" : "docs"); +} + +export function getDocsOutDir(): string { + return path.join("build", "docs"); +} + +export function getExportedDir(): string { + return path.join("build", "tmp", "exported"); +} + +export function doJsonMerge(jsonPaths: string[]): Docs { + let json: Docs = { nav: {} }; + for (const path of jsonPaths.reverse()) { + const jsonText = fs.readFileSync(path, "utf8"); + json = merge(json, JSON.parse(jsonText)); + console.log(`Merged file '${path}'`); + } + return json; +} + +export function mergeExportedDocs( + buildsDir: string, + exportedDocsDir: string, +): void { + const versions = getVersionsInDir(exportedDocsDir); + + for (const version of versions) { + console.log(`Copying version '${version}' to output directory`); + const versionDir = path.join(exportedDocsDir, version); + const exportsSubDirs: string[] = fs.readdirSync(versionDir); + const docJsons: string[] = []; + for (const subDirectory of exportedDocsDir) { + const docsDir = path.join(versionDir, subDirectory, "docs"); + const docsJson = path.join(versionDir, subDirectory, "docs.json"); + + if (fs.existsSync(docsDir)) { + const dstDir = path.join(buildsDir, version, "content"); + const dupes = checkForDuplicates(docsDir, dstDir, true); + if (dupes.length > 0) { + console.log(docsDir); + console.log(dstDir); + console.error( + `Duplicate files were identified for version '${version}': docs merging will ignore these files!`, + ); + console.error(`Found files: ${dupes}`); + } + + fs.copySync(docsDir, path.join(buildsDir, version, "content"), { + overwrite: false, + errorOnExist: false, + }); + + if (fs.existsSync(docsJson)) { + docJsons.push(docsJson); + } else { + console.error( + `Directory '${docsDir}' does not define any 'docs.json' files: check your automated export script!`, + ); + } + } else { + console.log( + `Subdirectory '${subDirectory}' does not host docs for version '${version}': skipping`, + ); + } + } + + const mainJson = path.join(buildsDir, version, "docs.json"); + if (fs.existsSync(mainJson)) { + docJsons.push(mainJson); + } else { + console.error( + `Version '${version}' does not define a main 'docs.json' in directory '${mainJson}': this is a serious error!`, + ); + } + + console.log(`Merging 'docs.json' files for version '${version}'`); + const mergedJson: Docs = doJsonMerge(docJsons); + fs.writeFileSync( + path.join(buildsDir, version, "docs.json"), + JSON.stringify(mergedJson), + ); + } +} + +export function checkForDuplicates( + src: string, + dst: string, + recursive: boolean, +): string[] { + let srcFiles: string[] = []; + let dstFiles: string[] = []; + listFiles(src, srcFiles, recursive); + listFiles(dst, dstFiles, recursive); + srcFiles = srcFiles.map((value) => value.substring(src.length)); + dstFiles = dstFiles.map((value) => value.substring(dst.length)); + + const dupes: string[] = []; + for (const file of srcFiles) { + if (dstFiles.includes(file)) { + dupes.push(file); + } + } + + return dupes; +} + +export function listFiles( + dir: string, + fileList: string[], + recursive: boolean, + extensionFilters: string[] = [], +): string[] { + const shouldFilter = extensionFilters.length > 0; + const files = fs.readdirSync(dir); + let newFileList = fileList || []; + + for (const file of files) { + if (recursive && fs.statSync(path.join(dir, file)).isDirectory()) { + newFileList = listFiles( + path.join(dir, file), + newFileList, + recursive, + extensionFilters, + ); + } else { + const shouldAdd = + !shouldFilter || + extensionFilters.some((filter) => file.endsWith(`.${filter}`)); + if (shouldAdd) { + newFileList.push(path.join(dir, file)); + } + } + } + return newFileList; +} + +export function walk(doc: Nav | Nav[], done: Page[]): Page[] { + let donePages = done || []; + + for (const docKey in doc) { + if (!(docKey in doc)) { + continue; + } + // @ts-ignore + const val = doc[docKey]; + if (typeof val === "object") { + donePages = walk(val as Nav[], donePages); + } else { + donePages.push({ name: docKey, path: val }); + } + } + return donePages; +} + +export function walkReversed( + doc: Nav | Nav[], + done: DocsReverseLookup, + parents: string[], +): DocsReverseLookup { + let donePages = done || {}; + + for (const docKey in doc) { + if (!(docKey in doc)) { + continue; + } + // @ts-ignore + const val = doc[docKey]; + + if (typeof val === "object") { + donePages = walkReversed(val, donePages, [...parents, docKey]); + } else { + donePages[val] = parents; + } + } + return donePages; +} diff --git a/packages/docs-build/tsconfig.json b/packages/docs-build/tsconfig.json new file mode 100644 index 000000000000..70183c523ab8 --- /dev/null +++ b/packages/docs-build/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "allowJs": false, + "baseUrl": "./src", + "esModuleInterop": true, + "lib": ["esnext"], + "module": "ESNext", + "moduleResolution": "node", + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitAny": true, + "outDir": "dist", + "resolveJsonModule": true, + "strict": true, + "target": "ESNext", + "paths": { + "docs-model": ["../../docs-model/src"], + "docs-search": ["../../docs-search/src"] + } + } +} diff --git a/packages/docs-build/tsup.config.ts b/packages/docs-build/tsup.config.ts new file mode 100644 index 000000000000..c4874d2269d5 --- /dev/null +++ b/packages/docs-build/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["esm"], + dts: true, + splitting: false, + sourcemap: true, + clean: true, + tsconfig: "tsconfig.json", +}); diff --git a/packages/docs-model/package.json b/packages/docs-model/package.json new file mode 100644 index 000000000000..2112f15b6d84 --- /dev/null +++ b/packages/docs-model/package.json @@ -0,0 +1,21 @@ +{ + "name": "docs-model", + "version": "1.0.0", + "license": "MIT", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + "types": "./dist/types.d.ts", + "default": "./dist/index.js" + }, + "files": ["dist"], + "scripts": { + "build": "tsup", + "dev": "tsup --watch" + }, + "dependencies": { + "@expressive-code/core": "^0.38.3" + } +} diff --git a/packages/docs-model/src/Comment.ts b/packages/docs-model/src/Comment.ts new file mode 100644 index 000000000000..643bac40752d --- /dev/null +++ b/packages/docs-model/src/Comment.ts @@ -0,0 +1,248 @@ +import type { + BoldCommentJson, + CodeCommentJson, + CommentJson, + ItalicsCommentJson, + LinkCommentJson, + ListCommentJson, + ListItemCommentJson, + ParagraphCommentJson, + PlaintextCommentJson, + RootCommentJson, +} from "./types"; + +export enum CommentKindModel { + ROOT = "root", + BOLD = "bold", + CODE = "code", + ITALICS = "italics", + LINK = "link", + NEW_LINE = "new_line", + PARAGRAPH = "paragraph", + PLAINTEXT = "plaintext", + LIST = "list", + LIST_ITEM = "list_item", +} + +export class CommentModel { + readonly kind: CommentKindModel; + + constructor(kind: CommentKindModel) { + this.kind = kind; + } + + public static parseComment(obj: CommentJson): CommentModel { + if (!obj || !obj.kind) { + throw Error(`Unable to parse comment '${JSON.stringify(obj)}'`); + } + switch (obj.kind) { + case CommentKindModel.ROOT: + return RootCommentModel.parse(obj); + case CommentKindModel.BOLD: + return BoldCommentModel.parse(obj); + case CommentKindModel.CODE: + return CodeCommentModel.parse(obj); + case CommentKindModel.ITALICS: + return ItalicsCommentModel.parse(obj); + case CommentKindModel.LINK: + return LinkCommentModel.parse(obj); + case CommentKindModel.NEW_LINE: + return new NewLineCommentModel(); + case CommentKindModel.PARAGRAPH: + return ParagraphCommentModel.parse(obj); + case CommentKindModel.PLAINTEXT: + return PlaintextCommentModel.parse(obj); + case CommentKindModel.LIST: + return ListCommentModel.parse(obj); + case CommentKindModel.LIST_ITEM: + return ListItemCommentModel.parse(obj); + default: + throw Error(`Unknown comment '${JSON.stringify(obj)}'`); + } + } + + static parseComments(obj: CommentJson[]): CommentModel[] { + return obj.map((commentObj) => CommentModel.parseComment(commentObj)); + } + + renderToString(): string { + throw Error(`Unable to render comment '${JSON.stringify(this)}'`); + } +} + +export class BoldCommentModel extends CommentModel { + readonly content: CommentModel[]; + + constructor(content: CommentModel[]) { + super(CommentKindModel.BOLD); + this.content = content; + } + + static parse(obj: BoldCommentJson) { + return new BoldCommentModel(CommentModel.parseComments(obj.content)); + } + + renderToString(): string { + return this.content.map((value) => value.renderToString()).join(" "); + } +} + +export class CodeCommentModel extends CommentModel { + readonly content: CommentModel[]; + + constructor(content: CommentModel[]) { + super(CommentKindModel.CODE); + this.content = content; + } + + static parse(obj: CodeCommentJson) { + return new CodeCommentModel(CommentModel.parseComments(obj.content)); + } + + renderToString(): string { + return this.content.map((value) => value.renderToString()).join(" "); + } +} + +export class ItalicsCommentModel extends CommentModel { + readonly content: CommentModel[]; + + constructor(content: CommentModel[]) { + super(CommentKindModel.ITALICS); + this.content = content; + } + + static parse(obj: ItalicsCommentJson) { + return new ItalicsCommentModel(CommentModel.parseComments(obj.content)); + } + + renderToString(): string { + return this.content.map((value) => value.renderToString()).join(" "); + } +} + +export class LinkCommentModel extends CommentModel { + readonly to: string; + readonly plain: boolean; + readonly content: CommentModel[]; + + constructor(to: string, plain: boolean, content: CommentModel[]) { + super(CommentKindModel.LINK); + this.to = to; + this.plain = plain; + this.content = content; + } + + static parse(obj: LinkCommentJson) { + return new LinkCommentModel( + obj.to, + obj.plain, + CommentModel.parseComments(obj.content), + ); + } + + renderToString(): string { + return this.content.map((value) => value.renderToString()).join(" "); + } +} + +export class ListCommentModel extends CommentModel { + readonly content: CommentModel[]; + + constructor(content: CommentModel[]) { + super(CommentKindModel.LIST); + this.content = content; + } + + static parse(obj: ListCommentJson) { + return new ListCommentModel(CommentModel.parseComments(obj.content)); + } + + renderToString(): string { + return this.content.map((value) => value.renderToString()).join("\n"); + } +} + +export class ListItemCommentModel extends CommentModel { + readonly content: CommentModel[]; + + constructor(content: CommentModel[]) { + super(CommentKindModel.LIST_ITEM); + this.content = content; + } + + static parse(obj: ListItemCommentJson) { + return new ListItemCommentModel( + CommentModel.parseComments(obj.content), + ); + } + + renderToString(): string { + return this.content + .map((value) => `- ${value.renderToString()}`) + .join("\n"); + } +} + +export class NewLineCommentModel extends CommentModel { + constructor() { + super(CommentKindModel.NEW_LINE); + } + + renderToString(): string { + return "\n"; + } +} + +export class ParagraphCommentModel extends CommentModel { + readonly content: CommentModel[]; + + constructor(content: CommentModel[]) { + super(CommentKindModel.PARAGRAPH); + this.content = content; + } + + static parse(obj: ParagraphCommentJson) { + return new ParagraphCommentModel( + CommentModel.parseComments(obj.content), + ); + } + + renderToString(): string { + return this.content.map((value) => value.renderToString()).join(" "); + } +} + +export class PlaintextCommentModel extends CommentModel { + readonly content: string; + + constructor(content: string) { + super(CommentKindModel.PLAINTEXT); + this.content = content; + } + + static parse(obj: PlaintextCommentJson) { + return new PlaintextCommentModel(obj.content); + } + + renderToString(): string { + return this.content; + } +} + +export class RootCommentModel extends CommentModel { + readonly children: CommentModel[]; + + constructor(children: CommentModel[]) { + super(CommentKindModel.ROOT); + this.children = children; + } + + static parse(obj: RootCommentJson) { + return new RootCommentModel(CommentModel.parseComments(obj.children)); + } + + renderToString(): string { + return this.children.map((value) => value.renderToString()).join(" "); + } +} diff --git a/packages/docs-model/src/Extra.ts b/packages/docs-model/src/Extra.ts new file mode 100644 index 000000000000..2d9ebeed7427 --- /dev/null +++ b/packages/docs-model/src/Extra.ts @@ -0,0 +1,278 @@ +import { CommentModel } from "./Comment"; +import { ifPresent } from "./Util"; +import type { + CommentJson, + DeprecatedJson, + ExamplesJson, + ExtraJson, + ModJson, + ObtentionJson, + ParameterCommentsJson, +} from "./types"; + +export class BracketEnum { + readonly value: string; + + constructor(value: string) { + this.value = value; + } + + static parse(obj: string) { + if (obj) { + return new BracketEnum(obj); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class Deprecated { + readonly reason: CommentModel | undefined; + readonly since: CommentModel | undefined; + readonly forRemoval: boolean; + + constructor( + reason: CommentModel | undefined, + since: CommentModel | undefined, + forRemoval: boolean, + ) { + this.reason = reason; + this.since = since; + this.forRemoval = forRemoval; + } + + static parse(obj: DeprecatedJson) { + if (obj) { + return new Deprecated( + CommentModel.parseComment(obj.reason), + CommentModel.parseComment(obj.since), + obj.for_removal, + ); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class EventParent {} + +export class Examples { + readonly examples: ExamplesJson; + + constructor(examples: ExamplesJson) { + this.examples = examples; + } + + static parse(obj: ExamplesJson) { + if (obj) { + return new Examples(obj); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class Loaders { + readonly value: string[]; + + constructor(value: string[]) { + this.value = value; + } + + static parse(obj: string[]) { + if (obj) { + return new Loaders(obj); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class Obtention { + readonly method: CommentModel; + + constructor(method: CommentModel) { + this.method = method; + } + + static parse(obj: ObtentionJson) { + if (obj) { + return new Obtention(CommentModel.parseComment(obj.method)); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class ParameterComments { + readonly comments: { [key: string]: CommentModel }; + + constructor(comments: { [key: string]: CommentModel }) { + this.comments = comments; + } + + static parse(obj: ParameterCommentsJson) { + if (obj) { + const comments: { [key: string]: CommentModel } = {}; + for (const key of Object.keys(obj)) { + comments[key] = CommentModel.parseComment(obj[key]); + } + return new ParameterComments(comments); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } + + getCommentFor(key: string): CommentModel | undefined { + return this.comments[key]; + } +} + +export class Mod { + readonly modId: string; + readonly displayName: string; + readonly url: string; + + constructor(modId: string, displayName: string, url: string) { + this.modId = modId; + this.displayName = displayName; + this.url = url; + } + + static parse(obj: ModJson) { + if (obj) { + return new Mod(obj.mod_id, obj.display_name, obj.url); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class RequiredMods { + readonly value: Mod[]; + + constructor(value: Mod[]) { + this.value = value; + } + + static parse(obj: ModJson[]) { + if (obj) { + return new RequiredMods(obj.map(Mod.parse)); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class Returns { + readonly description: CommentModel; + + constructor(description: CommentModel) { + this.description = description; + } + + static parse(obj: CommentJson) { + if (obj) { + return new Returns(CommentModel.parseComment(obj)); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class See { + readonly what: CommentModel; + + constructor(what: CommentModel) { + this.what = what; + } + + static parse(obj: CommentJson) { + if (obj) { + return new See(CommentModel.parseComment(obj)); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class Since { + readonly when: CommentModel; + + constructor(when: CommentModel) { + this.when = when; + } + + static parse(obj: CommentJson) { + if (obj) { + return new Since(CommentModel.parseComment(obj)); + } + throw new Error(`Unable to parse '${JSON.stringify(obj)}'`); + } +} + +export class Extra { + + public static EMPTY = new Extra(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined); + readonly bracketEnum: BracketEnum | undefined; + readonly deprecated: Deprecated | undefined; + readonly eventParent: EventParent | undefined; + readonly examples: Examples | undefined; + readonly loaders: Loaders | undefined; + readonly obtention: Obtention | undefined; + readonly parameterComment: ParameterComments | undefined; + readonly requiredMods: RequiredMods | undefined; + readonly returns: Returns | undefined; + readonly see: See | undefined; + readonly since: Since | undefined; + + constructor( + bracketEnum: BracketEnum | undefined, + deprecated: Deprecated | undefined, + eventParent: EventParent | undefined, + examples: Examples | undefined, + loaders: Loaders | undefined, + obtention: Obtention | undefined, + parameterComment: ParameterComments | undefined, + requiredMods: RequiredMods | undefined, + returns: Returns | undefined, + see: See | undefined, + since: Since | undefined, + ) { + this.bracketEnum = bracketEnum; + this.deprecated = deprecated; + this.eventParent = eventParent; + this.examples = examples; + this.loaders = loaders; + this.obtention = obtention; + this.parameterComment = parameterComment; + this.requiredMods = requiredMods; + this.returns = returns; + this.see = see; + this.since = since; + } + + static parse(obj: ExtraJson) { + const bracketEnum = ifPresent(obj.bracket_enum, BracketEnum.parse); + const deprecated = ifPresent(obj.deprecated, Deprecated.parse); + const eventParent = ifPresent( + obj.event_parent, + () => new EventParent(), + ); + const examples = ifPresent(obj.examples, Examples.parse); + const loaders = ifPresent(obj.loaders, Loaders.parse); + const obtention = ifPresent(obj.obtention, Obtention.parse); + const parameterComment = ifPresent( + obj.parameter_comment, + ParameterComments.parse, + ); + const requiredMods = ifPresent(obj.required_mods, RequiredMods.parse); + const returns = ifPresent(obj.returns, Returns.parse); + const see = ifPresent(obj.see, See.parse); + const since = ifPresent(obj.since, Since.parse); + + return new Extra( + bracketEnum, + deprecated, + eventParent, + examples, + loaders, + obtention, + parameterComment, + requiredMods, + returns, + see, + since, + ); + } +} diff --git a/packages/docs-model/src/Member.ts b/packages/docs-model/src/Member.ts new file mode 100644 index 000000000000..1ba0bc611e32 --- /dev/null +++ b/packages/docs-model/src/Member.ts @@ -0,0 +1,1009 @@ +import { CommentModel } from "./Comment"; +import { Extra } from "./Extra"; +import type { PageModel } from "./Page"; +import { TypeModel } from "./Type"; +import { ifPresent, parseMap } from "./Util"; +import type { + BuildContext, + CasterMemberJson, + ConstructorMemberJson, + EnumConstantMemberJson, + FieldMemberJson, + GetterMemberJson, + MemberGroupJson, + MemberJson, + MethodMemberJson, + OperatorMemberJson, + ParameterJson, + SetterMemberJson, +} from "./types.d.ts"; + +export enum MemberKindModel { + METHOD = "method", + GETTER = "getter", + SETTER = "setter", + FIELD = "field", + ENUM_CONSTANT = "enum_constant", + CASTER = "caster", + OPERATOR = "operator", + CONSTRUCTOR = "constructor", +} + +export enum MemberOriginModel { + DECLARED = "declared", + NATIVE = "native", + INHERITED = "inherited", +} + +export namespace MemberOriginModel { + export function parse(obj: string) { + switch (obj) { + case "declared": + return MemberOriginModel.DECLARED; + case "native": + return MemberOriginModel.NATIVE; + case "inherited": + return MemberOriginModel.INHERITED; + } + throw new Error(`Unable to parse origin '${JSON.stringify(obj)}'`); + } +} + +export enum OperatorTypeModel { + ADD = "+", + SUB = "-", + MUL = "*", + DIV = "/", + MOD = "%", + CAT = "~", + OR = "|", + AND = "&", + XOR = "^", + NEG = "-", + INVERT = "~", + NOT = "!", + INDEXSET = "[]=", + INDEXGET = "[]", + CONTAINS = "in", + COMPARE = "compare", + MEMBERGETTER = ".", + MEMBERSETTER = ".=", + EQUALS = "==", + NOTEQUALS = "!=", + SHL = "<<", + SHR = ">>", + USHR = ">>>", + ADDASSIGN = "+=", + SUBASSIGN = "-=", + MULASSIGN = "*=", + DIVASSIGN = "/=", + MODASSIGN = "%=", + CATASSIGN = "~=", + ORASSIGN = "|=", + ANDASSIGN = "&=", + XORASSIGN = "^=", + SHLASSIGN = "<<=", + SHRASSIGN = ">>=", + USHRASSIGN = ">>>=", +} + +export namespace OperatorTypeModel { + export function parse(obj: string) { + switch (obj) { + case "add": + return OperatorTypeModel.ADD; + case "sub": + return OperatorTypeModel.SUB; + case "mul": + return OperatorTypeModel.MUL; + case "div": + return OperatorTypeModel.DIV; + case "mod": + return OperatorTypeModel.MOD; + case "cat": + return OperatorTypeModel.CAT; + case "or": + return OperatorTypeModel.OR; + case "and": + return OperatorTypeModel.AND; + case "xor": + return OperatorTypeModel.XOR; + case "neg": + return OperatorTypeModel.NEG; + case "invert": + return OperatorTypeModel.INVERT; + case "not": + return OperatorTypeModel.NOT; + case "indexset": + return OperatorTypeModel.INDEXSET; + case "indexget": + return OperatorTypeModel.INDEXGET; + case "contains": + return OperatorTypeModel.CONTAINS; + case "compare": + return OperatorTypeModel.COMPARE; + case "membergetter": + return OperatorTypeModel.MEMBERGETTER; + case "membersetter": + return OperatorTypeModel.MEMBERSETTER; + case "equals": + return OperatorTypeModel.EQUALS; + case "notequals": + return OperatorTypeModel.NOTEQUALS; + case "shl": + return OperatorTypeModel.SHL; + case "shr": + return OperatorTypeModel.SHR; + case "ushr": + return OperatorTypeModel.USHR; + case "addassign": + return OperatorTypeModel.ADDASSIGN; + case "subassign": + return OperatorTypeModel.SUBASSIGN; + case "mulassign": + return OperatorTypeModel.MULASSIGN; + case "divassign": + return OperatorTypeModel.DIVASSIGN; + case "modassign": + return OperatorTypeModel.MODASSIGN; + case "catassign": + return OperatorTypeModel.CATASSIGN; + case "orassign": + return OperatorTypeModel.ORASSIGN; + case "andassign": + return OperatorTypeModel.ANDASSIGN; + case "xorassign": + return OperatorTypeModel.XORASSIGN; + case "shlassign": + return OperatorTypeModel.SHLASSIGN; + case "shrassign": + return OperatorTypeModel.SHRASSIGN; + case "ushrassign": + return OperatorTypeModel.USHRASSIGN; + } + throw new Error(`Unable to parse operator '${JSON.stringify(obj)}'`); + } + + export function render( + context: BuildContext, + type: TypeModel, + member: OperatorMemberModel, + plain: boolean, + ) { + const _this = member.operator; + const owner = type.renderMemberOwner(context, plain); + + switch (_this) { + case OperatorTypeModel.ADD: + case OperatorTypeModel.MUL: + case OperatorTypeModel.DIV: + case OperatorTypeModel.MOD: + case OperatorTypeModel.AND: + case OperatorTypeModel.OR: + case OperatorTypeModel.XOR: + case OperatorTypeModel.SHL: + case OperatorTypeModel.SHR: + case OperatorTypeModel.USHR: + case OperatorTypeModel.EQUALS: + case OperatorTypeModel.NOTEQUALS: + case OperatorTypeModel.ADDASSIGN: + case OperatorTypeModel.SUBASSIGN: + case OperatorTypeModel.MULASSIGN: + case OperatorTypeModel.DIVASSIGN: + case OperatorTypeModel.MODASSIGN: + case OperatorTypeModel.CATASSIGN: + case OperatorTypeModel.ORASSIGN: + case OperatorTypeModel.ANDASSIGN: + case OperatorTypeModel.XORASSIGN: + case OperatorTypeModel.SHLASSIGN: + case OperatorTypeModel.SHRASSIGN: + case OperatorTypeModel.USHRASSIGN: + case OperatorTypeModel.COMPARE: + return `// (${owner} ${_this} ${member.renderParam(context, plain, 0)})${member.returnType.renderReturnType(context, plain)}`; + case OperatorTypeModel.NOT: + return `// (!${owner})${member.returnType.renderReturnType(context, plain)}`; + // Disabled because SUB is the same as NEG, so it covers both cases + // case OperatorTypeModel.SUB: + case OperatorTypeModel.NEG: + // SUB and NEG use the same symbol, but behave differently, thankfully one uses params and the other does not + if (member.parameters.length === 0) { + return `// (-${owner})${member.returnType.renderReturnType(context, plain)}`; + } + return `// (${owner} ${_this} ${member.renderParam(context, plain, 0)})${member.returnType.renderReturnType(context, plain)}`; + case OperatorTypeModel.CAT: + if (member.parameters.length === 0) { + return `// (~${owner})${member.returnType.renderReturnType(context, plain)}`; + } + return `// (${owner} ${_this} ${member.renderParam(context, plain, 0)})${member.returnType.renderReturnType(context, plain)}`; + case OperatorTypeModel.CONTAINS: + return `// (${member.renderParam(context, plain, 0)} ${_this} ${owner})${member.returnType.renderReturnType(context, plain)}`; + case OperatorTypeModel.INDEXSET: + return `// ${owner}[${member.renderParams(context, plain, 0, -1)}] = ${member.renderParam(context, plain, member.parameters.length - 1)}`; + case OperatorTypeModel.INDEXGET: + return `// ${owner}[${member.renderParams(context, plain)}]${member.returnType.renderReturnType(context, plain)}`; + case OperatorTypeModel.MEMBERGETTER: + return `// ${owner}.${member.renderParam(context, plain, 0)}${member.returnType.renderReturnType(context, plain)}`; + case OperatorTypeModel.MEMBERSETTER: + return `// ${owner}.${member.renderParam(context, plain, 0)} = ${member.renderParam(context, plain, 1)}`; + default: + throw new Error( + `Unknown operator type '${JSON.stringify(member.operator)}'`, + ); + } + } +} + +export class ParameterModel { + readonly key: string; + readonly displayName: string; + readonly type: TypeModel; + readonly defaultValue: string | undefined; + + constructor( + key: string, + displayName: string, + type: TypeModel, + defaultValue: string | undefined, + ) { + this.key = key; + this.displayName = displayName; + this.type = type; + this.defaultValue = defaultValue; + } + + static parse(obj: ParameterJson) { + return new ParameterModel( + obj.key, + obj.display_name, + TypeModel.parseType(obj.type), + obj.default_value, + ); + } + + render(context: BuildContext, plain: boolean): string { + if (this.type.isVoid()) { + return this.key; + } + let rendered = `${this.key} as ${this.type.render(context, "parameter", plain)}`; + if (this.defaultValue) { + rendered += ` = ${this.defaultValue}`; + } + return rendered; + } +} + +export interface HasParameters { + readonly parameters: ParameterModel[]; +} + +export interface HasTypeParameters { + readonly typeParameters: { [key: string]: TypeModel }; +} + +export class MemberGroupModel { + readonly key: string; + readonly members: MemberModel[]; + + constructor(key: string, members: MemberModel[]) { + this.key = key; + this.members = members; + } + + static parse(obj: MemberGroupJson): MemberGroupModel { + return new MemberGroupModel( + obj.key, + obj.members.map(MemberModel.parseMember), + ); + } + + renderAsSearchableHtml(context: BuildContext) { + return this.members + .map((value) => value.renderAsSearchableHtml(context)) + .join(""); + } +} + +export class MemberModel { + readonly key: string; + readonly displayName: string; + readonly kind: MemberKindModel; + readonly origin: MemberOriginModel; + readonly isStatic: boolean; + readonly comment: CommentModel | undefined; + readonly extra: Extra; + + constructor( + key: string, + displayName: string, + kind: MemberKindModel, + origin: MemberOriginModel, + isStatic: boolean, + comment: CommentModel | undefined, + extra: Extra, + ) { + this.key = key; + this.displayName = displayName; + this.kind = kind; + this.origin = origin; + this.isStatic = isStatic; + this.comment = comment; + this.extra = extra; + } + + static parseMember(obj: MemberJson): MemberModel { + if (!obj || !obj.kind) { + throw Error(`Unable to parse member '${JSON.stringify(obj)}'`); + } + switch (obj.kind) { + case "method": + return MethodMemberModel.parse(obj); + case "getter": + return GetterMemberModel.parse(obj); + case "setter": + return SetterMemberModel.parse(obj); + case "field": + return FieldMemberModel.parse(obj); + case "enum_constant": + return EnumConstantMemberModel.parse(obj); + case "caster": + return CasterMemberModel.parse(obj); + case "operator": + return OperatorMemberModel.parse(obj); + case "constructor": + return ConstructorMemberModel.parse(obj); + } + throw Error(`Unknown member '${JSON.stringify(obj)}'`); + } + + getType(): string { + return "Member"; + } + + isSearchable(): boolean { + return this.origin === MemberOriginModel.DECLARED; + } + + isMethod(): this is MethodMemberModel { + return this.kind === MemberKindModel.METHOD; + } + + isGetter(): this is GetterMemberModel { + return this.kind === MemberKindModel.GETTER; + } + + isSetter(): this is SetterMemberModel { + return this.kind === MemberKindModel.SETTER; + } + + isField(): this is FieldMemberModel { + return this.kind === MemberKindModel.FIELD; + } + + isEnumConstant(): this is EnumConstantMemberModel { + return this.kind === MemberKindModel.ENUM_CONSTANT; + } + + isCaster(): this is CasterMemberModel { + return this.kind === MemberKindModel.CASTER; + } + + isOperator(): this is OperatorMemberModel { + return this.kind === MemberKindModel.OPERATOR; + } + + isConstructor(): this is ConstructorMemberModel { + return this.kind === MemberKindModel.CONSTRUCTOR; + } + + hasTypeParams(): this is MemberModel & HasTypeParameters { + return ( + (this.isMethod() || this.isConstructor() || this.isOperator()) && + Object.keys(this.typeParameters).length > 0 + ); + } + + hasParams(): this is MemberModel & HasParameters { + return ( + (this.isConstructor() || + this.isMethod() || + this.isOperator() || + this.isSetter()) && + Object.keys(this.parameters).length > 0 + ); + } + + renderAsTitle(context: BuildContext): string { + throw new Error("Unable to render asTitle"); + } + + renderTypeArguments( + context: BuildContext, + plain: boolean, + ): string { + if (this.hasTypeParams()) { + return `<${Object.values(this.typeParameters) + .map((param) => param.render(context, "member", plain)) + .join(", ")}>`; + } + return ""; + } + + renderParams( + context: BuildContext, + plain: boolean, + start?: number, + end?: number, + ): string { + if (this.hasParams()) { + return this.parameters + .slice(start, end) + .map((value) => value.render(context, plain)) + .join(", "); + } + return ""; + } + + renderParam( + context: BuildContext, + plain: boolean, + index: number, + ) { + if (this.hasParams()) { + if (index < this.parameters.length) { + return `(${this.parameters[index].render(context, plain)})`; + } + throw new Error( + `'${index}' is bigger than the number of params '${this.parameters.length}' of ${JSON.stringify(context)}`, + ); + } + throw new Error( + `Member ('${JSON.stringify(this)}') does not have any parameters! Cannot render param: '${index}'`, + ); + } + + getExampleFor(name: string, defaultExample?: string): string[] { + if (this.extra.examples) { + const example = this.extra.examples.examples[name]; + if (example) { + return example; + } + } + if (defaultExample) { + return [defaultExample]; + } + return []; + } + + getSearchablePrefix(): string | undefined { + return this.isStatic ? "static " : undefined; + } + + getSearchableContent(context: BuildContext): string | undefined { + return this.key; + } + + getSearchableSuffix(context: BuildContext): string | undefined { + return undefined; + } + + renderAsSearchableHtml(context: BuildContext): string { + return ""; + } +} + +export class CasterMemberModel extends MemberModel { + readonly to: TypeModel; + readonly implicit: boolean; + + constructor( + key: string, + displayName: string, + origin: MemberOriginModel, + isStatic: boolean, + comment: CommentModel | undefined, + extra: Extra, + to: TypeModel, + implicit: boolean, + ) { + super( + key, + displayName, + MemberKindModel.CASTER, + origin, + isStatic, + comment, + extra, + ); + this.to = to; + this.implicit = implicit; + } + + static parse(obj: CasterMemberJson) { + return new CasterMemberModel( + obj.key, + obj.display_name, + MemberOriginModel.parse(obj.origin), + obj.static, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + TypeModel.parseType(obj.to), + obj.implicit as boolean, + ); + } + + getSearchablePrefix(): string | undefined { + return this.implicit ? "implicit " : undefined; + } + + getSearchableContent(context: BuildContext): string | undefined { + return this.to.renderReturnType(context, true); + } + + renderAsTitle(context: BuildContext) { + return `${this.implicit ? "implicit " : ""}${this.to.renderReturnType(context, true)}`; + } + + getType(): string { + return "Caster"; + } +} + +export class ConstructorMemberModel + extends MemberModel + implements HasTypeParameters, HasParameters +{ + readonly parameters: ParameterModel[]; + readonly typeParameters: { [key: string]: TypeModel }; + + constructor( + origin: MemberOriginModel, + isStatic: boolean, + comment: CommentModel | undefined, + extra: Extra, + parameters: ParameterModel[], + typeParameters: { + [p: string]: TypeModel; + }, + ) { + super( + "new", + "new", + MemberKindModel.CONSTRUCTOR, + origin, + isStatic, + comment, + extra, + ); + this.parameters = parameters; + this.typeParameters = typeParameters; + } + + static parse(obj: ConstructorMemberJson) { + return new ConstructorMemberModel( + MemberOriginModel.parse(obj.origin), + obj.static, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + obj.parameters.map(ParameterModel.parse), + parseMap(obj.type_parameters, TypeModel.parseType), + ); + } + + getSearchablePrefix(): string | undefined { + return undefined; + } + + getSearchableContent(context: BuildContext): string | undefined { + return `new ${context.page.renderDisplayName()}`; + } + + getSearchableSuffix(context: BuildContext): string | undefined { + let suffix = ""; + if (context.page.isBaseTypePage()) { + suffix += context.page.type.renderTypeParameters(context); + } + + suffix += `(${this.renderParams(context, true)})`; + return suffix; + } + + renderAsTitle(context: BuildContext) { + let title = "new"; + if (context.page.isBaseTypePage()) { + title += context.page.type.renderTypeParameters(context); + } + + title += `(${this.renderParams(context, true)})`; + return title; + } + + getType(): string { + return "Constructor"; + } +} + +export class EnumConstantMemberModel extends MemberModel { + readonly type: TypeModel; + + constructor( + key: string, + displayName: string, + origin: MemberOriginModel, + isStatic: boolean, + comment: CommentModel | undefined, + extra: Extra, + type: TypeModel, + ) { + super( + key, + displayName, + MemberKindModel.ENUM_CONSTANT, + origin, + isStatic, + comment, + extra, + ); + this.type = type; + } + + static parse(obj: EnumConstantMemberJson) { + return new EnumConstantMemberModel( + obj.key, + obj.display_name, + MemberOriginModel.parse(obj.origin), + obj.static, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + TypeModel.parseType(obj.type), + ); + } + + getSearchablePrefix(): string | undefined { + return undefined; + } + + renderAsTitle(context: BuildContext) { + return this.key; + } + + renderAsSearchableHtml(context: BuildContext): string { + if (!this.isSearchable()) { + return ""; + } + return `

${this.key}

${this.renderAsTitle(context)}

`; + } + + getType(): string { + return "Enum Constant"; + } +} + +export class FieldMemberModel extends MemberModel { + readonly type: TypeModel; + + constructor( + key: string, + displayName: string, + origin: MemberOriginModel, + isStatic: boolean, + comment: CommentModel | undefined, + extra: Extra, + type: TypeModel, + ) { + super( + key, + displayName, + MemberKindModel.FIELD, + origin, + isStatic, + comment, + extra, + ); + this.type = type; + } + + static parse(obj: FieldMemberJson) { + return new FieldMemberModel( + obj.key, + obj.display_name, + MemberOriginModel.parse(obj.origin), + obj.static, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + TypeModel.parseType(obj.type), + ); + } + + renderAsTitle(context: BuildContext) { + return this.key; + } + + renderAsSearchableHtml(context: BuildContext): string { + if (!this.isSearchable()) { + return ""; + } + return `

${this.key}

${this.renderAsTitle(context)}

`; + } + + getType(): string { + return "Field"; + } +} + +export class GetterMemberModel extends MemberModel { + readonly type: TypeModel; + + constructor( + key: string, + displayName: string, + origin: MemberOriginModel, + isStatic: boolean, + comment: CommentModel | undefined, + extra: Extra, + type: TypeModel, + ) { + super( + key, + displayName, + MemberKindModel.GETTER, + origin, + isStatic, + comment, + extra, + ); + this.type = type; + } + + static parse(obj: GetterMemberJson) { + return new GetterMemberModel( + obj.key, + obj.display_name, + MemberOriginModel.parse(obj.origin), + obj.static, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + TypeModel.parseType(obj.type), + ); + } + + renderAsTitle(context: BuildContext) { + return this.key; + } + + renderAsSearchableHtml(context: BuildContext): string { + if (!this.isSearchable()) { + return ""; + } + return `

${this.key}

${this.renderAsTitle(context)}

`; + } + + getType(): string { + return "Getter"; + } +} + +export class MethodMemberModel + extends MemberModel + implements HasTypeParameters, HasParameters +{ + readonly parameters: ParameterModel[]; + readonly returnType: TypeModel; + readonly typeParameters: { [key: string]: TypeModel }; + + constructor( + key: string, + displayName: string, + origin: MemberOriginModel, + isStatic: boolean, + comment: CommentModel | undefined, + extra: Extra, + parameters: ParameterModel[], + returnType: TypeModel, + typeParameters: { + [key: string]: TypeModel; + }, + ) { + super( + key, + displayName, + MemberKindModel.METHOD, + origin, + isStatic, + comment, + extra, + ); + this.parameters = parameters; + this.returnType = returnType; + this.typeParameters = typeParameters; + } + + static parse(obj: MethodMemberJson) { + return new MethodMemberModel( + obj.key, + obj.display_name, + MemberOriginModel.parse(obj.origin), + obj.static, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + obj.parameters.map(ParameterModel.parse), + TypeModel.parseType(obj.return_type), + parseMap(obj.type_parameters, TypeModel.parseType), + ); + } + + renderAsTitle(context: BuildContext) { + let title = ""; + if (this.isStatic) { + title += "static "; + } + title += this.key; + if (this.isStatic && context.page.isBaseTypePage()) { + title += context.page.type.renderTypeParameters(context); + } + + title += `(${this.renderParams(context, true)})`; + title += this.returnType.renderReturnType(context, true); + return title; + } + + getSearchableSuffix(context: BuildContext): string | undefined { + let suffix = ""; + if (this.isStatic && context.page.isBaseTypePage()) { + suffix += context.page.type.renderTypeParameters(context); + } + + suffix += `(${this.renderParams(context, true)})`; + suffix += this.returnType.renderReturnType(context, true); + return suffix; + } + + renderAsSearchableHtml(context: BuildContext): string { + if (!this.isSearchable()) { + return ""; + } + const html = `

${this.renderAsTitle(context)}

`; + + return `

${this.renderAsTitle(context)}

`; + } + + getType(): string { + return "Method"; + } +} + +export class OperatorMemberModel + extends MemberModel + implements HasTypeParameters, HasParameters +{ + readonly parameters: ParameterModel[]; + readonly returnType: TypeModel; + readonly typeParameters: { [key: string]: TypeModel }; + readonly operator: OperatorTypeModel; + + constructor( + key: string, + displayName: string, + origin: MemberOriginModel, + isStatic: boolean, + comment: CommentModel | undefined, + extra: Extra, + parameters: ParameterModel[], + returnType: TypeModel, + typeParameters: { + [key: string]: TypeModel; + }, + operator: OperatorTypeModel, + ) { + super( + key, + displayName, + MemberKindModel.OPERATOR, + origin, + isStatic, + comment, + extra, + ); + this.parameters = parameters; + this.returnType = returnType; + this.typeParameters = typeParameters; + this.operator = operator; + } + + static parse(obj: OperatorMemberJson) { + return new OperatorMemberModel( + obj.key, + obj.display_name, + MemberOriginModel.parse(obj.origin), + obj.static, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + obj.parameters.map(ParameterModel.parse), + TypeModel.parseType(obj.return_type), + parseMap(obj.type_parameters, TypeModel.parseType), + OperatorTypeModel.parse(obj.operator), + ); + } + + renderAsTitle(context: BuildContext) { + let title = this.operator as string; + title += this.hasParams() + ? `(${this.renderParams(context, true)})` + : ""; + title += this.returnType.renderReturnType(context, true); + + return title; + } + + getSearchableSuffix(context: BuildContext): string | undefined { + let suffix = ""; + suffix += this.hasParams() + ? `(${this.renderParams(context, true)})` + : ""; + suffix += this.returnType.renderReturnType(context, true); + + return suffix; + } + + renderAsSearchableHtml(context: BuildContext): string { + if (!this.isSearchable()) { + return ""; + } + return `

${this.operator}

${this.renderAsTitle(context)}

`; + } + + getType(): string { + return "Operator"; + } +} + +export class SetterMemberModel extends MemberModel implements HasParameters { + readonly parameters: ParameterModel[]; + + constructor( + key: string, + displayName: string, + origin: MemberOriginModel, + isStatic: boolean, + comment: CommentModel | undefined, + extra: Extra, + parameters: ParameterModel[], + ) { + super( + key, + displayName, + MemberKindModel.SETTER, + origin, + isStatic, + comment, + extra, + ); + this.parameters = parameters; + } + + static parse(obj: SetterMemberJson) { + return new SetterMemberModel( + obj.key, + obj.display_name, + MemberOriginModel.parse(obj.origin), + obj.static, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + obj.parameters.map(ParameterModel.parse), + ); + } + + renderAsTitle(context: BuildContext) { + return this.key; + } + + renderAsSearchableHtml(context: BuildContext): string { + if (!this.isSearchable()) { + return ""; + } + return `

${this.key}

${this.renderAsTitle(context)}

`; + } + + getType(): string { + return "Setter"; + } +} diff --git a/packages/docs-model/src/Page.ts b/packages/docs-model/src/Page.ts new file mode 100644 index 000000000000..c6cc3aef7778 --- /dev/null +++ b/packages/docs-model/src/Page.ts @@ -0,0 +1,434 @@ +import {CommentModel} from "./Comment"; +import {Extra} from "./Extra"; +import {MemberGroupModel, MemberKindModel} from "./Member"; +import {TypeModel} from "./Type"; +import {ifPresent, parseMap} from "./Util"; +import type {EnumPageJson, EventPageJson, MarkdownPageJson, PageJson, PageMeta, RenderedPageJson, TypePageJson,} from "./types.d.ts"; + +export enum PageKindModel { + TYPE = "type", + EVENT = "event", + ENUM = "enum", + MARKDOWN = "markdown", + RENDERED = "rendered", +} + +export enum PageVersionModel { + ONE = "1", +} + +export type MemberGroupsModel = { [key: string]: MemberGroupModel }; + +export interface MemberHoldingPage { + memberGroup(): MemberGroupsModel; +} + +export type MemberPage = PageModel & MemberHoldingPage; + +export interface BaseTypePage extends MemberPage { + readonly type: TypeModel; + readonly zenCodeName: string; + readonly members: MemberGroupsModel; +} + +export class PageModel { + readonly version: PageVersionModel; + readonly key: string; + readonly displayName: string; + readonly kind: PageKindModel; + readonly comment: CommentModel | undefined; + readonly extra: Extra; + readonly meta: PageMeta; + + constructor( + version: PageVersionModel, + key: string, + displayName: string, + kind: PageKindModel, + comment: CommentModel | undefined, + extra: Extra, + meta: PageMeta, + ) { + this.version = version; + this.key = key; + this.displayName = displayName; + this.kind = kind; + this.comment = comment; + this.extra = extra; + this.meta = meta; + } + + static parsePage(obj: PageJson): PageModel { + if (!obj || !obj.kind) { + throw Error(`Unable to parse page '${JSON.stringify(obj)}'`); + } + switch (obj.kind) { + case PageKindModel.TYPE: + return TypePageModel.parse(obj); + case PageKindModel.EVENT: + return EventPageModel.parse(obj); + case PageKindModel.ENUM: + return EnumPageModel.parse(obj); + case PageKindModel.MARKDOWN: + return MarkdownPageModel.parse(obj); + case PageKindModel.RENDERED: + return RenderedPageModel.parse(obj); + default: + throw Error(`Unknown type '${JSON.stringify(obj)}'`); + } + } + + isBaseTypePage(): this is BaseTypePage { + return this.isTypePage() || this.isEventPage() || this.isEnumPage(); + } + + isTypePage(): this is TypePageModel { + return this.kind === PageKindModel.TYPE; + } + + isEventPage(): this is EventPageModel { + return this.kind === PageKindModel.EVENT; + } + + isEnumPage(): this is EnumPageModel { + return this.kind === PageKindModel.ENUM; + } + + isMarkdownPage(): this is MarkdownPageModel { + return this.kind === PageKindModel.MARKDOWN; + } + + isRenderedPage(): this is RenderedPageModel { + return this.kind === PageKindModel.RENDERED; + } + + renderDisplayName(): string { + if (this.isBaseTypePage()) { + return this.zenCodeName.substring( + this.zenCodeName.lastIndexOf(".") + 1, + ); + } + return this.displayName; + } + + getThisExamples(isStatic = false): string[] { + if (isStatic) { + return [this.displayName]; + } + const example = this.getExampleFor("this"); + if (example.length > 0) { + return example; + } + if (this.isEventPage()) { + return ["event"]; + } + //TODO check the super types to see if they have one + if (this.isBaseTypePage()) { + if (this.type.isJava()) { + return [`my${this.type.getDefaultExample()}`]; + } + } + + return ["myInstance"]; + } + + getExampleFor(name: string, defaultExample?: string): string[] { + if (this.extra.examples) { + const example = this.extra.examples.examples[name]; + if (example) { + return example; + } + } + if (defaultExample) { + return [defaultExample]; + } + return []; + } +} + +export class TypePageModel extends PageModel implements BaseTypePage { + readonly type: TypeModel; + readonly zenCodeName: string; + readonly members: MemberGroupsModel; + + constructor( + version: PageVersionModel, + key: string, + displayName: string, + comment: CommentModel | undefined, + extra: Extra, + meta: PageMeta, + type: TypeModel, + zenCodeName: string, + members: { + [key: string]: MemberGroupModel; + }, + ) { + super( + version, + key, + displayName, + PageKindModel.TYPE, + comment, + extra, + meta, + ); + this.type = type; + this.zenCodeName = zenCodeName; + this.members = members; + } + + static parse(obj: TypePageJson) { + return new TypePageModel( + obj.version, + obj.key, + obj.display_name, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + obj.meta, + TypeModel.parseType(obj.type), + obj.zen_code_name, + parseMap(obj.members, MemberGroupModel.parse), + ); + } + + memberGroup(): MemberGroupsModel { + return this.members; + } +} + +export class EnumPageModel extends PageModel implements BaseTypePage { + readonly type: TypeModel; + readonly zenCodeName: string; + readonly members: MemberGroupsModel; + + constructor( + version: PageVersionModel, + key: string, + displayName: string, + comment: CommentModel | undefined, + extra: Extra, + meta: PageMeta, + type: TypeModel, + zenCodeName: string, + members: { + [key: string]: MemberGroupModel; + }, + ) { + super( + version, + key, + displayName, + PageKindModel.ENUM, + comment, + extra, + meta, + ); + this.type = type; + this.zenCodeName = zenCodeName; + this.members = members; + } + + static parse(obj: EnumPageJson) { + return new EnumPageModel( + obj.version, + obj.key, + obj.display_name, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + obj.meta, + TypeModel.parseType(obj.type), + obj.zen_code_name as string, + parseMap(obj.members, MemberGroupModel.parse), + ); + } + + memberGroup(): MemberGroupsModel { + return this.members; + } + + getThisExamples(isStatic = false): string[] { + if (isStatic) { + return [this.displayName]; + } + const example = this.getExampleFor("this"); + if (example.length > 0) { + return example; + } + const bracketEnum = this.extra.bracketEnum; + for (const memberGroup of Object.values(this.members)) { + for (const member of memberGroup.members) { + if (member.kind === MemberKindModel.ENUM_CONSTANT) { + if (bracketEnum) { + return [ + ``, + ]; + } + return [`${this.displayName}.${member.key}`]; + } + } + } + //TODO check the super types to see if they have one + if (this.isBaseTypePage()) { + if (this.type.isJava()) { + return [`my${this.type.getDefaultExample()}`]; + } + } + + return []; + } +} + +export class EventPageModel extends PageModel implements BaseTypePage { + readonly type: TypeModel; + readonly zenCodeName: string; + readonly members: { [key: string]: MemberGroupModel }; + readonly canceledInfo: CommentModel | undefined; + readonly notCanceledInfo: CommentModel | undefined; + readonly allowInfo: CommentModel | undefined; + readonly defaultInfo: CommentModel | undefined; + readonly denyInfo: CommentModel | undefined; + + readonly hasResult: boolean; + readonly cancelable: boolean; + + constructor( + version: PageVersionModel, + key: string, + displayName: string, + comments: CommentModel | undefined, + extra: Extra, + meta: PageMeta, + type: TypeModel, + zenCodeName: string, + members: MemberGroupsModel, + canceledInfo: CommentModel | undefined, + notCanceledInfo: CommentModel | undefined, + allowInfo: CommentModel | undefined, + defaultInfo: CommentModel | undefined, + denyInfo: CommentModel | undefined, + hasResult: boolean, + cancelable: boolean, + ) { + super( + version, + key, + displayName, + PageKindModel.EVENT, + comments, + extra, + meta, + ); + this.type = type; + this.zenCodeName = zenCodeName; + this.members = members; + this.canceledInfo = canceledInfo; + this.notCanceledInfo = notCanceledInfo; + this.allowInfo = allowInfo; + this.defaultInfo = defaultInfo; + this.denyInfo = denyInfo; + this.hasResult = hasResult; + this.cancelable = cancelable; + } + + static parse(obj: EventPageJson) { + return new EventPageModel( + obj.version, + obj.key, + obj.display_name, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + obj.meta, + TypeModel.parseType(obj.type), + obj.zen_code_name as string, + parseMap(obj.members, MemberGroupModel.parse), + ifPresent(obj.canceled_info, CommentModel.parseComment), + ifPresent(obj.not_canceled_info, CommentModel.parseComment), + ifPresent(obj.allow_info, CommentModel.parseComment), + ifPresent(obj.default_info, CommentModel.parseComment), + ifPresent(obj.deny_info, CommentModel.parseComment), + obj.has_result, + obj.cancelable, + ); + } + + memberGroup(): MemberGroupsModel { + return this.members; + } +} + +export class MarkdownPageModel extends PageModel { + readonly content: string; + constructor( + version: PageVersionModel, + key: string, + displayName: string, + comment: CommentModel | undefined, + extra: Extra, + meta: PageMeta, + content: string, + ) { + super( + version, + key, + displayName, + PageKindModel.MARKDOWN, + comment, + extra, + meta, + ); + this.content = content; + } + + static parse(obj: MarkdownPageJson) { + return new MarkdownPageModel( + obj.version, + obj.key, + obj.display_name, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.EMPTY, + obj.meta, + obj.content, + ); + } +} + +export class RenderedPageModel extends PageModel { + readonly content: string; + readonly raw_content: string; + constructor( + version: PageVersionModel, + key: string, + displayName: string, + comment: CommentModel | undefined, + extra: Extra, + meta: PageMeta, + content: string, + raw_content: string, + ) { + super( + version, + key, + displayName, + PageKindModel.RENDERED, + comment, + extra, + meta, + ); + this.content = content; + this.raw_content = raw_content; + } + + static parse(obj: RenderedPageJson) { + return new RenderedPageModel( + obj.version, + obj.key, + obj.display_name, + ifPresent(obj.comment, CommentModel.parseComment), + Extra.parse(obj.extra), + obj.meta, + obj.content, + obj.raw_content, + ); + } +} diff --git a/packages/docs-model/src/Type.ts b/packages/docs-model/src/Type.ts new file mode 100644 index 000000000000..c169d892387b --- /dev/null +++ b/packages/docs-model/src/Type.ts @@ -0,0 +1,395 @@ +import type { PageModel } from "./Page"; +import { getPage, ifPresent, parseMap } from "./Util"; +import type { + ArrayTypeJson, + BasicTypeJson, + BuildContext, + GenericTypeJson, + JavaTypeJson, + TypeJson, +} from "./types.d.ts"; + +export enum TypeKindModel { + ARRAY = "array", + BASIC = "basic", + GENERIC = "generic", + JAVA = "java", +} + +export enum BoundModel { + SPECIFIC = "specific", + UPPER = "upper", + LOWER = "lower", +} + +export namespace BoundModel { + export function parseBound(obj: string) { + switch (obj) { + case "specific": + return BoundModel.SPECIFIC; + case "upper": + return BoundModel.UPPER; + case "lower": + return BoundModel.LOWER; + } + throw new Error(`Unable to parse bound '${JSON.stringify(obj)}'`); + } +} + +function renderLinkable(display: string, key: string, plain: boolean) { + if (plain) { + return display; + } + return `§${display}§${key}§`; +} + +export class TypeModel { + readonly key: string; + readonly displayName: string; + readonly kind: TypeKindModel; + readonly nullable: boolean; + + protected constructor( + key: string, + displayName: string, + kind: TypeKindModel, + nullable: boolean, + ) { + this.key = key; + this.displayName = displayName; + this.kind = kind; + this.nullable = nullable; + } + + static parseType(obj: TypeJson): TypeModel { + if (!obj || !obj.kind) { + throw Error(`Unable to parse type '${JSON.stringify(obj)}'`); + } + switch (obj.kind) { + case "array": + return ArrayTypeModel.parse(obj); + case "basic": + return BasicTypeModel.parse(obj); + case "generic": + return GenericTypeModel.parse(obj); + case "java": + return JavaTypeModel.parse(obj); + } + throw Error(`Unknown type '${JSON.stringify(obj)}'`); + } + + static isObject(key: string) { + return key === "java.lang.Object"; + } + + isVoid() { + return this.key === "void"; + } + + isArray(): this is ArrayTypeModel { + return this.kind === TypeKindModel.ARRAY; + } + + isBasic(): this is BasicTypeModel { + return this.kind === TypeKindModel.BASIC; + } + + isJava(): this is JavaTypeModel { + return this.kind === TypeKindModel.JAVA; + } + + isGeneric(): this is GenericTypeModel { + return this.kind === TypeKindModel.GENERIC; + } + + isObject() { + return TypeModel.isObject(this.key); + } + + lookupPage(context: BuildContext): T { + return getPage(context, this.key) as T; + } + + getExampleFor( + context: BuildContext, + name: string, + defaultExample?: string, + ): string[] { + const page = this.lookupPage(context); + if (!page) { + return defaultExample ? [defaultExample] : []; + } + return page.getExampleFor(name, defaultExample); + } + + getDefaultExample() { + return this.displayName; + } + + renderNullable(display: string = this.displayName) { + if (this.nullable) { + return `${display}?`; + } + return display; + } + + render( + context: BuildContext, + location: string, + plain: boolean, + ): string { + return this.renderNullable(); + } + + renderReturnType(context: BuildContext, plain: boolean) { + if (this.isVoid()) { + return ""; + } + return ` as ${this.render(context, "return_type", plain)}`; + } + + renderMemberOwner( + context: BuildContext, + plain: boolean, + ): string { + throw new Error("Unable to render a non java owner!"); + } + + renderTypeParameters(context: BuildContext): string { + return ""; + } +} + +export class ArrayTypeModel extends TypeModel { + readonly componentType: TypeModel; + + constructor( + key: string, + displayName: string, + nullable: boolean, + componentType: TypeModel, + ) { + super(key, displayName, TypeKindModel.ARRAY, nullable); + this.componentType = componentType; + } + + static parse(obj: ArrayTypeJson) { + return new ArrayTypeModel( + obj.key, + obj.display_name, + obj.nullable, + TypeModel.parseType(obj.component_type), + ); + } + + lookupPage(context: BuildContext): T { + return this.componentType.lookupPage(context); + } + + render(context: BuildContext, location: string, plain: boolean) { + return this.renderNullable( + `${this.componentType.render(context, location, plain)}[]`, + ); + } +} + +export class BasicTypeModel extends TypeModel { + constructor(key: string, displayName: string, nullable: boolean) { + super(key, displayName, TypeKindModel.BASIC, nullable); + } + + static parse(obj: BasicTypeJson) { + return new BasicTypeModel(obj.key, obj.display_name, obj.nullable); + } + + render( + context: BuildContext, + location: string, + plain: boolean, + ): string { + const typePage = this.lookupPage(context); + if (typePage) { + return this.renderNullable( + renderLinkable(typePage.renderDisplayName(), this.key, plain), + ); + } + return this.renderNullable(); + } +} + +export class GenericTypeModel extends TypeModel { + readonly type: TypeModel; + readonly bound: BoundModel; + + constructor( + key: string, + displayName: string, + nullable: boolean, + type: TypeModel, + bound: BoundModel, + ) { + super(key, displayName, TypeKindModel.GENERIC, nullable); + this.type = type; + this.bound = bound; + } + + static parse(obj: GenericTypeJson) { + return new GenericTypeModel( + obj.key, + obj.display_name, + obj.nullable, + TypeModel.parseType(obj.type), + BoundModel.parseBound(obj.bound), + ); + } + + render( + context: BuildContext, + location: string, + plain: boolean, + ): string { + // Make sure this is the right place + if (this.type.isObject()) { + return this.renderNullable(this.key); + } + + if (location === "member") { + return this.renderNullable( + `${this.key} : ${this.type.render(context, location, plain)}`, + ); + } + if (location === "return_type") { + //TODO do I need this? + // return type.key; + } + + return this.renderNullable( + `${this.type.render(context, location, plain)}`, + ); + } +} + +export class JavaTypeModel extends TypeModel { + readonly packageName: string; + readonly className: string; + readonly typeParameters: { [key: string]: TypeModel }; + readonly superType: TypeModel | undefined; + readonly interfaces: TypeModel[]; + + constructor( + key: string, + displayName: string, + nullable: boolean, + packageName: string, + className: string, + typeParameters: { [key: string]: TypeModel }, + superType: TypeModel | undefined, + interfaces: TypeModel[], + ) { + super(key, displayName, TypeKindModel.JAVA, nullable); + this.packageName = packageName; + this.className = className; + this.typeParameters = typeParameters; + this.superType = superType; + this.interfaces = interfaces; + } + + static parse(obj: JavaTypeJson) { + return new JavaTypeModel( + obj.key, + obj.display_name, + obj.nullable, + obj.package_name, + obj.class_name, + parseMap(obj.type_parameters, TypeModel.parseType), + ifPresent(obj.super_type, TypeModel.parseType), + obj.interfaces.map(TypeModel.parseType), + ); + } + + hasTypeParameters() { + return ( + this.typeParameters && Object.keys(this.typeParameters).length > 0 + ); + } + + render( + context: BuildContext, + location: string, + plain: boolean, + ): string { + if (this.key === "java.util.function.Consumer") { + const tParam = Object.keys(this.typeParameters)[0]; + const param = this.typeParameters[tParam]; + const pType = param.isObject() + ? tParam + : param.render(context, "parameter", plain); + return `function(${tParam.toLowerCase()} as ${pType}) as void`; + } + if (this.key === "java.util.Map") { + return `${this.typeParameters.V.render(context, "map", plain)}[${this.typeParameters.K.render(context, "map", plain)}]`; + } + if (this.key === "java.util.function.Predicate") { + const tParam = Object.keys(this.typeParameters)[0]; + const param = this.typeParameters[tParam]; + return `function(${tParam.toLowerCase()} as ${param.render(context, "parameter", plain)}) as bool`; + } + if (this.key === "java.util.function.Function") { + const paramKey = Object.keys(this.typeParameters)[0]; + const param = this.typeParameters[paramKey]; + const paramType = param.isObject() + ? paramKey + : param.render(context, "parameter", plain); + + const retKey = Object.keys(this.typeParameters)[1]; + const ret = this.typeParameters[retKey]; + const retType = ret.isObject() + ? retKey + : ret.render(context, "return_type", plain); + return `function(${paramKey.toLowerCase()} as ${paramType}) as ${retType}`; + } + + let typeParams = ""; + if (this.hasTypeParameters()) { + typeParams = `<${Object.values(this.typeParameters) + .map((param) => param.render(context, location, plain)) + .join(", ")}>`; + } + if (context.typeLinks) { + const typePage = this.lookupPage(context); + if (typePage) { + return this.renderNullable( + `${renderLinkable(typePage.renderDisplayName(), this.key, plain)}${typeParams}`, + ); + } + } + return this.renderNullable(this.className + typeParams); + } + + renderMemberOwner( + context: BuildContext, + plain: boolean, + ): string { + let base = this.className; + if (this.hasTypeParameters()) { + base += `<${Object.values(this.typeParameters).map((type) => type.render(context, "member", plain))}>`; + } + return base; + } + + renderTypeParameters(context: BuildContext): string { + if (this.hasTypeParameters()) { + return `<${Object.values(this.typeParameters) + .map((value) => + value.getExampleFor(context, value.key, value.key), + ) + .join(", ")}>`; + } + + return super.renderTypeParameters(context); + } + + getDefaultExample() { + return this.className; + } +} diff --git a/packages/docs-model/src/Util.ts b/packages/docs-model/src/Util.ts new file mode 100644 index 000000000000..7a5ce3548fb9 --- /dev/null +++ b/packages/docs-model/src/Util.ts @@ -0,0 +1,124 @@ +import fs from "node:fs"; +import path from "node:path"; +import {PageModel} from "./Page"; +import type {BuildContext, Docs, Nav, Page, PageMeta, TypeInfo, Types, Versions,} from "./types.d.ts"; + +export function ifPresent( + obj: T | undefined, + func: (obj: T) => U, +): U | undefined { + if (obj) { + return func(obj); + } +} + +export function parseMap( + map: Record, + mapper: (obj: T) => U, +): { [key: string]: U } { + const parsed: { [key: string]: U } = {}; + for (const key of Object.keys(map)) { + parsed[key] = mapper(map[key]); + } + return parsed; +} + +export const getDocsDir = (): string => { + return path.join("src", "docs"); +}; + +export const getDocsPath = (subpath: string): string => { + return path.join(getDocsDir(), subpath); +}; + +export const getPagePath = (version: string, slug: string): string => { + return getDocsPath(path.join(version, "content", slug)); +}; + +export const getPageContent = (version: string, slug: string): string => { + return fs.readFileSync(getPagePath(version, slug), "utf-8"); +}; + +export const getPage = ( + context: BuildContext, + key: string, +): PageModel | undefined => { + if (context.types[key] && context.types[key].keys.length === 1) { + return PageModel.parsePage( + JSON.parse( + getPageContent( + context.version, + `${context.types[key].keys[0]}.json`, + ), + ), + ); + } + return undefined; +}; + +export const getAllVersions = (): Versions => { + return JSON.parse(fs.readFileSync(getDocsPath("versions.json"), "utf-8")); +}; + +export const getFlatVersions = (versions?: Versions): string[] => { + const allVersions = versions ?? getAllVersions(); + return Object.keys(allVersions.all).flatMap( + (value) => allVersions.all[value], + ); +}; + +export const getDocsJson = (version: string): Docs => { + const docsPath = getDocsPath(path.join(version, "docs.json")); + + return ( + fs.existsSync(docsPath) && + JSON.parse(fs.readFileSync(docsPath, "utf-8")) + ); +}; + +export const getPageMeta = (version: string, slug: string): PageMeta => { + return JSON.parse( + fs.readFileSync(getPagePath(version, `${slug}.json`), "utf-8"), + ); +}; + +export const getPagesFor = (version: string): Page[] => { + const docs = getDocsJson(version); + const pages: Page[] = []; + if (docs) { + collectPages(docs.nav, pages); + } + return pages; +}; + +export const collectPages = (doc: Nav, done: Page[] = []): void => { + const donePages = done || []; + + for (const docKey in doc) { + const val = doc[docKey]; + if (typeof val === "object") { + collectPages(val, donePages); + } else { + donePages.push({ name: docKey, path: val }); + } + } +}; + +export const capitalizeFirst = (str: string) => { + return str.charAt(0).toUpperCase() + str.slice(1); +}; + +export const getTypesJson = (version: string): Types => { + const typesPath = getDocsPath(path.join(version, "types.json")); + + return ( + fs.existsSync(typesPath) && + JSON.parse(fs.readFileSync(typesPath, "utf-8")) + ); +}; + +export const getTypeInformation = (version: string, key: string): TypeInfo => { + const typesJson = getTypesJson(version); + + return typesJson[key]; +}; diff --git a/packages/docs-model/src/index.ts b/packages/docs-model/src/index.ts new file mode 100644 index 000000000000..70cfc72a2082 --- /dev/null +++ b/packages/docs-model/src/index.ts @@ -0,0 +1,7 @@ +export * from "./Comment"; +export * from "./Extra"; +export * from "./Member"; +export * from "./Page"; +export * from "./Type"; +export * from "./Util"; +export type * from "./types.d.ts"; diff --git a/packages/docs-model/src/types.d.ts b/packages/docs-model/src/types.d.ts new file mode 100644 index 000000000000..8531cef59e50 --- /dev/null +++ b/packages/docs-model/src/types.d.ts @@ -0,0 +1,327 @@ +import type {CommentKindModel} from "./Comment"; +import type {MemberKindModel} from "./Member"; +import type {PageKindModel, PageModel, PageVersionModel} from "./Page"; +import type {TypeKindModel} from "./Type"; + +export type Types = { + [key: string]: TypeInfo; +}; + +export type TypeInfo = { + keys: string[]; +}; + +export type Docs = { + nav: Nav; +}; + +export type Nav = { + [key: string]: Nav | string; +}; + +export type Versions = { + latest: string; + all: VersionHolder; +}; + +export type VersionHolder = { + [key: string]: string[]; +}; + +export type DocsReverseLookup = { + [key: string]: string[]; +}; + +export interface PageMeta { + path?: string; + previous?: Page; + current: Page; + next?: Page; + folders: string[]; + shortDescription?: string; +} + +export type Page = { + name: string; + path: string; +}; + +export type BuildContext = { + version: string; + slug: string; + types: Types; + typeLinks?: boolean; + page: T; +}; + +export interface CommonCommentFields { + kind: CommentKindModel; +} + +export type CommentJson = + | BoldCommentJson + | CodeCommentJson + | ItalicsCommentJson + | LinkCommentJson + | ListCommentJson + | ListItemCommentJson + | NewLineCommentJson + | ParagraphCommentJson + | PlaintextCommentJson + | RootCommentJson; + +export interface BoldCommentJson extends CommonCommentFields { + kind: CommentKindModel.BOLD; + content: CommentJson[]; +} + +export interface CodeCommentJson extends CommonCommentFields { + kind: CommentKindModel.CODE; + content: CommentJson[]; +} + +export interface ItalicsCommentJson extends CommonCommentFields { + kind: CommentKindModel.ITALICS; + content: CommentJson[]; +} + +export interface LinkCommentJson extends CommonCommentFields { + kind: CommentKindModel.LINK; + content: CommentJson[]; + plain: boolean; + to: string; +} + +export interface ListCommentJson extends CommonCommentFields { + kind: CommentKindModel.LIST; + content: CommentJson[]; +} + +export interface ListItemCommentJson extends CommonCommentFields { + kind: CommentKindModel.LIST_ITEM; + content: CommentJson[]; +} + +export interface NewLineCommentJson extends CommonCommentFields { + kind: CommentKindModel.NEW_LINE; +} + +export interface ParagraphCommentJson extends CommonCommentFields { + kind: CommentKindModel.PARAGRAPH; + content: CommentJson[]; +} + +export interface PlaintextCommentJson extends CommonCommentFields { + kind: CommentKindModel.PLAINTEXT; + content: string; +} + +export interface RootCommentJson extends CommonCommentFields { + kind: CommentKindModel.ROOT; + children: CommentJson[]; +} + +export interface ExtraJson { + bracket_enum: string; + deprecated: DeprecatedJson; + event_parent: Record; + examples: ExamplesJson; + loaders: string[]; + obtention: ObtentionJson; + parameter_comment: ParameterCommentsJson; + required_mods: ModJson[]; + returns: CommentJson; + see: CommentJson; + since: CommentJson; +} + +export interface DeprecatedJson { + reason: CommentJson; + since: CommentJson; + for_removal: boolean; +} + +export type ExamplesJson = { [key: string]: string[] }; + +export interface ObtentionJson { + method: CommentJson; +} + +export type ParameterCommentsJson = { [key: string]: CommentJson }; + +export interface ModJson { + mod_id: string; + display_name: string; + url: string; +} + +export interface CommonTypeFields { + kind: TypeKindModel; + key: string; + display_name: string; + nullable: boolean; +} + +export type TypeJson = + | ArrayTypeJson + | BasicTypeJson + | GenericTypeJson + | JavaTypeJson; + +export interface BasicTypeJson extends CommonTypeFields { + kind: TypeKindModel.BASIC; +} + +export interface ArrayTypeJson extends CommonTypeFields { + kind: TypeKindModel.ARRAY; + component_type: TypeJson; +} + +export interface GenericTypeJson extends CommonTypeFields { + kind: TypeKindModel.GENERIC; + type: TypeJson; + bound: string; +} + +export interface JavaTypeJson extends CommonTypeFields { + kind: TypeKindModel.JAVA; + package_name: string; + class_name: string; + type_parameters: Record; + super_type?: TypeJson; + interfaces: TypeJson[]; +} + +export interface ParameterJson { + key: string; + display_name: string; + type: TypeJson; + default_value?: string; +} + +export type MemberGroupJson = { + key: string; + members: MemberJson[]; +}; + +export interface CommonMemberFields { + kind: MemberKindModel; + key: string; + display_name: string; + origin: string; + static: boolean; + comment?: CommentJson; + extra: ExtraJson; +} + +export type MemberJson = + | MethodMemberJson + | GetterMemberJson + | SetterMemberJson + | FieldMemberJson + | EnumConstantMemberJson + | CasterMemberJson + | OperatorMemberJson + | ConstructorMemberJson; + +export interface CasterMemberJson extends CommonMemberFields { + kind: MemberKindModel.CASTER; + to: TypeJson; + implicit: boolean; +} +export interface ConstructorMemberJson extends CommonMemberFields { + kind: MemberKindModel.CONSTRUCTOR; + parameters: ParameterJson[]; + type_parameters: Record; +} +export interface EnumConstantMemberJson extends CommonMemberFields { + kind: MemberKindModel.ENUM_CONSTANT; + type: TypeJson; +} +export interface FieldMemberJson extends CommonMemberFields { + kind: MemberKindModel.FIELD; + type: TypeJson; +} +export interface GetterMemberJson extends CommonMemberFields { + kind: MemberKindModel.GETTER; + type: TypeJson; +} +export interface MethodMemberJson extends CommonMemberFields { + kind: MemberKindModel.METHOD; + parameters: ParameterJson[]; + return_type: TypeJson; + type_parameters: Record; +} +export interface OperatorMemberJson extends CommonMemberFields { + kind: MemberKindModel.OPERATOR; + parameters: ParameterJson[]; + return_type: TypeJson; + type_parameters: Record; + operator: string; +} +export interface SetterMemberJson extends CommonMemberFields { + kind: MemberKindModel.SETTER; + parameters: ParameterJson[]; +} + +export interface CommonPageFields { + version: PageVersionModel; + kind: PageKindModel; + key: string; + display_name: string; + comment?: CommentJson; + extra: ExtraJson; + meta: PageMeta; +} +export type PageJson = + | TypePageJson + | EnumPageJson + | EventPageJson + | MarkdownPageJson + | RenderedPageJson; + +export interface MarkdownPageJson extends Omit { + kind: PageKindModel.MARKDOWN; + content: string; +} +export interface RenderedPageJson extends CommonPageFields { + kind: PageKindModel.RENDERED; + content: string; + raw_content: string; +} +export interface TypePageJson extends CommonPageFields { + kind: PageKindModel.TYPE; + type: TypeJson; + zen_code_name: string; + members: Record; +} +export interface EnumPageJson extends CommonPageFields { + kind: PageKindModel.ENUM; + type: TypeJson; + zen_code_name: string; + members: Record; +} +export interface EventPageJson extends CommonPageFields { + kind: PageKindModel.EVENT; + type: TypeJson; + zen_code_name: string; + members: Record; + canceled_info?: CommentJson; + not_canceled_info?: CommentJson; + allow_info?: CommentJson; + default_info?: CommentJson; + deny_info?: CommentJson; + has_result: boolean; + cancelable: boolean; +} + +export interface SearchDocument { + page_url: string; + url: string; + title: string; + type?: string; + prefix?: string; + content?: string; + suffix?: string; + comment?: string; +} diff --git a/packages/docs-model/tsconfig.json b/packages/docs-model/tsconfig.json new file mode 100644 index 000000000000..ad55c3f1ecca --- /dev/null +++ b/packages/docs-model/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "allowJs": false, + "baseUrl": "src", + "esModuleInterop": true, + "lib": ["esnext"], + "module": "ESNext", + "moduleResolution": "node", + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitAny": true, + "outDir": "dist", + "resolveJsonModule": true, + "strict": true, + "target": "ESNext" + } +} diff --git a/packages/docs-model/tsup.config.ts b/packages/docs-model/tsup.config.ts new file mode 100644 index 000000000000..4a40cd889682 --- /dev/null +++ b/packages/docs-model/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["cjs", "esm"], + dts: true, + splitting: false, + sourcemap: true, + clean: true, + tsconfig: "tsconfig.json", +}); diff --git a/packages/docs-search/docker-compose.yml b/packages/docs-search/docker-compose.yml new file mode 100644 index 000000000000..cb248e3b8e33 --- /dev/null +++ b/packages/docs-search/docker-compose.yml @@ -0,0 +1,10 @@ +services: + typesense: + container_name: typesense + image: typesense/typesense:27.1 + restart: unless-stopped + ports: + - "127.0.0.1:8108:8108" + volumes: + - ./opt/typesense:/data + command: '--data-dir /data --enable-cors --api-key=' \ No newline at end of file diff --git a/packages/docs-search/package.json b/packages/docs-search/package.json new file mode 100644 index 000000000000..f6a4a27061de --- /dev/null +++ b/packages/docs-search/package.json @@ -0,0 +1,29 @@ +{ + "name": "docs-search", + "version": "1.0.0", + "license": "MIT", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + "types": "./dist/types.d.ts", + "default": "./dist/index.js" + }, + "files": ["dist"], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "generate-search-index": "node --env-file=../../.env dist/generate.js" + }, + "dependencies": { + "@expressive-code/core": "^0.38.3", + "docs-model": "workspace:*", + "typesense": "1.8.2", + "github-slugger": "^2.0.0", + "remark": "^15.0.1", + "remark-directive": "^3.0.0", + "remark-search": "workspace:*", + "remark-gfm": "^4.0.0" + } +} diff --git a/packages/docs-search/src/generate.ts b/packages/docs-search/src/generate.ts new file mode 100644 index 000000000000..9c20ae0923a7 --- /dev/null +++ b/packages/docs-search/src/generate.ts @@ -0,0 +1,6 @@ +import {generateSearchIndex} from "./index"; +import process from "node:process"; +import path from "node:path"; + +process.chdir(path.join("..", "docs-site")); +await generateSearchIndex(); diff --git a/packages/docs-search/src/index.ts b/packages/docs-search/src/index.ts new file mode 100644 index 000000000000..68af61972ec8 --- /dev/null +++ b/packages/docs-search/src/index.ts @@ -0,0 +1,165 @@ +import GithubSlugger from "github-slugger"; +import {Client} from "typesense"; +import remarkDirective from "remark-directive"; +import {remark} from "remark"; + +import path from "node:path"; +import process from "node:process"; +import {getAllVersions, getFlatVersions, getPageContent, getPagesFor, getTypesJson, PageModel, type SearchDocument,} from "docs-model"; +import remarkSearch from "remark-search"; +import remarkGfm from "remark-gfm"; + +export const generateSearchIndex = async () => { + if (!process.env.TYPESENSE_API_KEY) { + console.log("No TYPESENSE_API_KEY provided!"); + return; + } + const cwd = process.cwd(); + process.chdir(path.join("packages", "docs-site")); + const client = new Client({ + nodes: [ + { + host: "search.blamejared.com", + port: 443, + protocol: "https", + }, + ], + apiKey: process.env.TYPESENSE_API_KEY, + connectionTimeoutSeconds: 2, + }); + + const versions = getFlatVersions(getAllVersions()); + + console.log("Generating search indices"); + console.time("Generating search indices"); + + const slugger = new GithubSlugger(); + + const aliases = await client.aliases().retrieve(); + const touchedAliases: string[] = []; + for (const version of versions) { + const aliasKey = `docs.blamejared.com_${version}_en`; + const versionKey = `${aliasKey}_${new Date().getTime()}`; + touchedAliases.push(aliasKey); + + console.time(version); + const types = getTypesJson(version); + console.log(`creating collection ${versionKey}`); + await client.collections().create({ + name: versionKey, + fields: [ + { name: "page_url", type: "string", index: false }, + { name: "url", type: "string", index: false }, + { name: "title", type: "string", sort: true, facet: true }, + { name: "type", type: "string", optional: true, facet: true }, + { + name: "prefix", + type: "string", + optional: true, + index: false, + }, + { + name: "content", + type: "string", + optional: true, + infix: true, + }, + { + name: "suffix", + type: "string", + optional: true, + index: false, + }, + { name: "comment", type: "string", optional: true }, + ], + default_sorting_field: "title", + enable_nested_fields: false, + }); + console.log("Collection created"); + + const data = []; + const pagesFor = getPagesFor(version); + + for (const page of pagesFor) { + const slug = page.path.substring(0, page.path.lastIndexOf(".")); + const pageContent = getPageContent(version, page.path); + if (page.path.endsWith(".json")) { + const content: PageModel = PageModel.parsePage( + JSON.parse(pageContent), + ); + + const context = { + version, + slug, + types, + page: content, + }; + data.push({ + page_url: slug, + url: slug, + title: content.displayName, + }); + if (content.isBaseTypePage()) { + for (const value of Object.values(content.members)) { + slugger.reset(); + const memberSlug = slugger.slug(value.key); + for (const member of value.members) { + if (member.isSearchable()) { + data.push({ + page_url: slug, + url: `${slug}#${memberSlug}`, + title: content.displayName, + type: member.getType(), + prefix: member.getSearchablePrefix(), + content: + member.getSearchableContent(context), + suffix: member.getSearchableSuffix(context), + comment: member.comment?.renderToString(), + }); + } + } + } + } + } else if (page.path.endsWith(".md")) { + data.push({ + page_url: slug, + url: slug, + title: page.name, + }); + const searchableContent: Record = {}; + const markdown = remark() + .use(remarkGfm) + .use(remarkDirective) + .use(remarkSearch, { slug, page, searchableContent }); + await markdown.process(pageContent); + for (const key of Object.keys(searchableContent)) { + for (const searchDoc of searchableContent[key]) { + data.push(searchDoc); + } + } + } + } + if (data.length > 0) { + await client.collections(versionKey).documents().import(data); + } + + await client.aliases().upsert(aliasKey, { + collection_name: versionKey, + }); + console.timeEnd(version); + } + console.log("Pruning Collections"); + console.time("pruning"); + for (const alias of aliases.aliases) { + if (touchedAliases.includes(alias.name)) { + const collection = client.collections(alias.collection_name); + if (await collection.exists()) { + await client.collections(alias.collection_name).delete(); + } + } + } + console.timeEnd("pruning"); + console.log("Done Pruning Collections"); + console.timeEnd("Generating search indices"); + process.chdir(cwd); +}; diff --git a/packages/docs-search/tsconfig.json b/packages/docs-search/tsconfig.json new file mode 100644 index 000000000000..c8d6d6696ab1 --- /dev/null +++ b/packages/docs-search/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "allowJs": false, + "baseUrl": "./src", + "esModuleInterop": true, + "lib": ["esnext"], + "module": "ESNext", + "moduleResolution": "node", + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitAny": true, + "outDir": "dist", + "resolveJsonModule": true, + "strict": true, + "target": "ESNext", + "paths": { + "docs-model": ["../../docs-model/src"], + "remark-search": ["../../remark-search/src"] + } + } +} diff --git a/packages/docs-search/tsup.config.ts b/packages/docs-search/tsup.config.ts new file mode 100644 index 000000000000..6ffb5b6b003a --- /dev/null +++ b/packages/docs-search/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts", "src/generate.ts"], + format: ["esm"], + dts: true, + splitting: false, + sourcemap: true, + clean: true, + tsconfig: "tsconfig.json", +}); diff --git a/packages/docs-site/.gitignore b/packages/docs-site/.gitignore new file mode 100644 index 000000000000..18b4460e2a4b --- /dev/null +++ b/packages/docs-site/.gitignore @@ -0,0 +1,27 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ +src/docs/ +public/*.** +public/MineTweaker \ No newline at end of file diff --git a/packages/docs-site/astro.config.ts b/packages/docs-site/astro.config.ts new file mode 100644 index 000000000000..7eb429e1a468 --- /dev/null +++ b/packages/docs-site/astro.config.ts @@ -0,0 +1,47 @@ +import sitemap from "@astrojs/sitemap"; +import tailwind from "@astrojs/tailwind"; +import astroExpressiveCode from "astro-expressive-code"; +import icon from "astro-icon"; +import {defineConfig} from "astro/config"; +import GithubSlugger from "github-slugger"; +import remarkDirective from "remark-directive"; +import {ContainerHandler, HeaderHandler, InlineCodeHandler, LeafHandler, LinkHandler,} from "remark-rehype-renderers"; +import remarkTable from "remark-table"; +import path from "node:path"; + +const sluggers: Record = {}; +const sluggerFactory = (path: string) => { + if (!sluggers[path]) { + sluggers[path] = new GithubSlugger(); + } + return sluggers[path]; +}; + +export default defineConfig({ + integrations: [ + tailwind(), + sitemap(), + icon(), + astroExpressiveCode(), + ], + site: "https://docs.blamejared.com", + markdown: { + remarkPlugins: [remarkTable, remarkDirective], + remarkRehype: { + handlers: { + heading: (state, node, parent) => + HeaderHandler(sluggerFactory, state, node, parent), + link: LinkHandler, + inlineCode: InlineCodeHandler, + containerDirective: (state, node, parent) => + ContainerHandler(sluggerFactory, state, node, parent), + leafDirective: LeafHandler, + }, + }, + }, + outDir: path.join("..", "..", "dist"), + prefetch: { + defaultStrategy: "hover", + prefetchAll: false, + }, +}); diff --git a/packages/docs-site/ec.config.mjs b/packages/docs-site/ec.config.mjs new file mode 100644 index 000000000000..eea6076d1745 --- /dev/null +++ b/packages/docs-site/ec.config.mjs @@ -0,0 +1,41 @@ +import { defineEcConfig } from "astro-expressive-code"; +import copyInFrame from "ec-copy-in-frame"; +import defaultFrameTitle from "ec-default-frame-title"; +import pluginExampleComment from "ec-example-comment"; +import languageOverrides from "ec-language-override"; +import pluginRainbowBrackets from "ec-rainbow-brackets"; + +export default defineEcConfig({ + themes: ["dark-plus", "light-plus"], + themeCssSelector: (theme) => { + return `.${theme.type}`; + }, + useThemedScrollbars: false, + frames: { + extractFileNameFromCode: false, + showCopyToClipboardButton: false, + }, + useStyleReset: true, + styleOverrides: { + codeFontSize: 13, + borderRadius: "0", + codePaddingBlock: "0.5rem", + codePaddingInline: "1rem", + scrollbarThumbColor: (context) => { + return "#2A6B8D"; + }, + scrollbarThumbHoverColor: (context) => { + return "#3588B3"; + }, + frames: { + frameBoxShadowCssValue: 0, + }, + }, + plugins: [ + pluginExampleComment(), + languageOverrides(), + defaultFrameTitle(), + pluginRainbowBrackets(), + copyInFrame(), + ], +}); diff --git a/packages/docs-site/package.json b/packages/docs-site/package.json new file mode 100644 index 000000000000..39b5b311e41b --- /dev/null +++ b/packages/docs-site/package.json @@ -0,0 +1,48 @@ +{ + "name": "docs-site", + "type": "module", + "version": "1.0.0", + "scripts": { + "dev": "pnpm build-plugins && astro dev --host", + "start": "pnpm build-plugins && astro dev --host", + "build": "pnpm build-plugins && astro build", + "preview": "astro preview", + "astro": "astro", + "build-plugins": "pnpm -w build-deps", + "full-preview": "pnpm build && pnpm generate-search-index && pnpm preview" + }, + "dependencies": { + "@astrojs/markdown-remark": "^6.0.1", + "@astrojs/sitemap": "^3.2.1", + "@astrojs/tailwind": "^5.1.3", + "@expressive-code/core": "^0.38.3", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "astro": "^5.0.3", + "astro-expressive-code": "^0.38.3", + "astro-icon": "^1.1.4", + "astro-seo": "^0.8.4", + "fs-extra": "^11.2.0", + "github-slugger": "^2.0.0", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-hast": "^13.2.0", + "p-limit": "6.1.0", + "remark-directive": "^3.0.0", + "sharp": "^0.33.5", + "tailwindcss": "^3.4.16", + "typesense": "1.8.2", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0" + }, + "devDependencies": { + "@types/fs-extra": "^11.0.4", + "docs-model": "workspace:*", + "ec-copy-in-frame": "workspace:*", + "ec-default-frame-title": "workspace:*", + "ec-example-comment": "workspace:*", + "ec-language-override": "workspace:*", + "ec-rainbow-brackets": "workspace:*", + "remark-rehype-renderers": "workspace:*", + "remark-table": "workspace:*" + } +} diff --git a/packages/docs-site/src/components/ComponentLogic.astro b/packages/docs-site/src/components/ComponentLogic.astro new file mode 100644 index 000000000000..29af8ce498d0 --- /dev/null +++ b/packages/docs-site/src/components/ComponentLogic.astro @@ -0,0 +1,7 @@ +--- + +--- + + diff --git a/packages/docs-site/src/components/ComponentLogic.ts b/packages/docs-site/src/components/ComponentLogic.ts new file mode 100644 index 000000000000..dc85c3bebe79 --- /dev/null +++ b/packages/docs-site/src/components/ComponentLogic.ts @@ -0,0 +1,515 @@ +import type {HTMLAttributes} from "astro/types"; +import type {Nav, PageMeta, SearchDocument} from "docs-model"; +import {Client} from "typesense"; +import type {SearchParams, SearchResponse,} from "typesense/lib/Typesense/Documents"; +import {SEARCH_TOKEN} from "../util/Constants"; +import {debounce, escapeHtml, shouldFolderBeOpen} from "../util/WebSafeUtil"; + +const h = ( + tag: string | T, + attributes: HTMLAttributes<"base">, + children?: HTMLElement[] | string, +): T => { + const element = + typeof tag === "string" ? (document.createElement(tag) as T) : tag; + + for (const [key, value] of Object.entries(attributes)) { + element.setAttribute( + key, + typeof value === "string" ? value : `${value}`, + ); + } + if (children) { + if (typeof children === "string") { + element.innerText = children; + } else { + element.append(...children); + } + } + return element; +}; + +const navItem = (name: string, path: string, depth: number) => { + const pagePath = path.replace(/\.(md|json)/, ""); + const selected = slug === pagePath || (slug === "" && pagePath === "index"); + const item = h( + "a", + { + class: `nav-element-item block${selected ? " nav-element-item-selected" : ""}`, + href: `/${version}/en/${pagePath}`, + style: `padding-left: ${(depth === 1 ? 0.5 : 1) + depth}ch`, + }, + name, + ); + item.innerText = name; + return item; +}; +//TODO try and make it only load the html it needs? +const navFolder = ( + nav: Nav, + name: string, + depth: number, + canForceOpen: boolean, +): HTMLDivElement => { + const shouldBeOpen = canForceOpen && shouldFolderBeOpen(name, nav, meta); + + const children = []; + for (const [value, navValue] of Object.entries(nav)) { + if (typeof navValue === "string") { + children.push(navItem(value, navValue, depth + 1)); + } else { + children.push(navFolder(navValue, value, depth + 1, canForceOpen)); + } + } + const nodeAttributes: HTMLAttributes<"div"> = { + is: "nav-folder", + class: "nav-folder", + }; + if (shouldBeOpen) { + nodeAttributes["data-open"] = true; + } + const template = document.getElementById( + "nav-folder-element", + ) as HTMLTemplateElement | null; + if (!template || !template.content || !template.content.firstElementChild) { + throw new Error("No 'nav-folder-element' template found."); + } + return h( + template.content.firstElementChild.cloneNode(true) as HTMLDivElement, + nodeAttributes, + [ + h( + "button", + { + class: "nav-element-folder", + style: `padding-left: ${depth}ch`, + }, + name, + ), + h( + "div", + { + class: "collapsable-wrapper", + }, + [ + h( + "div", + { + class: "collapsing-content overflow-hidden", + }, + shouldBeOpen ? children : undefined, + ), + ], + ), + ], + ); +}; + +const nav: Nav = window.docsJson.nav; +const version: string = window.pageVersion; +const meta: PageMeta = window.pageMeta; +let slug = window.location.pathname.substring(`/${version}/en/`.length); +if (slug.endsWith("/")) { + slug = slug.substring(0, slug.length - 1); +} +const sidenav = document.getElementById("sidenav"); +if (sidenav) { + sidenav.innerHTML = ""; + for (const [value, navValue] of Object.entries(nav)) { + if (typeof navValue === "string") { + sidenav.appendChild(navItem(value, navValue, 1)); + } else { + sidenav.appendChild(navFolder(navValue, value, 1, true)); + } + } +} + +class NavController extends HTMLButtonElement { + constructor() { + super(); + + const getIcon = (open: boolean) => { + const template = document.querySelector( + "#nav-controller-icons", + ); + if (!template) { + throw new Error("No 'navController-icons' template found."); + } + const icon = template.content.querySelector( + !open ? "#nav-controller-open" : "#nav-controller-close", + ); + if (!icon) { + throw new Error(`No '${open ? "open" : "close"}' icon found.`); + } + return icon.cloneNode(true); + }; + + this.addEventListener("click", () => { + const sidenav = document.getElementById("sidenav"); + if (!sidenav) { + return; + } + const isOpen = !sidenav.getAttribute("data-open"); + const icon = getIcon(isOpen); + if (this.firstElementChild) { + this.firstElementChild.replaceWith(icon); + if (!isOpen) { + sidenav.removeAttribute("data-open"); + } else { + sidenav.setAttribute("data-open", "true"); + } + } + }); + this.appendChild(getIcon(false)); + } +} + +class CollapsableGroup extends HTMLElement { + constructor() { + super(); + + const isOpen = () => { + return this.getAttribute("data-open") === "true"; + }; + + const getControlNode = (): Node => { + const template = + document.querySelector("#group-icons"); + if (template?.content) { + const node = template.content.querySelector( + isOpen() ? "#group-close" : "#group-open", + ); + if (node) { + return node.cloneNode(true); + } + } + throw new Error("Unable to find control node!"); + }; + + const control = this.querySelector("button[data-control=true]"); + if (control) { + const defaultNode = getControlNode(); + if (control.firstChild) { + control.firstChild.replaceWith(defaultNode); + } else { + control.appendChild(defaultNode); + } + control.addEventListener("click", () => { + const open = isOpen(); + if (open) { + this.removeAttribute("data-open"); + } else { + this.setAttribute("data-open", "true"); + } + control.firstChild?.replaceWith(getControlNode()); + }); + } + } +} + +class NavFolder extends HTMLElement { + constructor() { + super(); + + const control = this.firstElementChild; + + const collapsedContent = this.lastElementChild; + if (!control || !collapsedContent) { + return; + } + + // @ts-ignore + collapsedContent.addEventListener( + "transitionrun", + (e: TransitionEvent) => { + const open = this.getAttribute("data-open") === "true"; + if (e.pseudoElement) { + return; + } + e.stopPropagation(); + + if (!open) { + return; + } + const currentTarget = e.currentTarget as HTMLElement | null; + if (!currentTarget?.firstElementChild) { + return; + } + + let current = currentTarget as HTMLElement | null; + const jsonPath: string[] = []; + while (current && current.id !== "sidenav") { + current = current.parentElement; + if ( + current && + current.getAttribute("is") === "nav-folder" && + current.firstElementChild && + current.firstElementChild.textContent + ) { + jsonPath.push(current.firstElementChild.textContent); + } + } + jsonPath.reverse(); + + let currentNav: Nav | string = nav; + for (const value of jsonPath) { + if (typeof currentNav !== "string") { + currentNav = currentNav[value]; + } + } + currentTarget.firstElementChild.innerHTML = ""; + for (const [value, navValue] of Object.entries(currentNav)) { + if (typeof navValue === "string") { + currentTarget.firstElementChild.appendChild( + navItem(value, navValue, jsonPath.length + 1), + ); + } else { + currentTarget.firstElementChild.appendChild( + navFolder( + navValue, + value, + jsonPath.length + 1, + true, + ), + ); + } + } + }, + ); + // @ts-ignore + collapsedContent.addEventListener( + "transitionend", + (e: TransitionEvent) => { + if (e.pseudoElement) { + return; + } + e.stopPropagation(); + const open = this.getAttribute("data-open") === "true"; + if (!open) { + const collapsingContent = this.querySelector( + "div.collapsing-content", + ); + if (collapsingContent) { + collapsingContent.innerHTML = ""; + } + } + }, + ); + control.addEventListener("click", () => { + const open = this.getAttribute("data-open") === "true"; + if (open) { + this.removeAttribute("data-open"); + } else { + this.setAttribute("data-open", "true"); + } + }); + } +} + +class ThemeSelect extends HTMLElement { + constructor() { + super(); + + const themeToggle = this.querySelector("#theme-toggle"); + if (themeToggle) { + themeToggle.addEventListener("click", () => { + const isDark = localStorage.getItem("pageTheme") === "dark"; + window.changeTheme(isDark ? "light" : "dark"); + }); + } + } +} + +class VersionSelect extends HTMLElement { + constructor() { + super(); + const select = this.querySelector("#version-select"); + if (select) { + select.addEventListener("change", (e) => { + if (e.currentTarget instanceof HTMLSelectElement) { + window.location.pathname = `${e.currentTarget.value}/en`; + } + }); + } + } +} + +class Search extends HTMLElement { + constructor() { + super(); + const [btn, dialog] = this.children as unknown as [ + btn: HTMLButtonElement, + dialog: HTMLDialogElement, + ]; + + const dialogBody = dialog.firstElementChild; + if (!dialogBody) { + return; + } + /** Close the modal if a user clicks on a link or outside of the modal. */ + const onClick = (event: MouseEvent) => { + const target = event.target as HTMLElement; + const isLink = "href" in target; + if ( + isLink || + (document.body.contains(target) && !dialogBody.contains(target)) + ) { + closeModal(); + } + }; + + const openModal = (event?: MouseEvent) => { + dialog.showModal(); + document.body.classList.toggle("overflow-hidden"); + this.querySelector("input")?.focus(); + event?.stopPropagation(); + window.addEventListener("click", onClick); + }; + const closeModal = () => dialog.close(); + + btn.addEventListener("click", openModal); + + dialog.addEventListener("close", () => { + document.body.classList.toggle("overflow-hidden"); + window.removeEventListener("click", onClick); + }); + + window.addEventListener("keydown", (e) => { + if ((e.metaKey || e.ctrlKey) && e.key === "k" || e.key === "/") { + dialog.open ? closeModal() : openModal(); + e.preventDefault(); + } + }); + + const searchInput = dialog.querySelector("#search"); + + const showMore = dialog.querySelector("#show-more"); + const resultsContainer = + dialog.querySelector("#search-results"); + if (!searchInput || !resultsContainer || !showMore) { + return; + } + const client = new Client({ + nodes: [ + { + host: "search.blamejared.com", + port: 443, + protocol: "https", + }, + ], + apiKey: SEARCH_TOKEN, + connectionTimeoutSeconds: 2, + }); + + const performSearch = async ( + value: string, + limit: number, + ): Promise => { + if (value.length < 3) { + resultsContainer.innerHTML = ""; + return limit; + } + let newLimit = limit; + const searchParameters: SearchParams = { + q: value, + query_by: "title,content,comment", + group_by: "title", + infix: ["off", "always", "off"], + limit, + }; + + const searchResults: SearchResponse = await client + .collections( + `docs.blamejared.com_${version}_en`, + ) + .documents() + .search(searchParameters); + console.log(searchResults); + const gHits = searchResults.grouped_hits; + const hasMore = searchResults.found >= limit; + if (hasMore) { + newLimit += 10; + showMore.classList.remove("hidden"); + } else { + newLimit = 10; + showMore.classList.add("hidden"); + } + + if (gHits && gHits.length > 0) { + resultsContainer.innerHTML = `

${hasMore ? `Showing ${limit} of ${searchResults.found} results` : `${searchResults.found} results`}

    ${gHits + .map((hit) => { + return `
  1. ${hit.group_key[0]}

    ${hit.hits + .map((subHit) => { + const { document } = subHit; + if (subHit.highlights) { + const result = subHit.highlights.reduce<{ + content?: string; + comment?: string; + }>( + (acc, highlight) => { + if (highlight.field === "content") { + const prefix = document.prefix + ? `${escapeHtml(document.prefix)}` + : ""; + const snippet = + highlight.snippet; + const suffix = document.suffix + ? `${escapeHtml(document.suffix)}` + : ""; + acc.content = `${prefix}${snippet}${suffix}`; + } + if (highlight.field === "comment") { + acc.comment = highlight.snippet; + } + return acc; + }, + { + content: undefined, + comment: undefined, + }, + ); + if (!result.content && !result.comment) { + return ""; + } + if (result.content && result.comment) { + return `

    ${result.content}

    ${result.comment}

    `; + } + return ``; + } + return ""; + }) + .join("")}
  2. `; + }) + .join("")}
`; + } else { + resultsContainer.innerHTML = "

No results found.

"; + } + return newLimit; + }; + let limit = 10; + + searchInput.addEventListener( + "keyup", + debounce(async (e: KeyboardEvent) => { + if (!e.target || !("value" in e.target)) { + return; + } + const value = e.target.value as string; + showMore.classList.add("hidden"); + limit = 10; + limit = await performSearch(value, limit); + }, 250), + ); + showMore.addEventListener("click", async () => { + limit = await performSearch(searchInput.value, limit); + }); + searchInput.dispatchEvent(new KeyboardEvent("keydown", { key: "a" })); + } +} + +customElements.define("collapsable-group", CollapsableGroup); +customElements.define("nav-folder", NavFolder); +customElements.define("nav-controller", NavController, { extends: "button" }); +customElements.define("theme-select", ThemeSelect); +customElements.define("version-select", VersionSelect); +customElements.define("site-search", Search); diff --git a/packages/docs-site/src/components/ComponentProvider.astro b/packages/docs-site/src/components/ComponentProvider.astro new file mode 100644 index 000000000000..2a0ee732ae59 --- /dev/null +++ b/packages/docs-site/src/components/ComponentProvider.astro @@ -0,0 +1,23 @@ +--- +import { Icon } from "astro-icon/components"; +--- + + + + + + + + +