From a6b68d3a369c1d05d24ac42148b94ba5eb1bc16a Mon Sep 17 00:00:00 2001 From: Thomas Allmer Date: Sun, 3 Jan 2021 16:09:17 +0100 Subject: [PATCH] chore: initial commit --- .changeset/config.json | 9 + .eleventyignore | 2 + .eslintignore | 12 + .github/FUNDING.yml | 1 + .github/pull_request_template.md | 3 + .github/workflows/release.yml | 56 + .github/workflows/verify.yml | 73 + .gitignore | 42 + .nvmrc | 1 + CODE_OF_CONDUCT.md | 84 + CONTRIBUTING.md | 107 + LICENSE | 21 + README.md | 61 + assets/logo.png | Bin 0 -> 10383 bytes docs/404.md | 4 + docs/_assets/head.html | 9 + docs/_assets/home-background-original.svg | 1 + docs/_assets/home-background.svg | 1 + docs/_assets/logo.svg | 33 + docs/_assets/social-media-image.jpg | Bin 0 -> 52525 bytes docs/_assets/style.css | 21 + docs/_assets/webmanifest.json | 29 + docs/_data/footer.json | 45 + docs/_data/rocketLaunch.json | 4 + docs/_data/site.cjs | 23 + docs/about/slack.md | 5 + docs/about/sponsor.md | 9 + docs/blog/index.md | 14 + .../introducing-rocket/images/blog-header.jpg | Bin 0 -> 10992 bytes .../images/social-media-image.jpg | Bin 0 -> 12064 bytes docs/blog/introducing-rocket/index.md | 16 + docs/browserconfig.xml | 9 + docs/docs/configuration/index.md | 1 + docs/docs/configuration/overview.md | 77 + docs/docs/eleventy-plugins/index.md | 1 + docs/docs/eleventy-plugins/mdjs-unified.md | 126 + docs/docs/index.md | 12 + docs/docs/markdown-javascript/index.md | 1 + docs/docs/markdown-javascript/overview.md | 237 + docs/docs/markdown-javascript/preview.md | 19 + docs/docs/markdown-javascript/story.md | 19 + docs/docs/presets/blog.md | 21 + docs/docs/presets/index.md | 5 + docs/docs/presets/launch.md | 119 + docs/docs/presets/search.md | 19 + docs/docs/tools/index.md | 1 + docs/docs/tools/overview.md | 260 + docs/docs/tools/rollup-config.md | 94 + docs/favicon.ico | Bin 0 -> 15086 bytes docs/favicon.png | Bin 0 -> 3768 bytes docs/guides/configuration/getting-started.md | 39 + docs/guides/configuration/index.md | 1 + docs/guides/first-pages/adding-pages.md | 85 + docs/guides/first-pages/getting-started.md | 108 + docs/guides/first-pages/index.md | 1 + .../guides/first-pages/link-to-other-pages.md | 7 + docs/guides/first-pages/manage-sidebar.md | 49 + docs/guides/first-pages/urls.md | 5 + docs/guides/first-pages/use-javascript.md | 25 + docs/guides/go-live/index.md | 1 + docs/guides/go-live/overview.md | 51 + docs/guides/index.md | 9 + docs/guides/presets/create-your-own.md | 7 + docs/guides/presets/getting-started.md | 7 + docs/guides/presets/index.md | 1 + docs/guides/presets/overriding-themes.md | 7 + docs/guides/presets/using-theme-templates.md | 3 + docs/index.md | 24 + docs/sitemap.njk | 15 + package.json | 130 + packages/blog/README.md | 5 + packages/blog/index.js | 1 + packages/blog/package.json | 43 + packages/blog/preset/_assets/blog.css | 55 + .../blog/preset/_includes/blog-details.njk | 57 + .../blog/preset/_includes/blog-overview.njk | 37 + .../partials/blog-content-footer.njk | 6 + packages/blog/preset/rocketBlog.js | 55 + packages/building-rollup/README.md | 6 + .../building-rollup/demo/babelrc/.babelrc | 3 + packages/building-rollup/demo/babelrc/app.js | 19 + .../building-rollup/demo/babelrc/index.html | 14 + .../demo/babelrc/rollup.config.js | 10 + .../demo/cjs/commonjs-module.js | 3 + packages/building-rollup/demo/cjs/demo-app.js | 10 + packages/building-rollup/demo/cjs/index.html | 15 + .../demo/cjs/rollup.spa.config.js | 14 + packages/building-rollup/demo/js/demo-app.js | 115 + .../building-rollup/demo/js/demo-component.js | 18 + packages/building-rollup/demo/js/index.html | 51 + .../building-rollup/demo/js/lazy-component.js | 17 + .../demo/js/rollup.basic.config.js | 5 + .../demo/js/rollup.spa-js-input.config.js | 14 + .../demo/js/rollup.spa-nomodule.config.js | 14 + .../demo/js/rollup.spa.config.mjs | 15 + .../demo/modify-babel-plugin/demo-app.js | 12 + .../demo/modify-babel-plugin/index.html | 15 + .../demo/modify-babel-plugin/rollup.config.js | 28 + packages/building-rollup/demo/ts/demo-app.ts | 12 + packages/building-rollup/demo/ts/index.html | 15 + .../demo/ts/rollup.spa.config.js | 14 + packages/building-rollup/index.js | 8 + packages/building-rollup/package.json | 64 + .../building-rollup/src/createBasicConfig.js | 82 + .../building-rollup/src/createMpaConfig.js | 26 + .../building-rollup/src/createSpaConfig.js | 82 + .../test-node/createConfig.test.js | 21 + .../test-node/createMpaConfig.test.js | 81 + .../test-node/fixtures/mpa/index.html | 1 + .../fixtures/mpa/rollup.mpa.config.js | 14 + .../fixtures/mpa/sub-html/index.html | 1 + .../test-node/fixtures/mpa/sub-js/index.html | 2 + .../test-node/fixtures/mpa/sub-js/sub-js.js | 0 .../test-node/spa-integration.test-revisit.js | 92 + packages/cli/README.md | 5 + packages/cli/demo/docs/blog/first.md | 8 + packages/cli/demo/docs/blog/index.md | 16 + .../cli/demo/docs/blog/introducing-mdjs.md | 362 + packages/cli/demo/docs/docs/dev-server.md | 7 + packages/cli/demo/docs/docs/index.md | 6 + packages/cli/demo/docs/docs/modern-web.md | 46 + packages/cli/demo/docs/docs/open-wc.md | 54 + packages/cli/demo/docs/docs/rocket.md | 45 + packages/cli/demo/docs/index.md | 29 + .../cli/demo/docs/learn/codelabs/index.md | 20 + .../01-custom-elements.md | 71 + .../codelabs/web-components-basics/index.md | 54 + .../learn/developing/dedupe-mixin/index.md | 8 + .../cli/demo/docs/learn/developing/index.md | 22 + .../docs/learn/developing/scoped-elements.md | 12 + packages/cli/demo/docs/learn/index.md | 36 + packages/cli/demo/rocket.config.js | 6 + packages/cli/index.cjs | 6 + packages/cli/index.js | 3 + packages/cli/package.json | 69 + packages/cli/src/RocketBuild.js | 97 + packages/cli/src/RocketCli.js | 236 + packages/cli/src/RocketStart.js | 61 + packages/cli/src/cli.js | 6 + .../eleventy-plugins/rocketCollections.cjs | 85 + .../cli/src/eleventy-plugins/rocketCopy.cjs | 7 + .../src/eleventy-plugins/rocketFilters.cjs | 28 + packages/cli/src/normalizeConfig.js | 139 + packages/cli/src/public/computedConfig.cjs | 24 + packages/cli/src/shared/.eleventy.cjs | 82 + packages/cli/test-node/RocketCli.e2e.test.js | 237 + packages/cli/test-node/RocketCli.test.js | 35 + .../cli/test-node/computedConfig.test.cjs | 16 + .../change-input-dir/foo/page/.eleventyignore | 1 + .../foo/page/_includes/layout.njk | 7 + .../change-input-dir/foo/page/index.md | 5 + .../change-input-dir/rocket.config.js | 6 + .../e2e-fixtures/content/docs/.eleventyignore | 1 + .../content/docs/_includes/layout.njk | 7 + .../e2e-fixtures/content/docs/index.md | 5 + .../e2e-fixtures/content/docs/link.md | 1 + .../content/eleventy-return.rocket.config.js | 11 + .../content/eleventy.rocket.config.js | 8 + .../content/empty.rocket.config.js | 3 + .../content/pathprefix.rocket.config.js | 6 + .../docs/.eleventyignore | 1 + .../docs/_data/rocketConfig.cjs | 3 + .../docs/_includes/layout.njk | 7 + .../rocket-config-in-template/docs/index.md | 5 + .../rocket.config.js | 6 + .../devbuild-build.rocket.config.js | 19 + .../rollup-plugin/devbuild.rocket.config.js | 16 + .../rollup-plugin/docs/.eleventyignore | 1 + .../rollup-plugin/docs/_includes/layout.njk | 7 + .../e2e-fixtures/rollup-plugin/docs/index.md | 11 + .../rollup-plugin/docs/test-data.json | 3 + .../unified-plugin/docs/.eleventyignore | 1 + .../unified-plugin/docs/_includes/layout.njk | 1 + .../e2e-fixtures/unified-plugin/docs/index.md | 5 + .../unified-plugin/rocket.config.js | 10 + .../cli/test-node/fixtures/empty/.gitkeep | 0 .../test-node/fixtures/empty/rocket.config.js | 1 + .../rocket.config.js | 11 + .../fixtures/overrides/rocket.config.js | 10 + .../cli/test-node/normalizeConfig.test.js | 130 + packages/cli/tsconfig.json | 46 + packages/cli/types/eleventy.d.ts | 29 + packages/cli/types/main.d.ts | 48 + packages/core/README.md | 5 + packages/core/package.json | 42 + packages/core/src/helpers/index.js | 22 + packages/core/src/index.js | 2 + packages/core/src/title/extractTitle.js | 20 + packages/core/src/title/index.js | 3 + packages/core/src/title/parseTitle.js | 70 + .../core/src/title/processContentWithTitle.js | 14 + packages/core/src/title/types.d.ts | 9 + packages/core/test-web/extractTitle.test.js | 24 + packages/core/test-web/parseTitle.test.js | 81 + packages/core/tsconfig.build.types.json | 17 + packages/core/tsconfig.json | 24 + packages/drawer/README.md | 7 + packages/drawer/index.js | 1 + packages/drawer/package.json | 40 + packages/drawer/rocket-drawer.js | 3 + packages/drawer/src/RocketDrawer.js | 242 + packages/drawer/tsconfig.json | 24 + .../eleventy-plugin-mdjs-unified/README.md | 5 + .../eleventy-plugin-mdjs-unified/index.js | 3 + .../eleventy-plugin-mdjs-unified/package.json | 39 + .../src/eleventy-plugin-mdjs-unified.js | 230 + .../eleventy-plugin-mdjs-unified.test.js | 179 + .../test-node/fixtures/links/.eleventy.cjs | 6 + .../test-node/fixtures/links/file.md | 1 + .../test-node/fixtures/links/folder/index.md | 1 + .../test-node/fixtures/links/index.md | 4 + .../test-node/fixtures/md/.eleventy.cjs | 6 + .../test-node/fixtures/md/first.md | 1 + .../mdjs-import-in-subpage/.eleventy.cjs | 6 + .../mdjs-import-in-subpage/import-me-too.js | 0 .../mdjs-import-in-subpage/import-me.js | 0 .../mdjs-import-in-subpage/subpage/first.md | 6 + .../fixtures/mdjs-import-index/.eleventy.cjs | 6 + .../mdjs-import-index/import-me-too.js | 0 .../fixtures/mdjs-import-index/import-me.js | 0 .../fixtures/mdjs-import-index/index.md | 6 + .../fixtures/mdjs-import/.eleventy.cjs | 6 + .../test-node/fixtures/mdjs-import/first.md | 6 + .../fixtures/mdjs-import/import-me-too.js | 0 .../fixtures/mdjs-import/import-me.js | 0 .../test-node/fixtures/mdjs/.eleventy.cjs | 6 + .../test-node/fixtures/mdjs/first.md | 14 + .../fixtures/plugin-configure/.eleventy.cjs | 24 + .../fixtures/plugin-configure/first.md | 1 + .../tsconfig.json | 37 + .../types/code.d.ts | 18 + .../types/es-module-lexer.d.ts | 7 + packages/eleventy-rocket-nav/.eleventy.js | 16 + packages/eleventy-rocket-nav/README.md | 5 + .../eleventy-rocket-nav.js | 283 + packages/eleventy-rocket-nav/package.json | 34 + packages/eleventy-rocket-nav/tsconfig.json | 24 + packages/eleventy-rocket-nav/types.d.ts | 36 + .../types/eleventy-url-filter.d.ts | 4 + packages/launch/README.md | 3 + packages/launch/index.js | 1 + packages/launch/inline-notification/index.js | 68 + .../inline-notification.js | 3 + packages/launch/package.json | 37 + packages/launch/preset/_assets/404/404.svg | 6 + .../launch/preset/_assets/404/astronaut.svg | 143 + packages/launch/preset/_assets/404/earth.svg | 32 + packages/launch/preset/_assets/404/moon.svg | 23 + packages/launch/preset/_assets/404/rocket.svg | 30 + .../preset/_assets/_static/404/bg_purple.png | Bin 0 -> 224375 bytes .../_assets/_static/404/overlay_stars.svg | 6 + .../_static/icons/android-chrome-192x192.png | Bin 0 -> 4405 bytes .../_static/icons/android-chrome-512x512.png | Bin 0 -> 10999 bytes .../_static/icons/apple-touch-icon.png | Bin 0 -> 5284 bytes .../_assets/_static/icons/favicon-16x16.png | Bin 0 -> 872 bytes .../_assets/_static/icons/favicon-32x32.png | Bin 0 -> 1531 bytes .../_assets/_static/icons/icon-128x128.png | Bin 0 -> 6634 bytes .../_assets/_static/icons/icon-512x512.png | Bin 0 -> 30184 bytes .../_static/icons/maskable-icon-128x128.png | Bin 0 -> 6634 bytes .../_assets/_static/icons/maskable-icon.png | Bin 0 -> 10999 bytes .../_assets/_static/icons/mstile-150x150.png | Bin 0 -> 4294 bytes .../_static/icons/safari-pinned-tab.svg | 82 + .../preset/_assets/brand-logos/github.svg | 4 + .../preset/_assets/brand-logos/gitlab.svg | 1 + .../preset/_assets/brand-logos/twitter.svg | 1 + .../launch/preset/_assets/burger-menu.svg | 3 + .../preset/_assets/handleServiceWorker.js | 30 + .../launch/preset/_assets/home-background.svg | 1 + packages/launch/preset/_assets/layout.css | 672 ++ packages/launch/preset/_assets/logo.svg | 39 + packages/launch/preset/_assets/markdown.css | 617 ++ packages/launch/preset/_assets/noscript.css | 1 + packages/launch/preset/_assets/octicon.svg | 1 + .../preset/_assets/social-media-image.jpg | Bin 0 -> 52525 bytes packages/launch/preset/_assets/style.css | 15 + packages/launch/preset/_assets/variables.css | 41 + .../launch/preset/_assets/webmanifest.json | 29 + packages/launch/preset/_data/footer.json | 45 + packages/launch/preset/_data/layout.cjs | 1 + packages/launch/preset/_data/rocketConfig.cjs | 3 + .../launch/preset/_data/rocketLaunch.json | 4 + packages/launch/preset/_data/site.cjs | 22 + packages/launch/preset/_data/siteUrl.cjs | 17 + packages/launch/preset/_includes/404.njk | 350 + packages/launch/preset/_includes/home.njk | 60 + packages/launch/preset/_includes/layout.njk | 36 + .../_includes/partials/addTitleHeadline.njk | 10 + .../_includes/partials/content-footer.njk | 6 + .../preset/_includes/partials/darkModeJs.njk | 69 + .../preset/_includes/partials/footer.njk | 33 + .../_includes/partials/head-content.njk | 51 + .../launch/preset/_includes/partials/head.njk | 0 .../preset/_includes/partials/header.njk | 38 + .../preset/_includes/partials/logoLink.njk | 4 + .../partials/mobile-sidebar-bottom.njk | 7 + .../_includes/partials/mobileNavigationJs.njk | 12 + .../preset/_includes/partials/pageJs.njk | 20 + .../_includes/partials/previousNext.njk | 6 + .../launch/preset/_includes/pure-content.njk | 1 + .../launch/preset/_includes/search/input.njk | 0 .../launch/preset/_includes/with-index.njk | 32 + .../launch/preset/_includes/with-sidebar.njk | 32 + packages/launch/preset/rocketLaunch.js | 51 + packages/mdjs-core/CHANGELOG.md | 134 + packages/mdjs-core/README.md | 5 + packages/mdjs-core/demo/script/README.md | 40 + packages/mdjs-core/demo/script/server.js | 8 + packages/mdjs-core/demo/stories/README.md | 50 + .../mdjs-core/demo/stories/demo-wc-card.js | 3 + packages/mdjs-core/demo/stories/server.js | 8 + .../mdjs-core/demo/stories/src/DemoWcCard.js | 74 + .../mdjs-core/demo/stories/src/chevron.svg.js | 27 + .../demo/stories/src/demoWcCardStyle.css.js | 111 + packages/mdjs-core/index.js | 17 + packages/mdjs-core/index.mjs | 5 + packages/mdjs-core/package.json | 72 + packages/mdjs-core/src/isMdjsContent.js | 24 + packages/mdjs-core/src/mdjsDocPage.js | 98 + packages/mdjs-core/src/mdjsParse.js | 40 + packages/mdjs-core/src/mdjsProcess.js | 127 + packages/mdjs-core/src/mdjsStoryParse.js | 123 + .../mdjs-core/test-node/integration.test.js | 118 + .../mdjs-core/test-node/mdJsProcess.test.js | 139 + .../mdjs-core/test-node/mdjsParse.test.js | 44 + .../test-node/mdjsStoryParse.test.js | 99 + packages/mdjs-core/tsconfig.json | 34 + packages/mdjs-core/types/code.d.ts | 35 + packages/mdjs-core/types/es-module-lexer.d.ts | 7 + packages/mdjs-core/types/remark.d.ts | 43 + packages/mdjs-preview/CHANGELOG.md | 6 + packages/mdjs-preview/README.md | 3 + packages/mdjs-preview/index.js | 1 + packages/mdjs-preview/mdjs-preview.js | 3 + packages/mdjs-preview/package.json | 38 + packages/mdjs-preview/src/MdJsPreview.js | 165 + packages/mdjs-preview/tsconfig.json | 24 + packages/mdjs-story/CHANGELOG.md | 6 + packages/mdjs-story/README.md | 3 + packages/mdjs-story/index.js | 1 + packages/mdjs-story/mdjs-story.js | 3 + packages/mdjs-story/package.json | 37 + packages/mdjs-story/src/MdJsStory.js | 20 + packages/mdjs-story/tsconfig.json | 24 + packages/navigation/README.md | 3 + packages/navigation/index.js | 1 + packages/navigation/package.json | 37 + packages/navigation/rocket-navigation.js | 3 + packages/navigation/src/RocketNavigation.js | 72 + .../test-web/rocket-navigation.test.js | 117 + packages/navigation/tsconfig.json | 24 + packages/plugins-manager/CHANGELOG.md | 6 + packages/plugins-manager/README.md | 6 + packages/plugins-manager/index.js | 7 + packages/plugins-manager/package.json | 36 + packages/plugins-manager/src/addPlugin.js | 60 + .../src/adjustPluginOptions.js | 38 + .../src/executeSetupFunctions.js | 16 + .../src/metaConfigToRollupConfig.js | 23 + .../src/metaConfigToWebDevServerConfig.js | 28 + .../test-node/addPlugin.test.js | 99 + .../test-node/adjustPluginOptions.test.js | 81 + .../test-node/executeSetupFunction.test.js | 35 + .../metaConfigToRollupConfig.test.js | 31 + .../metaConfigToWebDevServerConfig.test.js | 26 + packages/plugins-manager/tsconfig.json | 24 + packages/plugins-manager/types/main.d.ts | 5 + packages/search/README.md | 5 + packages/search/assets/blog.svg | 30 + packages/search/assets/docs.svg | 10 + packages/search/assets/guides.svg | 50 + packages/search/assets/others.svg | 42 + packages/search/node.js | 4 + packages/search/package.json | 49 + .../search/preset/_includes/search/input.njk | 9 + packages/search/preset/rocketSearch.js | 13 + packages/search/rocket-search.js | 3 + packages/search/src/LinkMixin.js | 63 + packages/search/src/RocketSearch.js | 150 + packages/search/src/RocketSearchCombobox.js | 265 + packages/search/src/RocketSearchOption.js | 113 + packages/search/src/RocketSearchPlugin.js | 148 + packages/search/src/getIdBlocksOfHtml.js | 76 + packages/search/src/renderResults.js | 111 + packages/search/src/types.d.ts | 8 + packages/search/src/utils-shared.js | 74 + .../test-node/getIdBlocksOfHtml.test.js | 69 + .../search/test-node/renderResults.test.js | 49 + packages/search/test-web/fixtures/generate.js | 29 + .../search/test-web/fixtures/one-result.json | 1 + .../search/test-web/rocket-search.test.js | 78 + packages/search/test-web/utils-shared.test.js | 118 + packages/search/tsconfig.json | 16 + packages/search/web.js | 1 + rocket.config.js | 11 + scripts/generate-ts-configs.mjs | 115 + scripts/lint-versions.js | 83 + scripts/runWindowsTests.mjs | 6 + scripts/runWorkspacesScripts.mjs | 67 + scripts/update-dependency.js | 73 + scripts/update-esm-entrypoints.mjs | 26 + scripts/update-package-configs.mjs | 113 + scripts/workspaces-scripts-bin.mjs | 4 + tsconfig.browser-base.json | 66 + tsconfig.json | 35 + tsconfig.node-base.json | 75 + web-test-runner-chrome.config.mjs | 7 + web-test-runner-firefox.config.mjs | 7 + web-test-runner-webkit.config.mjs | 7 + web-test-runner.config.mjs | 25 + workspace-packages.mjs | 14 + yarn.lock | 8920 +++++++++++++++++ 411 files changed, 24128 insertions(+) create mode 100644 .changeset/config.json create mode 100644 .eleventyignore create mode 100644 .eslintignore create mode 100644 .github/FUNDING.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/verify.yml create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/logo.png create mode 100644 docs/404.md create mode 100644 docs/_assets/head.html create mode 100644 docs/_assets/home-background-original.svg create mode 100644 docs/_assets/home-background.svg create mode 100644 docs/_assets/logo.svg create mode 100644 docs/_assets/social-media-image.jpg create mode 100644 docs/_assets/style.css create mode 100644 docs/_assets/webmanifest.json create mode 100644 docs/_data/footer.json create mode 100644 docs/_data/rocketLaunch.json create mode 100644 docs/_data/site.cjs create mode 100644 docs/about/slack.md create mode 100644 docs/about/sponsor.md create mode 100644 docs/blog/index.md create mode 100644 docs/blog/introducing-rocket/images/blog-header.jpg create mode 100644 docs/blog/introducing-rocket/images/social-media-image.jpg create mode 100644 docs/blog/introducing-rocket/index.md create mode 100644 docs/browserconfig.xml create mode 100644 docs/docs/configuration/index.md create mode 100644 docs/docs/configuration/overview.md create mode 100644 docs/docs/eleventy-plugins/index.md create mode 100644 docs/docs/eleventy-plugins/mdjs-unified.md create mode 100644 docs/docs/index.md create mode 100644 docs/docs/markdown-javascript/index.md create mode 100644 docs/docs/markdown-javascript/overview.md create mode 100644 docs/docs/markdown-javascript/preview.md create mode 100644 docs/docs/markdown-javascript/story.md create mode 100644 docs/docs/presets/blog.md create mode 100644 docs/docs/presets/index.md create mode 100644 docs/docs/presets/launch.md create mode 100644 docs/docs/presets/search.md create mode 100644 docs/docs/tools/index.md create mode 100644 docs/docs/tools/overview.md create mode 100644 docs/docs/tools/rollup-config.md create mode 100644 docs/favicon.ico create mode 100644 docs/favicon.png create mode 100644 docs/guides/configuration/getting-started.md create mode 100644 docs/guides/configuration/index.md create mode 100644 docs/guides/first-pages/adding-pages.md create mode 100644 docs/guides/first-pages/getting-started.md create mode 100644 docs/guides/first-pages/index.md create mode 100644 docs/guides/first-pages/link-to-other-pages.md create mode 100644 docs/guides/first-pages/manage-sidebar.md create mode 100644 docs/guides/first-pages/urls.md create mode 100644 docs/guides/first-pages/use-javascript.md create mode 100644 docs/guides/go-live/index.md create mode 100644 docs/guides/go-live/overview.md create mode 100644 docs/guides/index.md create mode 100644 docs/guides/presets/create-your-own.md create mode 100644 docs/guides/presets/getting-started.md create mode 100644 docs/guides/presets/index.md create mode 100644 docs/guides/presets/overriding-themes.md create mode 100644 docs/guides/presets/using-theme-templates.md create mode 100644 docs/index.md create mode 100644 docs/sitemap.njk create mode 100644 package.json create mode 100644 packages/blog/README.md create mode 100644 packages/blog/index.js create mode 100644 packages/blog/package.json create mode 100644 packages/blog/preset/_assets/blog.css create mode 100644 packages/blog/preset/_includes/blog-details.njk create mode 100644 packages/blog/preset/_includes/blog-overview.njk create mode 100644 packages/blog/preset/_includes/partials/blog-content-footer.njk create mode 100644 packages/blog/preset/rocketBlog.js create mode 100644 packages/building-rollup/README.md create mode 100644 packages/building-rollup/demo/babelrc/.babelrc create mode 100644 packages/building-rollup/demo/babelrc/app.js create mode 100644 packages/building-rollup/demo/babelrc/index.html create mode 100644 packages/building-rollup/demo/babelrc/rollup.config.js create mode 100644 packages/building-rollup/demo/cjs/commonjs-module.js create mode 100644 packages/building-rollup/demo/cjs/demo-app.js create mode 100644 packages/building-rollup/demo/cjs/index.html create mode 100644 packages/building-rollup/demo/cjs/rollup.spa.config.js create mode 100644 packages/building-rollup/demo/js/demo-app.js create mode 100644 packages/building-rollup/demo/js/demo-component.js create mode 100644 packages/building-rollup/demo/js/index.html create mode 100644 packages/building-rollup/demo/js/lazy-component.js create mode 100644 packages/building-rollup/demo/js/rollup.basic.config.js create mode 100644 packages/building-rollup/demo/js/rollup.spa-js-input.config.js create mode 100644 packages/building-rollup/demo/js/rollup.spa-nomodule.config.js create mode 100644 packages/building-rollup/demo/js/rollup.spa.config.mjs create mode 100644 packages/building-rollup/demo/modify-babel-plugin/demo-app.js create mode 100644 packages/building-rollup/demo/modify-babel-plugin/index.html create mode 100644 packages/building-rollup/demo/modify-babel-plugin/rollup.config.js create mode 100644 packages/building-rollup/demo/ts/demo-app.ts create mode 100644 packages/building-rollup/demo/ts/index.html create mode 100644 packages/building-rollup/demo/ts/rollup.spa.config.js create mode 100644 packages/building-rollup/index.js create mode 100644 packages/building-rollup/package.json create mode 100644 packages/building-rollup/src/createBasicConfig.js create mode 100644 packages/building-rollup/src/createMpaConfig.js create mode 100644 packages/building-rollup/src/createSpaConfig.js create mode 100644 packages/building-rollup/test-node/createConfig.test.js create mode 100644 packages/building-rollup/test-node/createMpaConfig.test.js create mode 100644 packages/building-rollup/test-node/fixtures/mpa/index.html create mode 100644 packages/building-rollup/test-node/fixtures/mpa/rollup.mpa.config.js create mode 100644 packages/building-rollup/test-node/fixtures/mpa/sub-html/index.html create mode 100644 packages/building-rollup/test-node/fixtures/mpa/sub-js/index.html create mode 100644 packages/building-rollup/test-node/fixtures/mpa/sub-js/sub-js.js create mode 100644 packages/building-rollup/test-node/spa-integration.test-revisit.js create mode 100644 packages/cli/README.md create mode 100644 packages/cli/demo/docs/blog/first.md create mode 100644 packages/cli/demo/docs/blog/index.md create mode 100644 packages/cli/demo/docs/blog/introducing-mdjs.md create mode 100644 packages/cli/demo/docs/docs/dev-server.md create mode 100644 packages/cli/demo/docs/docs/index.md create mode 100644 packages/cli/demo/docs/docs/modern-web.md create mode 100644 packages/cli/demo/docs/docs/open-wc.md create mode 100644 packages/cli/demo/docs/docs/rocket.md create mode 100644 packages/cli/demo/docs/index.md create mode 100644 packages/cli/demo/docs/learn/codelabs/index.md create mode 100644 packages/cli/demo/docs/learn/codelabs/web-components-basics/01-custom-elements.md create mode 100644 packages/cli/demo/docs/learn/codelabs/web-components-basics/index.md create mode 100644 packages/cli/demo/docs/learn/developing/dedupe-mixin/index.md create mode 100644 packages/cli/demo/docs/learn/developing/index.md create mode 100644 packages/cli/demo/docs/learn/developing/scoped-elements.md create mode 100644 packages/cli/demo/docs/learn/index.md create mode 100644 packages/cli/demo/rocket.config.js create mode 100644 packages/cli/index.cjs create mode 100644 packages/cli/index.js create mode 100644 packages/cli/package.json create mode 100755 packages/cli/src/RocketBuild.js create mode 100644 packages/cli/src/RocketCli.js create mode 100755 packages/cli/src/RocketStart.js create mode 100755 packages/cli/src/cli.js create mode 100644 packages/cli/src/eleventy-plugins/rocketCollections.cjs create mode 100644 packages/cli/src/eleventy-plugins/rocketCopy.cjs create mode 100644 packages/cli/src/eleventy-plugins/rocketFilters.cjs create mode 100644 packages/cli/src/normalizeConfig.js create mode 100644 packages/cli/src/public/computedConfig.cjs create mode 100644 packages/cli/src/shared/.eleventy.cjs create mode 100644 packages/cli/test-node/RocketCli.e2e.test.js create mode 100644 packages/cli/test-node/RocketCli.test.js create mode 100644 packages/cli/test-node/computedConfig.test.cjs create mode 100644 packages/cli/test-node/e2e-fixtures/change-input-dir/foo/page/.eleventyignore create mode 100644 packages/cli/test-node/e2e-fixtures/change-input-dir/foo/page/_includes/layout.njk create mode 100644 packages/cli/test-node/e2e-fixtures/change-input-dir/foo/page/index.md create mode 100644 packages/cli/test-node/e2e-fixtures/change-input-dir/rocket.config.js create mode 100644 packages/cli/test-node/e2e-fixtures/content/docs/.eleventyignore create mode 100644 packages/cli/test-node/e2e-fixtures/content/docs/_includes/layout.njk create mode 100644 packages/cli/test-node/e2e-fixtures/content/docs/index.md create mode 100644 packages/cli/test-node/e2e-fixtures/content/docs/link.md create mode 100644 packages/cli/test-node/e2e-fixtures/content/eleventy-return.rocket.config.js create mode 100644 packages/cli/test-node/e2e-fixtures/content/eleventy.rocket.config.js create mode 100644 packages/cli/test-node/e2e-fixtures/content/empty.rocket.config.js create mode 100644 packages/cli/test-node/e2e-fixtures/content/pathprefix.rocket.config.js create mode 100644 packages/cli/test-node/e2e-fixtures/rocket-config-in-template/docs/.eleventyignore create mode 100644 packages/cli/test-node/e2e-fixtures/rocket-config-in-template/docs/_data/rocketConfig.cjs create mode 100644 packages/cli/test-node/e2e-fixtures/rocket-config-in-template/docs/_includes/layout.njk create mode 100644 packages/cli/test-node/e2e-fixtures/rocket-config-in-template/docs/index.md create mode 100644 packages/cli/test-node/e2e-fixtures/rocket-config-in-template/rocket.config.js create mode 100644 packages/cli/test-node/e2e-fixtures/rollup-plugin/devbuild-build.rocket.config.js create mode 100644 packages/cli/test-node/e2e-fixtures/rollup-plugin/devbuild.rocket.config.js create mode 100644 packages/cli/test-node/e2e-fixtures/rollup-plugin/docs/.eleventyignore create mode 100644 packages/cli/test-node/e2e-fixtures/rollup-plugin/docs/_includes/layout.njk create mode 100644 packages/cli/test-node/e2e-fixtures/rollup-plugin/docs/index.md create mode 100644 packages/cli/test-node/e2e-fixtures/rollup-plugin/docs/test-data.json create mode 100644 packages/cli/test-node/e2e-fixtures/unified-plugin/docs/.eleventyignore create mode 100644 packages/cli/test-node/e2e-fixtures/unified-plugin/docs/_includes/layout.njk create mode 100644 packages/cli/test-node/e2e-fixtures/unified-plugin/docs/index.md create mode 100644 packages/cli/test-node/e2e-fixtures/unified-plugin/rocket.config.js create mode 100644 packages/cli/test-node/fixtures/empty/.gitkeep create mode 100644 packages/cli/test-node/fixtures/empty/rocket.config.js create mode 100644 packages/cli/test-node/fixtures/override-eleventy-function/rocket.config.js create mode 100644 packages/cli/test-node/fixtures/overrides/rocket.config.js create mode 100644 packages/cli/test-node/normalizeConfig.test.js create mode 100644 packages/cli/tsconfig.json create mode 100644 packages/cli/types/eleventy.d.ts create mode 100644 packages/cli/types/main.d.ts create mode 100644 packages/core/README.md create mode 100644 packages/core/package.json create mode 100644 packages/core/src/helpers/index.js create mode 100644 packages/core/src/index.js create mode 100644 packages/core/src/title/extractTitle.js create mode 100644 packages/core/src/title/index.js create mode 100644 packages/core/src/title/parseTitle.js create mode 100644 packages/core/src/title/processContentWithTitle.js create mode 100644 packages/core/src/title/types.d.ts create mode 100644 packages/core/test-web/extractTitle.test.js create mode 100644 packages/core/test-web/parseTitle.test.js create mode 100644 packages/core/tsconfig.build.types.json create mode 100644 packages/core/tsconfig.json create mode 100644 packages/drawer/README.md create mode 100644 packages/drawer/index.js create mode 100644 packages/drawer/package.json create mode 100644 packages/drawer/rocket-drawer.js create mode 100644 packages/drawer/src/RocketDrawer.js create mode 100644 packages/drawer/tsconfig.json create mode 100644 packages/eleventy-plugin-mdjs-unified/README.md create mode 100644 packages/eleventy-plugin-mdjs-unified/index.js create mode 100644 packages/eleventy-plugin-mdjs-unified/package.json create mode 100644 packages/eleventy-plugin-mdjs-unified/src/eleventy-plugin-mdjs-unified.js create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/eleventy-plugin-mdjs-unified.test.js create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/links/.eleventy.cjs create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/links/file.md create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/links/folder/index.md create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/links/index.md create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/md/.eleventy.cjs create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/md/first.md create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import-in-subpage/.eleventy.cjs create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import-in-subpage/import-me-too.js create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import-in-subpage/import-me.js create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import-in-subpage/subpage/first.md create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import-index/.eleventy.cjs create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import-index/import-me-too.js create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import-index/import-me.js create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import-index/index.md create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import/.eleventy.cjs create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import/first.md create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import/import-me-too.js create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs-import/import-me.js create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs/.eleventy.cjs create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/mdjs/first.md create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/plugin-configure/.eleventy.cjs create mode 100644 packages/eleventy-plugin-mdjs-unified/test-node/fixtures/plugin-configure/first.md create mode 100644 packages/eleventy-plugin-mdjs-unified/tsconfig.json create mode 100644 packages/eleventy-plugin-mdjs-unified/types/code.d.ts create mode 100644 packages/eleventy-plugin-mdjs-unified/types/es-module-lexer.d.ts create mode 100644 packages/eleventy-rocket-nav/.eleventy.js create mode 100644 packages/eleventy-rocket-nav/README.md create mode 100644 packages/eleventy-rocket-nav/eleventy-rocket-nav.js create mode 100644 packages/eleventy-rocket-nav/package.json create mode 100644 packages/eleventy-rocket-nav/tsconfig.json create mode 100644 packages/eleventy-rocket-nav/types.d.ts create mode 100644 packages/eleventy-rocket-nav/types/eleventy-url-filter.d.ts create mode 100644 packages/launch/README.md create mode 100644 packages/launch/index.js create mode 100644 packages/launch/inline-notification/index.js create mode 100644 packages/launch/inline-notification/inline-notification.js create mode 100644 packages/launch/package.json create mode 100644 packages/launch/preset/_assets/404/404.svg create mode 100644 packages/launch/preset/_assets/404/astronaut.svg create mode 100644 packages/launch/preset/_assets/404/earth.svg create mode 100644 packages/launch/preset/_assets/404/moon.svg create mode 100644 packages/launch/preset/_assets/404/rocket.svg create mode 100644 packages/launch/preset/_assets/_static/404/bg_purple.png create mode 100644 packages/launch/preset/_assets/_static/404/overlay_stars.svg create mode 100644 packages/launch/preset/_assets/_static/icons/android-chrome-192x192.png create mode 100644 packages/launch/preset/_assets/_static/icons/android-chrome-512x512.png create mode 100644 packages/launch/preset/_assets/_static/icons/apple-touch-icon.png create mode 100644 packages/launch/preset/_assets/_static/icons/favicon-16x16.png create mode 100644 packages/launch/preset/_assets/_static/icons/favicon-32x32.png create mode 100755 packages/launch/preset/_assets/_static/icons/icon-128x128.png create mode 100644 packages/launch/preset/_assets/_static/icons/icon-512x512.png create mode 100755 packages/launch/preset/_assets/_static/icons/maskable-icon-128x128.png create mode 100644 packages/launch/preset/_assets/_static/icons/maskable-icon.png create mode 100644 packages/launch/preset/_assets/_static/icons/mstile-150x150.png create mode 100644 packages/launch/preset/_assets/_static/icons/safari-pinned-tab.svg create mode 100644 packages/launch/preset/_assets/brand-logos/github.svg create mode 100644 packages/launch/preset/_assets/brand-logos/gitlab.svg create mode 100644 packages/launch/preset/_assets/brand-logos/twitter.svg create mode 100644 packages/launch/preset/_assets/burger-menu.svg create mode 100644 packages/launch/preset/_assets/handleServiceWorker.js create mode 100644 packages/launch/preset/_assets/home-background.svg create mode 100644 packages/launch/preset/_assets/layout.css create mode 100644 packages/launch/preset/_assets/logo.svg create mode 100644 packages/launch/preset/_assets/markdown.css create mode 100644 packages/launch/preset/_assets/noscript.css create mode 100644 packages/launch/preset/_assets/octicon.svg create mode 100644 packages/launch/preset/_assets/social-media-image.jpg create mode 100644 packages/launch/preset/_assets/style.css create mode 100644 packages/launch/preset/_assets/variables.css create mode 100644 packages/launch/preset/_assets/webmanifest.json create mode 100644 packages/launch/preset/_data/footer.json create mode 100644 packages/launch/preset/_data/layout.cjs create mode 100644 packages/launch/preset/_data/rocketConfig.cjs create mode 100644 packages/launch/preset/_data/rocketLaunch.json create mode 100644 packages/launch/preset/_data/site.cjs create mode 100644 packages/launch/preset/_data/siteUrl.cjs create mode 100644 packages/launch/preset/_includes/404.njk create mode 100644 packages/launch/preset/_includes/home.njk create mode 100644 packages/launch/preset/_includes/layout.njk create mode 100644 packages/launch/preset/_includes/partials/addTitleHeadline.njk create mode 100644 packages/launch/preset/_includes/partials/content-footer.njk create mode 100644 packages/launch/preset/_includes/partials/darkModeJs.njk create mode 100644 packages/launch/preset/_includes/partials/footer.njk create mode 100644 packages/launch/preset/_includes/partials/head-content.njk create mode 100644 packages/launch/preset/_includes/partials/head.njk create mode 100644 packages/launch/preset/_includes/partials/header.njk create mode 100644 packages/launch/preset/_includes/partials/logoLink.njk create mode 100644 packages/launch/preset/_includes/partials/mobile-sidebar-bottom.njk create mode 100644 packages/launch/preset/_includes/partials/mobileNavigationJs.njk create mode 100644 packages/launch/preset/_includes/partials/pageJs.njk create mode 100644 packages/launch/preset/_includes/partials/previousNext.njk create mode 100644 packages/launch/preset/_includes/pure-content.njk create mode 100644 packages/launch/preset/_includes/search/input.njk create mode 100644 packages/launch/preset/_includes/with-index.njk create mode 100644 packages/launch/preset/_includes/with-sidebar.njk create mode 100644 packages/launch/preset/rocketLaunch.js create mode 100644 packages/mdjs-core/CHANGELOG.md create mode 100644 packages/mdjs-core/README.md create mode 100644 packages/mdjs-core/demo/script/README.md create mode 100644 packages/mdjs-core/demo/script/server.js create mode 100644 packages/mdjs-core/demo/stories/README.md create mode 100644 packages/mdjs-core/demo/stories/demo-wc-card.js create mode 100644 packages/mdjs-core/demo/stories/server.js create mode 100644 packages/mdjs-core/demo/stories/src/DemoWcCard.js create mode 100644 packages/mdjs-core/demo/stories/src/chevron.svg.js create mode 100644 packages/mdjs-core/demo/stories/src/demoWcCardStyle.css.js create mode 100644 packages/mdjs-core/index.js create mode 100644 packages/mdjs-core/index.mjs create mode 100644 packages/mdjs-core/package.json create mode 100644 packages/mdjs-core/src/isMdjsContent.js create mode 100644 packages/mdjs-core/src/mdjsDocPage.js create mode 100644 packages/mdjs-core/src/mdjsParse.js create mode 100644 packages/mdjs-core/src/mdjsProcess.js create mode 100644 packages/mdjs-core/src/mdjsStoryParse.js create mode 100644 packages/mdjs-core/test-node/integration.test.js create mode 100644 packages/mdjs-core/test-node/mdJsProcess.test.js create mode 100644 packages/mdjs-core/test-node/mdjsParse.test.js create mode 100644 packages/mdjs-core/test-node/mdjsStoryParse.test.js create mode 100644 packages/mdjs-core/tsconfig.json create mode 100644 packages/mdjs-core/types/code.d.ts create mode 100644 packages/mdjs-core/types/es-module-lexer.d.ts create mode 100644 packages/mdjs-core/types/remark.d.ts create mode 100644 packages/mdjs-preview/CHANGELOG.md create mode 100644 packages/mdjs-preview/README.md create mode 100644 packages/mdjs-preview/index.js create mode 100644 packages/mdjs-preview/mdjs-preview.js create mode 100644 packages/mdjs-preview/package.json create mode 100644 packages/mdjs-preview/src/MdJsPreview.js create mode 100644 packages/mdjs-preview/tsconfig.json create mode 100644 packages/mdjs-story/CHANGELOG.md create mode 100644 packages/mdjs-story/README.md create mode 100644 packages/mdjs-story/index.js create mode 100644 packages/mdjs-story/mdjs-story.js create mode 100644 packages/mdjs-story/package.json create mode 100644 packages/mdjs-story/src/MdJsStory.js create mode 100644 packages/mdjs-story/tsconfig.json create mode 100644 packages/navigation/README.md create mode 100644 packages/navigation/index.js create mode 100644 packages/navigation/package.json create mode 100644 packages/navigation/rocket-navigation.js create mode 100644 packages/navigation/src/RocketNavigation.js create mode 100644 packages/navigation/test-web/rocket-navigation.test.js create mode 100644 packages/navigation/tsconfig.json create mode 100644 packages/plugins-manager/CHANGELOG.md create mode 100644 packages/plugins-manager/README.md create mode 100644 packages/plugins-manager/index.js create mode 100644 packages/plugins-manager/package.json create mode 100644 packages/plugins-manager/src/addPlugin.js create mode 100644 packages/plugins-manager/src/adjustPluginOptions.js create mode 100644 packages/plugins-manager/src/executeSetupFunctions.js create mode 100644 packages/plugins-manager/src/metaConfigToRollupConfig.js create mode 100644 packages/plugins-manager/src/metaConfigToWebDevServerConfig.js create mode 100644 packages/plugins-manager/test-node/addPlugin.test.js create mode 100644 packages/plugins-manager/test-node/adjustPluginOptions.test.js create mode 100644 packages/plugins-manager/test-node/executeSetupFunction.test.js create mode 100644 packages/plugins-manager/test-node/metaConfigToRollupConfig.test.js create mode 100644 packages/plugins-manager/test-node/metaConfigToWebDevServerConfig.test.js create mode 100644 packages/plugins-manager/tsconfig.json create mode 100644 packages/plugins-manager/types/main.d.ts create mode 100644 packages/search/README.md create mode 100644 packages/search/assets/blog.svg create mode 100644 packages/search/assets/docs.svg create mode 100644 packages/search/assets/guides.svg create mode 100644 packages/search/assets/others.svg create mode 100644 packages/search/node.js create mode 100644 packages/search/package.json create mode 100644 packages/search/preset/_includes/search/input.njk create mode 100644 packages/search/preset/rocketSearch.js create mode 100644 packages/search/rocket-search.js create mode 100644 packages/search/src/LinkMixin.js create mode 100644 packages/search/src/RocketSearch.js create mode 100644 packages/search/src/RocketSearchCombobox.js create mode 100644 packages/search/src/RocketSearchOption.js create mode 100644 packages/search/src/RocketSearchPlugin.js create mode 100644 packages/search/src/getIdBlocksOfHtml.js create mode 100644 packages/search/src/renderResults.js create mode 100644 packages/search/src/types.d.ts create mode 100644 packages/search/src/utils-shared.js create mode 100644 packages/search/test-node/getIdBlocksOfHtml.test.js create mode 100644 packages/search/test-node/renderResults.test.js create mode 100644 packages/search/test-web/fixtures/generate.js create mode 100644 packages/search/test-web/fixtures/one-result.json create mode 100644 packages/search/test-web/rocket-search.test.js create mode 100644 packages/search/test-web/utils-shared.test.js create mode 100644 packages/search/tsconfig.json create mode 100644 packages/search/web.js create mode 100644 rocket.config.js create mode 100644 scripts/generate-ts-configs.mjs create mode 100644 scripts/lint-versions.js create mode 100644 scripts/runWindowsTests.mjs create mode 100644 scripts/runWorkspacesScripts.mjs create mode 100644 scripts/update-dependency.js create mode 100644 scripts/update-esm-entrypoints.mjs create mode 100644 scripts/update-package-configs.mjs create mode 100644 scripts/workspaces-scripts-bin.mjs create mode 100644 tsconfig.browser-base.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node-base.json create mode 100644 web-test-runner-chrome.config.mjs create mode 100644 web-test-runner-firefox.config.mjs create mode 100644 web-test-runner-webkit.config.mjs create mode 100644 web-test-runner.config.mjs create mode 100644 workspace-packages.mjs create mode 100644 yarn.lock diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 00000000..180294f3 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@1.1.0/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch" +} diff --git a/.eleventyignore b/.eleventyignore new file mode 100644 index 00000000..0a9796f4 --- /dev/null +++ b/.eleventyignore @@ -0,0 +1,2 @@ +node_modules/** +/docs/_assets/head.html diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..aa7a802a --- /dev/null +++ b/.eslintignore @@ -0,0 +1,12 @@ +/coverage/ +/packages/*/coverage +node_modules +dist +dist-types +demo +CHANGELOG.md +.changeset +_site +_site-dev +__output +__output-dev diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..f8189b6f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +open_collective: modern-web diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..7a57296e --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,3 @@ +## What I did + +1. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..31b106d2 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,56 @@ +name: Release + +on: + push: + branches: + - main + +jobs: + release: + # Prevents changesets action from creating a PR on forks + if: github.repository == 'modernweb-dev/rocket' + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@master + with: + # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits + fetch-depth: 0 + + - name: Setup Node.js 14.x + uses: actions/setup-node@master + with: + node-version: 14.x + registry-url: 'https://registry.npmjs.org' + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + + - uses: actions/cache@v2 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install Dependencies + run: yarn --frozen-lockfile + + - name: Build Packages + run: yarn build:packages + + - name: Build Types + run: yarn types + + - name: Create Release Pull Request or Publish to npm + id: changesets + uses: changesets/action@master + with: + # This expects you to have a script called release which does a build for your packages and calls changeset publish + publish: yarn release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml new file mode 100644 index 00000000..7fb04b07 --- /dev/null +++ b/.github/workflows/verify.yml @@ -0,0 +1,73 @@ +name: Verify changes + +on: pull_request + +jobs: + verify-linux: + name: Verify linux + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [14.x] + steps: + - uses: actions/checkout@v2 + + - name: Setup Node ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + + - uses: actions/cache@v2 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install dependencies + run: yarn --frozen-lockfile + + - uses: microsoft/playwright-github-action@v1 + + - name: Build Packages + run: yarn build:packages + + - name: Lint + run: yarn lint + + - name: Test + run: yarn test + + # verify-windows: + # name: Verify windows + # runs-on: windows-latest + # steps: + # - uses: actions/checkout@v2 + + # - name: Setup Node 12.x + # uses: actions/setup-node@v1 + # with: + # node-version: 12.x + + # - name: Get yarn cache directory path + # id: yarn-cache-dir-path + # run: echo "::set-output name=dir::$(yarn cache dir)" + + # - uses: actions/cache@v2 + # id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + # with: + # path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + # key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + # restore-keys: | + # ${{ runner.os }}-yarn- + + # - name: Install dependencies + # run: yarn --frozen-lockfile + + # - name: Test + # run: yarn test diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..68e1853f --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +## editors +/.idea +/.vscode + +## system files +.DS_Store + +## code coverage folders +coverage/ + +## npm +node_modules +npm-debug.log +yarn-error.log + +## temp folders +/.tmp/ + +## we prefer yarn.lock +package-lock.json +## lock files in packages we do not need to save +packages/*/yarn.lock + +## build output +dist +dist-types +stats.html +*.tsbuildinfo + +## Rocket ignore files (need to be the full relative path to the folders) +docs/_merged_data/ +docs/_merged_assets/ +docs/_merged_includes/ +_site +_site-dev + +## Ignore Rocket Test Builds +_merged_data +_merged_assets +_merged_includes +__output +__output-dev diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..958b5a36 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v14 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..78849f7d --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,84 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [open.web.components@gmail.com](mailto:open.web.components@gmail.com). All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of actions. + +**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the project community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, +available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..94cee91a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,107 @@ +# Contributing + +## Getting Started + +> Please note that this project is released with a [Contributor Code of Conduct](./CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. + +First, create a fork of the [modernweb-dev/rocket](https://github.com/modernweb-dev/rocket) repo by hitting the `fork` button on the GitHub page. + +Next, clone our repository onto your computer with this command (replacing YOUR_USERNAME with your actual GitHub username) + +```sh +git clone git@github.com:modernweb-dev/rocket.git +``` + +Once cloning is complete, change directory to the repo. + +```sh +cd web +``` + +Now add your fork as a remote + +```sh +git remote add fork git@github.com:/rocket.git +``` + +Create a new local branch + +```sh +git checkout -b my-awesome-fix +``` + +## Preparing Your Local Environment for Development + +Now that you have cloned the repository, ensure you have [yarn](https://classic.yarnpkg.com/lang/en/) installed run the following commands to set up the development environment. + +```sh +yarn install +``` + +This will download and install all packages needed. + +## Making Your Changes + +Make your changes to the project. Commits are linted using precommit hooks, meaning that any code that raises linting error cannot be committed. In order to help avoid that, we recommend using an IDE or editor with an eslint plugin in order to streamline the development process. Plugins are available for all the popular editors. For more information see [ESLint Integrations](https://eslint.org/docs/user-guide/integrations) + +### Compiling the typescript code + +If you're making cross-package changes, you need to compile the typescript code. We recommend executing `tsc:watch` from the root of the package and keeping that running while you make your changes. + +### Running tests + +To run the tests of a package, it's recommended to `cd` into the package directory and then using `yarn test` to run them. This way you're only running tests of that specific package. + +### Integration testing + +To see how your changes integrate with everything together you can use the `test-runner` package. There are different commands in this package which you can execute to trigger different scenarios in the test runner. + +## Adding new packages + +For all projects the tsconfig/jsconfig configuration files are auto generated. You need to add an entry to the [./workspace-packages.ts](./workspace-packages.ts) to let it generate a config for you. After adding an entry, run `yarn update-package-configs` to generate the files for you. + +## Create a Changeset + +If you made changes for which you want to trigger a release, you need to create a changeset. +This documents your intent to release, and allows you to specify a message that will be put into the changelog(s) of the package(s). + +[More information on changesets](https://github.com/atlassian/changesets) + +Run + +```sh +yarn changeset +``` + +And use the menu to select for which packages you need a release, and then select what kind of release. For the release type, we follow [Semantic Versioning](https://semver.org/), so please take a look if you're unfamiliar. + +In short: + +- A documentation change or similar chore usually does not require a release +- A bugfix requires a patch +- A new feature (feat) requires a minor +- A breaking change requires a major + +Exceptions: + +- For alpha (<1.0.0), bugfixes and feats are both patches, and breaking changes are allowed as minors. +- For release-candidate and other special cases, other rules may follow. + +## Committing Your Changes + +Commit messages must follow the [conventional commit format](https://www.conventionalcommits.org/en/v1.0.0-beta.2/) +Modern-web uses package name as scope. So for example if you fix a _terrible bug_ in the package `@web/test-runner`, the commit message should look like this: + +```sh +fix(test-runner): fix terrible bug +``` + +## Create a Pull Request + +Now it's time to push your branch that contains your committed changes to your fork. + +```sh +git push -u fork my-awesome-fix +``` + +After a successful push, if you visit your fork on GitHub, you should see a button that will allow you to create a Pull Request from your forked branch, to our main branch. diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..fe021288 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 modern-webdev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..ef05dd0d --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +> This project is in it's BETA phase + +

+ Rocket +

+ +

+ GitHub Actions workflow status + Follow @modern_web_dev on Twitter +

+ +

+ Website + · + Guides + · + Documentation +

+ +

+ +**The modern web setup for static sites with a sprinkle of JavaScript!** + +- **Meta Framework:** Build on top of giants like eleventy, Rollup, and Modern Web. +- **Powerful Default Template:** Provide content and you are ready to go. +- **Small:** No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed.. + +

+ Explore the Rocket Guides  ▶ +

+ +## The goal for Rocket + +> Our goal is to provide developers with a meta framework for static websites with a spricle of JavaScript. + +Get a site up and running in no time and focus on the content. +You can still tweak every details of every underlying tool that get's used. + +Rocket is part of the [Modern Web Family](https://twitter.com/modern_web_dev). + +## 🤝 Contributing + +We are always looking for contributors of all skill levels! If you're looking to ease your way into the project, try out a [good first issue](https://github.com/modernweb-dev/rocket/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). + +If you are interested in helping contribute to Modern Web, please take a look at our [Contributing Guide](https://github.com/modernweb-dev/rocket/blob/main/CONTRIBUTING.md). Also, feel free to drop into [slack](https://rocket.modern-web.dev/discover/slack/) and say hi. 👋 + +### Financial Contributors + +Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/modern-web/contribute)] diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20b4ffcd9d8fb72cfe2aee8388d58e28a4a856ba GIT binary patch literal 10383 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 E0{M{MSO5S3 literal 0 HcmV?d00001 diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 00000000..bdd3da2a --- /dev/null +++ b/docs/404.md @@ -0,0 +1,4 @@ +--- +layout: 404.njk +permalink: 404.html +--- diff --git a/docs/_assets/head.html b/docs/_assets/head.html new file mode 100644 index 00000000..8512e1bf --- /dev/null +++ b/docs/_assets/head.html @@ -0,0 +1,9 @@ + + + diff --git a/docs/_assets/home-background-original.svg b/docs/_assets/home-background-original.svg new file mode 100644 index 00000000..0bbf1669 --- /dev/null +++ b/docs/_assets/home-background-original.svg @@ -0,0 +1 @@ +Outer space diff --git a/docs/_assets/home-background.svg b/docs/_assets/home-background.svg new file mode 100644 index 00000000..cf5fc6db --- /dev/null +++ b/docs/_assets/home-background.svg @@ -0,0 +1 @@ +Outer space diff --git a/docs/_assets/logo.svg b/docs/_assets/logo.svg new file mode 100644 index 00000000..6a151fb2 --- /dev/null +++ b/docs/_assets/logo.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_assets/social-media-image.jpg b/docs/_assets/social-media-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c83352cee26a065306ca925b28b4937a7e03aa7e GIT binary patch literal 52525 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%0D)nL>MkzaRSf9+Aw{|FBd+wZse^eNO&m;|BP* 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 X%I%%{t_Ai=SYOI1?=G?EuciM07<+q- literal 0 HcmV?d00001 diff --git a/docs/_assets/style.css b/docs/_assets/style.css new file mode 100644 index 00000000..d03d47f7 --- /dev/null +++ b/docs/_assets/style.css @@ -0,0 +1,21 @@ +body[layout='home'] .markdown-body .call-to-action:nth-of-type(2) { + --primary-color: #222; + --primary-color-lighter: #333; + --primary-color-darker: #000; +} + +@media screen and (min-width: 1024px) { + body[layout='home'][home-layout='background'] .page-background { + top: -210px; + right: -463px; + transform: rotate(45deg); + } +} + +rocket-navigation { + font-family: 'Montserrat', sans-serif; +} + +header { + font-family: 'Montserrat', sans-serif; +} diff --git a/docs/_assets/webmanifest.json b/docs/_assets/webmanifest.json new file mode 100644 index 00000000..76f94781 --- /dev/null +++ b/docs/_assets/webmanifest.json @@ -0,0 +1,29 @@ +{ + "name": "Rocket", + "short_name": "rocket", + "theme_color": "#e63946", + "background_color": "#1d3557", + "display": "standalone", + "orientation": "portrait", + "Scope": "/", + "start_url": "/", + "icons": [ + { + "src": "../_merged_assets/_static/icons/android-chrome-192x192.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "../_merged_assets/_static/icons/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "../_merged_assets/_static/icons/maskable-icon.jpg", + "sizes": "1024x1024", + "type": "image/jpg", + "purpose": "any maskable" + } + ], + "splash_pages": null +} diff --git a/docs/_data/footer.json b/docs/_data/footer.json new file mode 100644 index 00000000..6b918ea7 --- /dev/null +++ b/docs/_data/footer.json @@ -0,0 +1,45 @@ +[ + { + "name": "Discover", + "children": [ + { + "text": "Blog", + "href": "/blog/" + }, + { + "text": "Help and Feedback", + "href": "https://github.com/modernweb-dev/rocket/issues" + } + ] + }, + { + "name": "Follow", + "children": [ + { + "text": "Github", + "href": "https://github.com/modernweb-dev/rocket" + }, + { + "text": "Twitter", + "href": "https://twitter.com/modern_web_dev" + }, + { + "text": "Slack", + "href": "/about/slack/" + } + ] + }, + { + "name": "Support", + "children": [ + { + "text": "Sponsor", + "href": "/about/sponsor/" + }, + { + "text": "Contribute", + "href": "https://github.com/modernweb-dev/rocket/blob/main/CONTRIBUTING.md" + } + ] + } +] diff --git a/docs/_data/rocketLaunch.json b/docs/_data/rocketLaunch.json new file mode 100644 index 00000000..204aeab6 --- /dev/null +++ b/docs/_data/rocketLaunch.json @@ -0,0 +1,4 @@ +{ + "homeLayout": "background", + "newsletter": false +} diff --git a/docs/_data/site.cjs b/docs/_data/site.cjs new file mode 100644 index 00000000..ac8a77f2 --- /dev/null +++ b/docs/_data/site.cjs @@ -0,0 +1,23 @@ +module.exports = async function () { + return { + dir: 'ltr', + lang: 'en', + name: 'Rocket', + description: 'Rocket is the way to build fast static websites with a sprinkle of javascript', + socialLinks: [ + { + name: 'GitHub', + url: 'https://github.com/modernweb-dev/rocket', + }, + ], + gitSiteUrl: 'https://github.com/modernweb-dev/rocket', + gitBranch: 'main', + helpUrl: 'https://github.com/modernweb-dev/rocket/issues', + logoAlt: 'Rocket Logo', + iconColorMaskIcon: '#3f93ce', + iconColorMsapplicationTileColor: '#1d3557', + iconColorThemeColor: '#1d3557', + socialMediaImage: '/_assets/social-media-image.jpg', + // analytics: 'UA-131782693-2', // modern web key + }; +}; diff --git a/docs/about/slack.md b/docs/about/slack.md new file mode 100644 index 00000000..567d9cbf --- /dev/null +++ b/docs/about/slack.md @@ -0,0 +1,5 @@ +# Slack + +You can also find us on the Polymer slack in the [#open-wc](https://slack.com/share/IUQNUPWUF/awabyN8iYH4dXX6aGpu16ES9/enQtOTc2Nzc2ODEyOTY3LWM5ZGExNGFiMmM4NDY2YWI2MzYwOGY5ZTNlZjk4OGU4NTFhMGJjNmVhNGI4MzVlNTMwNGRiNGIxNjc4MGJhNDg) channel. + +You can join the Polymer slack by visiting https://www.polymer-project.org/slack-invite. diff --git a/docs/about/sponsor.md b/docs/about/sponsor.md new file mode 100644 index 00000000..b3dc32fc --- /dev/null +++ b/docs/about/sponsor.md @@ -0,0 +1,9 @@ +--- +title: Sponsor +eleventyNavigation: + key: Sponsor +--- + +We currently can only accept sponsoring in the form of services or contributions. + +If you are interested in monetary sponsoring please [let as know as](mailto:hello@modern-web.dev). diff --git a/docs/blog/index.md b/docs/blog/index.md new file mode 100644 index 00000000..b0a3638e --- /dev/null +++ b/docs/blog/index.md @@ -0,0 +1,14 @@ +--- +title: Rocket Blog +layout: blog +eleventyNavigation: + key: Blog + order: 30 +pagination: + data: collections.blog + size: 10 + reverse: true + alias: posts +--- + +Discover articles from the core team and contributors about Rocket, tips and tricks included! diff --git a/docs/blog/introducing-rocket/images/blog-header.jpg b/docs/blog/introducing-rocket/images/blog-header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3318dfb9a80e07a544b7d053511075cfa3a6fe7 GIT binary patch literal 10992 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 L`UXI4zM1-8-!lD; literal 0 HcmV?d00001 diff --git a/docs/blog/introducing-rocket/images/social-media-image.jpg b/docs/blog/introducing-rocket/images/social-media-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..459fe86d9c5fbe39246321fcfed19262319f3a2b GIT binary patch literal 12064 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 + + + + + #1d3557 + + + diff --git a/docs/docs/configuration/index.md b/docs/docs/configuration/index.md new file mode 100644 index 00000000..5c622fe6 --- /dev/null +++ b/docs/docs/configuration/index.md @@ -0,0 +1 @@ +# Configuration ||10 diff --git a/docs/docs/configuration/overview.md b/docs/docs/configuration/overview.md new file mode 100644 index 00000000..0efb2a83 --- /dev/null +++ b/docs/docs/configuration/overview.md @@ -0,0 +1,77 @@ +# Configuration >> Overview ||10 + +The configuration file is `rocket.config.js` or `rocket.config.mjs`. + +The config files consists of the following parts: + +```js +import { rocketLaunch } from '@rocket/launch'; + +export default { + presets: [rocketLaunch()], + build: { + emptyOutputDir: true, + pathPrefix: 'subfolder-only-for-build', + serviceWorkerFileName: 'service-worker.js', + }, +}; +``` + +Rocket is primarily build around plugins for each of it's systems. + +New plugins can be added and all default plugins can be adjusted or even removed by using the following functions. + +```js +export default { + setupUnifiedPlugins: [], + setupDevAndBuildPlugins: [], + setupDevPlugins: [], + setupBuildPlugins: [], + setupEleventyPlugins: [], + setupCliPlugins: [], +}; +``` + +## Adding Rollup Plugins + +For some projects you might want to enable non-standard behaviors like importing JSON files as JavaScript. + +```js +import data from './data.json'; +``` + +You can accomplish this with rollup and dev server plugins. Make sure to add both the dev-server plugin as well as the rollup plugin, so that the behaviors is the same during development as it is in the production build. + +For these cases you can use `setupDevAndBuildPlugins`, which will automatically add the plugin for you to both rollup and dev-server: + +```js +import json from '@rollup/plugin-json'; +import { addPlugin } from 'plugins-manager'; + +/** @type {Partial} */ +const config = { + setupDevAndBuildPlugins: [ + addPlugin({ name: 'json', plugin: json, location: 'top', options: { my: 'settings' } }), + ], +}; + +export default config; +``` + +This will add the rollup plugin `json` with the id `json` at the top of the plugin list of rollup and the dev server. It needs to be at the top so further plugins down the line can work with json imports. +For the Dev Server the plugins are automatically wrapped by `@web/dev-server-rollup`. Note that [not all rollup plugins](https://modern-web.dev/docs/dev-server/plugins/rollup/#compatibility-with-rollup-plugins) will work with the dev-server. + +## Modifying Options of Plugins + +All plugins which are either default or are added via a preset can still be adjusted by using `adjustPluginOptions`. + +```js +import { adjustPluginOptions } from 'plugins-manager'; + +/** @type {Partial} */ +const config = { + setupDevAndBuildPlugins: [adjustPluginOptions('json', { my: 'overwrite settings' })], +}; + +export default config; +``` diff --git a/docs/docs/eleventy-plugins/index.md b/docs/docs/eleventy-plugins/index.md new file mode 100644 index 00000000..cb2e4d14 --- /dev/null +++ b/docs/docs/eleventy-plugins/index.md @@ -0,0 +1 @@ +# Eleventy Plugins ||40 diff --git a/docs/docs/eleventy-plugins/mdjs-unified.md b/docs/docs/eleventy-plugins/mdjs-unified.md new file mode 100644 index 00000000..7994cd22 --- /dev/null +++ b/docs/docs/eleventy-plugins/mdjs-unified.md @@ -0,0 +1,126 @@ +# Eleventy Plugins >> Markdown JavaScript (Mdjs) + +Use mdjs in your 11ty site. + +## Setup + +``` +npm install @rocket/eleventy-plugin-mdjs +``` + +Create an 11ty config file `.eleventy.js` + +```js +const pluginMdjs = require('@rocket/eleventy-plugin-mdjs'); + +module.exports = function (eleventyConfig) { + eleventyConfig.addPlugin(pluginMdjs); +}; +``` + +As mdjs does return html AND javascript at the same time we need to have a template that can understand it. For that we create a layout file. + +👉 `_includes/layout.njk` + +{% raw %} + +```js +
+ {{ content.html | safe }} +
+ + +``` + +{% endraw %} + +And in our content we then need to make sure to use that template. + +👉 `index.md` + +``` +--- +layout: layout.njk +--- + +# Hello World +``` + +You can see a minimal setup in the [examples repo](https://github.com/daKmoR/rocket-example-projects/tree/master/eleventy-and-mdjs). + +## Configure a unified or remark plugin with mdjs + +By providing a `setupUnifiedPlugins` function as an option to `eleventy-plugin-mdjs` you can set options for all unified/remark plugins. + +We do use [plugins-manager](../plugins-manager/overview.md). + +This example adds a CSS class to the `htmlHeading` plugin so heading links can be selected in CSS. + +```js +const pluginMdjs = require('@rocket/eleventy-plugin-mdjs'); +const { adjustPluginOptions } = require('plugins-manager'); + +module.exports = function (eleventyConfig) { + eleventyConfig.addPlugin(pluginMdjs, { + setupUnifiedPlugins: [ + adjustPluginOptions('htmlHeading', { + properties: { + className: ['anchor'], + }, + }), + ], + }); +}; +``` + +## Add a unified or remark plugin + +The order of plugins is important in unified as each plugin processes the content and passes on its result. +Some plugins do work with the markdown AST and some with the rehype (e.g. html) AST. In order to get access to the correct AST the plugin needs to be in a specific location in the processing order. + +Examples on how to insert a plugin right after creating the markdown AST. + +```js +const pluginMdjs = require('@rocket/eleventy-plugin-mdjs'); +const { addPlugin } = require('plugins-manager'); +const { myRemarkPlugin } = require('./my-remark-plugin.js'); + +module.exports = function (eleventyConfig) { + eleventyConfig.addPlugin(pluginMdjs, { + setupUnifiedPlugins: [ + addPlugin({ name: 'my-remark-plugin', plugin: myRemarkPlugin, location: 'markdown' }), + ], + }); +}; +``` + +Examples on how to insert a plugin right after creating the rehype AST. + +```js +const pluginMdjs = require('@rocket/eleventy-plugin-mdjs'); +const { addPlugin } = require('plugins-manager'); +const { myRehypePlugin } = require('./my-rehype-plugin.js'); + +module.exports = function (eleventyConfig) { + eleventyConfig.addPlugin(pluginMdjs, { + setupUnifiedPlugins: [ + addPlugin({ name: 'my-rehype-plugin', plugin: myRehypePlugin, location: 'remark2rehype' }), + ], + }); +}; +``` + +You can also add both + +```js +module.exports = function (eleventyConfig) { + eleventyConfig.addPlugin(pluginMdjs, { + setupUnifiedPlugins: [ + addPlugin({ name: 'my-remark-plugin', plugin: myRemarkPlugin, location: 'markdown' }), + addPlugin({ name: 'my-rehype-plugin', plugin: myRehypePlugin, location: 'remark2rehype' }), + ], + }); +}; +``` diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 00000000..8994061d --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,12 @@ +--- +title: Documentation +eleventyNavigation: + key: Docs + order: 20 +--- + +Here you will find all the details for each of the packages/systems we offer. + +You should check out: + +- [@rocket/launch](./presets/launch.md) which is our default preset diff --git a/docs/docs/markdown-javascript/index.md b/docs/docs/markdown-javascript/index.md new file mode 100644 index 00000000..c8011edd --- /dev/null +++ b/docs/docs/markdown-javascript/index.md @@ -0,0 +1 @@ +# Markdown JavaScript ||30 diff --git a/docs/docs/markdown-javascript/overview.md b/docs/docs/markdown-javascript/overview.md new file mode 100644 index 00000000..4e212b14 --- /dev/null +++ b/docs/docs/markdown-javascript/overview.md @@ -0,0 +1,237 @@ +# Markdown JavaScript >> Overview || 10 + +Markdown JavaScript (Mdjs) is a format that allows you to use JavaScript with Markdown, to create interactive demos. It does so by "annotating" JavaScript that should be executed in Markdown. + +To annotate we use a code block with `js script`. + +````md +```js script +// execute me +``` +```` + +## Web Components + +One very good use case for that can be web components. +HTML already works in markdown so all you need is to load a web components definition file. + +You could even do so within the same markdown file. + +````md +## This is my-card + +Here's an example of the component: + +```html preview-story + +

Hello world!

+ +
+``` +```` + +You can even execute some JavaScript: + +````md +## This is my-el + + + +```js script +import { LitElement, html } from 'https://unpkg.com/lit-element?module'; + +class MyEl extends LitElement { + render() { + this.innerHTML = '

I am alive

'; + } +} + +customElements.define('my-el', MyEl); +``` +```` + +## Demo Support (Story) + +mdjs comes with some additional helpers you can choose to import via + +````md +```js script +import '@mdjs/mdjs-story/mdjs-story.js'; +import '@mdjs/mdjs-preview/mdjs-preview.js'; +``` +```` + +once loaded you can use them like so. + +````md +```js script +import '@mdjs/mdjs-story/mdjs-story.js'; +import '@mdjs/mdjs-preview/mdjs-preview.js'; +``` +```` + +once loaded you can use them like so. + +### story + +The code snippet will actually get executed at that place and you will have a live demo + +````md +```js story +export const JsStory = () => html` JS Story `; +``` +```` + +````md +```html story +HTML Story +``` +```` + +#### full code support + +````md +```js story +export const JsStory = () => { + const calculateSomething = 12; + return html` + JS Story + `; +}; +``` +```` + +### preview story + +Will become a live demo wrapped in a container with a show code button. + +````md +```js preview-story +export const JsPreviewStory = () => html` JS Preview Story `; +``` +```` + +````md +```html preview-story +HTML Preview Story +``` +```` + +Here is a live example from [demo-wc-card](https://www.npmjs.com/package/demo-wc-card). + +```js script +import '@mdjs/mdjs-story/mdjs-story.js'; +import '@mdjs/mdjs-preview/mdjs-preview.js'; +import { html } from 'lit-html'; +``` + +```js preview-story +import 'demo-wc-card/demo-wc-card.js'; +export const header = () => { + return html` `; +}; +``` + +## Supported Systems + +### es-dev-server + +Preview your mdjs readme with live demos and auto reload. + +- Add to your `package.json`: + + ```json + "scripts": { + "start": "es-dev-server", + } + ``` + +- Create a `es-dev-server.config.js` in the root of your repo. + + ```js + const { mdjsTransformer } = require('@mdjs/core'); + + module.exports = { + nodeResolve: true, + open: 'README.md', + watch: true, + responseTransformers: [mdjsTransformer], + }; + ``` + +### Storybook + +Please check out [@open-wc/demoing-storybook](https://open-wc.org/demoing/) for a fully integrated setup. + +It includes [storybook-addon-markdown-docs](https://open-wc.org/demoing/storybook-addon-markdown-docs.html) which uses mdjs under the hood. + +### Chrome Extension (currently only for Github) + +See live demos directly inside github page, markdown files, issues, pull requests... + +Please check out [mdjs-viewer](https://github.com/open-wc/mdjs-viewer). + +## Build mdjs + +### Basic + +mdjs offers two more "basic" integrations + +#### `mdjsDocPage` + +Creates a full blown html page by passing in the markdown. + +```js +const { mdjsDocPage } = require('@mdjs/core'); + +const page = await mdjsDocPage(markdownString); +/* + + ... // load styles/components for mdjs, start stories + +

Some Markdown

+ + +*/ +``` + +#### `mdjsProcess` + +Pass in multiple markdown documents and you get back all the jsCode and rendered html. + +```js +const { mdjsProcess } = require('@mdjs/core'); + +const data = await mdjsProcess(markdownString); +console.log(data); +/* +{ + jsCode: " + import '@mdjs/mdjs-story/mdjs-story.js'; + ... + ", + html: '

Markdown One

', +} +*/ +``` + +### Advanced + +mdjs is build to be integrated within the [unifiedjs](https://unifiedjs.com/) system. + +```js +const unified = require('unified'); +const markdown = require('remark-parse'); +const htmlStringify = require('remark-html'); +const mdjsParse = require('@mdjs/core'); + +const parser = unified().use(markdown).use(mdjsParse).use(htmlStringify); +const result = await parser.process(body); +const { jsCode } = result.data; +console.log(result.contents); +//

This is my-el>

+// +console.log(jsCode); +// customElements.define('my-el', class extends HTMLElement { +// ... +``` diff --git a/docs/docs/markdown-javascript/preview.md b/docs/docs/markdown-javascript/preview.md new file mode 100644 index 00000000..4df6f459 --- /dev/null +++ b/docs/docs/markdown-javascript/preview.md @@ -0,0 +1,19 @@ +# Markdown JavaScript >> Preview ||20 + +You can showcase live running code by annotating a code block with `js preview-story`. + +````md +```js preview-story +import { html } from 'lit-html'; + +export const foo = () => html`

my html

`; +``` +```` + +will result in + +```js preview-story +import { html } from 'lit-html'; + +export const foo = () => html`

my html

`; +``` diff --git a/docs/docs/markdown-javascript/story.md b/docs/docs/markdown-javascript/story.md new file mode 100644 index 00000000..c92f5170 --- /dev/null +++ b/docs/docs/markdown-javascript/story.md @@ -0,0 +1,19 @@ +# Markdown JavaScript >> Story ||30 + +You can showcase live running code by annotating a code block with `js story`. + +````md +```js story +import { html } from 'lit-html'; + +export const foo = () => html`

my html

`; +``` +```` + +will result in + +```js story +import { html } from 'lit-html'; + +export const foo = () => html`

my html

`; +``` diff --git a/docs/docs/presets/blog.md b/docs/docs/presets/blog.md new file mode 100644 index 00000000..a394e834 --- /dev/null +++ b/docs/docs/presets/blog.md @@ -0,0 +1,21 @@ +# Presets >> Blog ||30 + +Enable writing blog posts within your rocket site + +## Installation + +```bash +npm i @rocket/blog +``` + +## Usage + +👉 `rocket.config.mjs` + +```js +import { rocketBlog } from '@rocket/blog'; + +export default { + presets: [rocketBlog()], +}; +``` diff --git a/docs/docs/presets/index.md b/docs/docs/presets/index.md new file mode 100644 index 00000000..b9964127 --- /dev/null +++ b/docs/docs/presets/index.md @@ -0,0 +1,5 @@ +--- +excludeFromSearch: true +--- + +# Presets ||20 diff --git a/docs/docs/presets/launch.md b/docs/docs/presets/launch.md new file mode 100644 index 00000000..c6faeccb --- /dev/null +++ b/docs/docs/presets/launch.md @@ -0,0 +1,119 @@ +# Presets >> Launch ||10 + +Rocket comes with a preset you will love. Simple, Responsive and behaving like native it sure is going to be a hit among your users. + +## Installation + +```bash +npm i @rocket/launch +``` + +👉 `rocket.config.mjs` + +```js +import { rocketLaunch } from '@rocket/launch'; + +export default { + presets: [rocketLaunch()], +}; +``` + +## Data + +Most data comes from `site.cjs`. + +There is also a specific `rocketLaunch.json`. + +The footer data comes from `footer.json` + +## Inline Notification + +Notification are web components that bring in some styles. + +To use them in Markdown you need to write the html tag and have it separated by an empty line. + +```js script +import '@rocket/launch/inline-notification/inline-notification.js'; +``` + +First you need to import the script + +```` +```js script +import '@rocket/launch/inline-notification/inline-notification.js'; +``` +```` + +### Tip + + + +I am a tip + + + +**Usage** + +```md + + +I am a tip + + +``` + +### Modify the title + +To override the title you can provide a property success. + + + +I am a success message + + + +**Usage** + +```md + + +I am a success message + + +``` + +### Warning + + + +I am a warning + + + +**Usage** + +```md + + +I am a warning + + +``` + +### Danger + + + +I am a dangerous message + + + +**Usage** + +```md + + +I am a dangerous message + + +``` diff --git a/docs/docs/presets/search.md b/docs/docs/presets/search.md new file mode 100644 index 00000000..8f99870f --- /dev/null +++ b/docs/docs/presets/search.md @@ -0,0 +1,19 @@ +# Presets >> Search ||20 + +Add a search for all your static content. + +## Installation + +```bash +npm i @rocket/search +``` + +👉 `rocket.config.mjs` + +```js +import { rocketSearch } from '@rocket/search'; + +export default { + presets: [rocketSearch()], +}; +``` diff --git a/docs/docs/tools/index.md b/docs/docs/tools/index.md new file mode 100644 index 00000000..e219725c --- /dev/null +++ b/docs/docs/tools/index.md @@ -0,0 +1 @@ +# Tools ||50 diff --git a/docs/docs/tools/overview.md b/docs/docs/tools/overview.md new file mode 100644 index 00000000..57261567 --- /dev/null +++ b/docs/docs/tools/overview.md @@ -0,0 +1,260 @@ +# Tools >> Plugins Manager ||10 + +The Plugins Manager replaces the specific registration/execution (with options) in a given plugin system by an intend to use a plugin (with these options). +This allows your users to adjust the options before actually applying the plugins. + +## Problem + +Many plugin systems require you to either execute a plugin function like in `rollup`. + +```js +import json from '@rollup/plugin-json'; +export default { + plugins: [json({ preferConst: true })], +}; +``` + +or add it in a special way like in `eleventy` + +```js +const pluginSyntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight'); +module.exports = function (eleventyConfig) { + eleventyConfig.addPlugin(pluginSyntaxHighlight, { templateFormats: ['md'] }); +}; +``` + +or `unified/remark`. + +```js +var unified = require('unified'); +var markdown = require('remark-parse'); +var toc = require('remark-toc'); + +var processor = unified().use(markdown).use(toc, { maxDepth: 2 }); +// ... +``` + +## Problem statement + +> Executing or adding a plugin in a special way is a one time process. You can not transparently later change the options of the given plugin. + +This means if you wish to define default plugins and allow your user to override all of the settings it's "impossible". + +## Solution + +The plugins manager let's you orchestrate a set of "meta plugins" which are defined by + +- name +- plugin +- options + +```js +import beep from '@rollup/plugin-beep'; +import url from '@rollup/plugin-url'; + +let metaPlugins = [ + { name: 'beep', plugin: beep }, + { name: 'url', plugin: url, options: { limit: 10000 } }, +]; +``` + +This array can be modified by adding/removing or adjusting options. + +```js +// raw add +metaPlugins.push({ + // another plugin +}); + +// raw adjust +metaPlugins[1].options.limit = 20000; +``` + +And then you can convert it into the specific format that can be assigned to your system in question. + +```js +// execute plugins for rollup +const plugins = metaPlugins.map(pluginObj => { + if (pluginObj.options) { + return pluginObj.plugin(pluginObj.options); + } else { + return pluginObj.plugin(); + } +}); + +// rollup.config.js +export default { + plugins, +}; +``` + +### Adding Helpers + +Doing array manipulations is kinda error-prone so we offer encourage to use an array of setup function. Where as each setup function can either add a new plugin (with a unique name) or adjust an already existing plugin. + +```js +import { addPlugin, adjustPluginOptions } from 'plugins-manager'; + +const systemSetupFunctions = [ + addPlugin({ name: 'first', plugin: first }), + addPlugin({ name: 'second', plugin: second }), +]; +const userSetupFunctions = [adjustPluginOptions('first', { my: 'options' })]; +``` + +Arrays of functions can by merged like so + +```js +const finalSetupFunctions = [...systemSetupFunctions, ...userSetupFunctions]; +``` + +and then converted to the final output. + +```js +import { metaPluginsToRollupPlugins } from 'plugins-manager'; + +const plugins = metaPluginsToRollupPlugins(finalSetupFunctions, metaPlugins); +``` + +## Adding a Plugin + +This makes sure that + +- the name is unique +- you can add at at `top`, `bottom` and `after/before` a given other plugin + +By default it adds at the bottom. + +```js +import json from '@rollup/plugin-json'; +import { addPlugin } from 'plugins-manager'; + +const userSetupFunctions = [ + addPlugin({ name: 'json', plugin: json, options: { preferConst: true } }), +]; +``` + +Example usage: + +```js +addPlugin({ name: 'json', plugin: json }); // Add at the bottom (default) +addPlugin({ name: 'json', plugin: json, location: 'top' }); // Add at the top/beginning of the array +addPlugin({ name: 'json', plugin: json, location: 'beep' }); // Add after (default) plugin 'beep' +addPlugin({ name: 'json', plugin: json, location: 'beep', how: 'before' }); // Add before plugin 'beep' +``` + +## Adjusting Plugin Options + +Adjusting options means to either + +- flatly merge objects (e.g. only the first level will be preserved) +- calling a function to do the merge yourself +- setting the raw value (if not an object or function) + +```js +import { adjustPluginOptions } from 'plugins-manager'; + +const userSetupFunctions = [ + adjustPluginOptions('json', { preferConst: false, anotherOption: 'format' }), +]; +``` + +Example usage: + +```js +// given +addPlugin({ + name: 'json', + plugin: json, + options: { + other: { + nested: 'other.nested', + nested2: 'other.nested2', + }, + main: true, + }, +}); + +// merge objects flately +adjustPluginOptions('json', { other: { nested: '--overwritten--' } }); +// resulting options = { other: { nested: '--overwritten--' }, main: true } +// NOTE: nested2 is removed + +// merge via function +adjustPluginOptions('json', config => ({ other: { ...config.other, nested: '--overwritten--' } })); +// resulting options = { other: { nested: '--overwritten--', nested2: 'other.nested2' }, main: true } + +// merge via function to override full options +adjustPluginOptions('json', config => ({ only: 'this' })); +// resulting options = { only: 'this' } + +// setting a raw value +adjustPluginOptions('json', false); +// resulting options = false +``` + +## Converting metaPlugins to an actual plugin + +To execute all setup function you can use this little helper + +```js +const finalMetaPlugins = executeSetupFunctions(finalSetupFunctions, metaPlugins); +``` + +And then you can convert it into your format. +For Rollup you would execute the plugin with the options if there are any. + +```js +const plugins = finalMetaPlugins.map(pluginObj => { + if (pluginObj.options) { + return pluginObj.plugin(pluginObj.options); + } else { + return pluginObj.plugin(); + } +}); +``` + +**Examples** + +Rollup has a more specific helper + +```js +import { metaConfigToRollupConfig } from 'plugins-manager'; + +const finalConfig = metaConfigToRollupConfig(currentConfig, defaultMetaPlugins); +``` + +Web Dev Server has a more specific helper + +```js +import { metaConfigToWebDevServerConfig } from 'plugins-manager'; +import { fromRollup } from '@web/dev-server-rollup'; + +const finalConfig = metaConfigToWebDevServerConfig(currentConfig, defaultMetaPlugins, { + wrapperFunction: fromRollup, +}); +``` + +Eleventy + +```js +module.exports = eleventyConfig => { + for (const pluginObj of metaPlugins) { + if (pluginObj.options) { + eleventyConfig.addPlugin(pluginObj.plugin, pluginObj.options); + } else { + eleventyConfig.addPlugin(pluginObj.plugin); + } + } +}; +``` + +Unified/Remark + +```js +const parser = unified(); + +for (const pluginObj of metaPlugins) { + parser.use(pluginObj.plugin, pluginObj.options); +} +``` diff --git a/docs/docs/tools/rollup-config.md b/docs/docs/tools/rollup-config.md new file mode 100644 index 00000000..d79c9d51 --- /dev/null +++ b/docs/docs/tools/rollup-config.md @@ -0,0 +1,94 @@ +# Tools >> Rollup Config + +Rollup configuration to help you get started building modern web applications. +You write modern javascript using the latest browser-features, rollup will optimize your code for production and ensure it runs on all supported browsers. + +## Features + +- Set HTML or JS as input and/or output +- Optimized for browsers which support modules +- Loads polyfills using feature detection +- Generates a service worker +- Minifies JS +- Minifies lit-html templates + +## Setup + +1. Install dependencies + + ```bash + npm i -D rollup @rocket/building-rollup rollup @web/dev-server rimraf + ``` + +2. Create a `rollup.config.js` file: + + ```js + import { createSpaConfig } from '@rocket/building-rollup'; + // use `import { createBasicConfig }` to do regular JS to JS bundling + // use `import { createMpaConfig }` to bundle multiple html files + + export default createSpaConfig({ + input: 'index.html', + output: { + dir: 'dist', + }, + + // use all options from https://rollupjs.org/guide/en/#configuration-files + }); + ``` + +3. Add the following NPM scripts to your `package.json`: + + ```json + { + "scripts": { + "build": "rimraf dist && rollup -c rollup.config.js", + "start:build": "npm run build && web-dev-server --root-dir dist --app-index index.html --open" + } + } + ``` + +## Customizations + +Our config sets you up with good defaults for most projects. Additionally you can add more plugins and adjust predefined plugins or even remove them if needed. + +We use the [plugins-manager](../plugins-manager/overview.md) for it. + +### Customizing the babel config + +You can define custom babel plugins to be loaded by adding a `.babelrc` or `babel.config.js` to your project. See [babeljs config](https://babeljs.io/docs/en/configuration) for more information. + +For example to add support for class properties: + +```json +{ + "plugins": ["@babel/plugin-proposal-class-properties"] +} +``` + +### Customizing default plugins + +Our config creators install a number of rollup plugins by default: + +Basic, SPA and MPA plugins: + +- [node-resolve](https://github.com/rollup/plugins/tree/master/packages/node-resolve#readme) +- [terser](https://github.com/TrySound/rollup-plugin-terser#readme) + +SPA and MPA plugins: + +- [babel](https://github.com/rollup/plugins/tree/master/packages/babel#readme) +- [html](https://modern-web.dev/docs/building/rollup-plugin-html/) +- [import-meta-assets](https://modern-web.dev/docs/building/rollup-plugin-import-meta-assets/) +- [polyfills-loader](https://modern-web.dev/docs/building/rollup-plugin-polyfills-loader/) +- [workbox](https://www.npmjs.com/package/rollup-plugin-workbox) + +You can customize options for these plugins by using [adjustPluginOptions](../plugins-manager/overview.md#adjusting-plugin-options). + +```js +import { createSpaConfig } from '@rocket/building-rollup'; + +export default createSpaConfig({ + setupPlugins: [adjustPluginOptions('node-resolve', { dedupe: ['lit-html'] })], +}); +``` diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6fae6a618ddbe0d030064622da1548e2e4e4ac77 GIT binary patch literal 15086 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 XGX_t|TuNNGkMulw;p`ygqx}B>17|b@ literal 0 HcmV?d00001 diff --git a/docs/favicon.png b/docs/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..31dafa80c6ccf466101419c324b8fb60e30811fb GIT binary patch literal 3768 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 i*6Q0yyCH5pZT}C_RXNHsZZ?Jh0000> Getting Started ||10 + +The main config file is `rocket.config.js` or `rocket.config.mjs`. + +It typically looks something like this + +```js +import { rocketLaunch } from '@rocket/launch'; +import { rocketBlog } from '@rocket/blog'; +import { rocketSearch } from '@rocket/search'; +import { absoluteBaseUrlNetlify } from '@rocket/core/helpers'; + +export default /** @type {Partial} */ ({ + presets: [rocketLaunch(), rocketBlog(), rocketSearch()], + emptyOutputDir: false, + absoluteBaseUrl: absoluteBaseUrlNetlify('http://localhost:8080'), +}); +``` + +The Plugins Manager helps you register and execute your plugins across the various Rocket components - rollup, dev-server, eleventy, and markdown. It replaces the specific registration/execution call in a given plugin system by an intent to use that plugin. + +## Adding Remark/Unified Plugins + +If you want to a plugin to the markdown processing you can use `setupUnifiedPlugins`. + +```js +import emoji from 'remark-emoji'; +import { addPlugin } from 'plugins-manager'; + +/** @type {Partial} */ +const config = { + setupUnifiedPlugins: [addPlugin({ location: 'markdown', name: 'emoji', plugin: emoji })], +}; + +export default config; +``` + +For plugins that should handle the markdown AST you should use `addPlugin({ location: 'markdown', name: 'my-plugin', plugin: MyPlugin})`.
+While for the rehype ast you should use `addPlugin({ location: 'remark2rehype', name: 'my-plugin', plugin: MyPlugin})`. diff --git a/docs/guides/configuration/index.md b/docs/guides/configuration/index.md new file mode 100644 index 00000000..e615c690 --- /dev/null +++ b/docs/guides/configuration/index.md @@ -0,0 +1 @@ +# Configuration ||30 diff --git a/docs/guides/first-pages/adding-pages.md b/docs/guides/first-pages/adding-pages.md new file mode 100644 index 00000000..1ac82351 --- /dev/null +++ b/docs/guides/first-pages/adding-pages.md @@ -0,0 +1,85 @@ +# First Pages >> Adding Pages ||12 + + + +You can do this whole part of the tutorial in a couple minutes. It's almost _**too**_ fast. + +It can help to examine each new page and menu carefully, to come to terms with the implicit navigation created by your addition of new content, at least the first couple of times. + + + +## Add a section + +In most cases you will have multiple sections in your website and each of those sections will come with it's own sidebar navigation. + +To create a section you need to create a folder with an `index.md`. + +```bash +mkdir docs/guides +``` + +👉 `docs/guides/index.md` + +```md +# Guides + +You can read all about... +``` + +Observe that this creates a section named "Guides" at the top menu bar, and a page with the same title. + + + +Don't worry if this isn't how you would have styled or placed your menu bar or sidebar navigation, we'll get to customization of the default preset later in the tutorials. + + + +> How many sections should I add? + +It might be more practical to stay below 5 sections. + +## Adding a category + +Often each section will have multiple categories. + +To create a category you need to create a folder with an `index.md`. + +```bash +mkdir docs/guides/first-pages/ +``` + +👉 `docs/guides/first-pages/index.md` + +```md +# First Pages +``` + +## Adding a page to a category + +👉 `docs/guides/first-pages/getting-started.md` + +```md +# First Pages >> Getting Started + +This is how you get started. +``` + +## Headings as anchor and menu items + +_**Within**_ any page, you can still add links to your navigation! + +Note that md text prefixed with one or two # signs also becomes and anchor in the page and a link in the sidebar navigation when the page is open. + +```md +## Headings as anchor and menu items + +_**Within**_ any page, you can still add links to your navigation! +``` + +```js script +import '@rocket/launch/inline-notification/inline-notification.js'; +``` + +## Example as a reference + +If implicit navigation, derived from content, is a bit too much to grasp in one sitting, feel free to examine the **docs** folder in [the rocket codebase behind the pages you are reading](https://github.com/modernweb-dev/rocket) for more examples. diff --git a/docs/guides/first-pages/getting-started.md b/docs/guides/first-pages/getting-started.md new file mode 100644 index 00000000..c5f22a4a --- /dev/null +++ b/docs/guides/first-pages/getting-started.md @@ -0,0 +1,108 @@ +# First Pages >> Getting Started ||10 + +Rocket is has the following prerequisits: + +- [Node 14+](https://nodejs.org/en/) + +Make sure they are installed before proceeding. + +## Setup + +The fastest way to get started is by using an existing preset like the launch preset. + +1. Start with an empty new folder + + ``` + mkdir my-project + cd my-project + npm init -y + ``` + +2. Install dependencies + + ``` + npm install --save-dev @rocket/cli @rocket/launch + ``` + +3. Add to your .gitignore + + ``` + ## Rocket ignore files (need to be the full relative path to the folders) + docs/_merged_data/ + docs/_merged_assets/ + docs/_merged_includes/ + ``` + + + +You may be tempted to skip the step above, because you're not ready to commit to git yet! + +Rocket uses the .gitignore file to manage it's requirements. If you skip this step, rocket will fail to deploy! + + + +4. Create a `rocket.config.mjs` (or `.js` if you have type: "module" in you package.json) + + ```js + import { rocketLaunch } from '@rocket/launch'; + + export default { + presets: [rocketLaunch()], + }; + ``` + + + +All further pathes are relative to your project root (my-project in this case) + + + +## Add your first page + +👉 `docs/index.md` + +```md +# Welcome to your Rocket site + +Text here, like any markdown file. +``` + +This tutorial assumes you are familiar with Markdown, for page authoring. + +Please note that the heading - text prefixed with `#` or `##` - is not optional for each page in this tutorial. Everything below that first line is optional Markdown text. + +## Start up: + +👉 `package.json` + +Add `"start": "rocket start"` to your package.json + +```json +"scripts": { + "start": "rocket start" +} +``` + +Now you can launch your site locally with + +```bash +npm run start +``` + +## Taking Inventory Before Adding Pages: + +We're about to add both content and navigation at the same time. + +It can be helpful to take an inventory, before we start, to separate basic setup from the creation of content and navigation. + +- We built the project with basic npm commands +- Added a couple required files manually +- Adjusted package.json +- **doc/index.md** to seed the content +- Launches with `npm start` + +That's all it takes to get a new super-fast and powerful site, complete with a service worker, default styling, navigation, and ready to deploy as a plain old static files. + +```js script +import '@rocket/launch/inline-notification/inline-notification.js'; +``` diff --git a/docs/guides/first-pages/index.md b/docs/guides/first-pages/index.md new file mode 100644 index 00000000..dcb86a8a --- /dev/null +++ b/docs/guides/first-pages/index.md @@ -0,0 +1 @@ +# First Pages ||10 diff --git a/docs/guides/first-pages/link-to-other-pages.md b/docs/guides/first-pages/link-to-other-pages.md new file mode 100644 index 00000000..e6ca1c25 --- /dev/null +++ b/docs/guides/first-pages/link-to-other-pages.md @@ -0,0 +1,7 @@ +# First Pages >> Linking ||20 + +Standard markdown applies and you can link via + +```md +[visible label](./path/to/other-file.md) +``` diff --git a/docs/guides/first-pages/manage-sidebar.md b/docs/guides/first-pages/manage-sidebar.md new file mode 100644 index 00000000..a68c6e3b --- /dev/null +++ b/docs/guides/first-pages/manage-sidebar.md @@ -0,0 +1,49 @@ +# First Pages >> Managing sidebar ||30 + +The sidebar will show all the content of the current section. + +## Nesting Pages + +You nest by adding `>>` between parent and child. + +## Sorting Pages + +You can sort by adding `||xx` at the end. + +e.g. + +``` +# Second || 20 +# First || 10 +``` + +Will be ordered as `First`, `Second`, + +## How it works + +Internally `# Foo >> Bar >> Baz ||20` get's converted to. + +``` +--- +title: Bar: Baz +eleventyNavigation: + key: Foo >> Bar >> Baz + parent: Foo >> Bar + order: 20 +--- +``` + +You can also look at this live playground: + +```js story +import { html } from 'lit-html'; + +export const headlineConverter = () => html` +

+ TODO: I will become a web component that has an input and + out that live udpates +

+`; +``` + +How it then works is very similar to https://www.11ty.dev/docs/plugins/navigation/ diff --git a/docs/guides/first-pages/urls.md b/docs/guides/first-pages/urls.md new file mode 100644 index 00000000..b9265e4d --- /dev/null +++ b/docs/guides/first-pages/urls.md @@ -0,0 +1,5 @@ +# First Pages >> Urls ||100 + +Urls will be represented by the folder structure... + +You can use a frontmatter with permalink to override diff --git a/docs/guides/first-pages/use-javascript.md b/docs/guides/first-pages/use-javascript.md new file mode 100644 index 00000000..349581ba --- /dev/null +++ b/docs/guides/first-pages/use-javascript.md @@ -0,0 +1,25 @@ +# First Pages >> Use JavaScript ||40 + +You can use `js script` to execute javascript (type = module) + +```` +```js script +console.log('foo'); +``` +```` + +This can be useful for importing web components and using them in markdown + +```` +```js script +import 'magic-reveal/magic-reveal.js'; + + + +This text will get magically revealed. I can **still** use markdown as long as between the opening/closing tag there is an empty line. + + +``` +```` + +or you can use `js story`, `js preview-story`, ... diff --git a/docs/guides/go-live/index.md b/docs/guides/go-live/index.md new file mode 100644 index 00000000..3de85c4c --- /dev/null +++ b/docs/guides/go-live/index.md @@ -0,0 +1 @@ +# Go Live ||40 diff --git a/docs/guides/go-live/overview.md b/docs/guides/go-live/overview.md new file mode 100644 index 00000000..d51d0754 --- /dev/null +++ b/docs/guides/go-live/overview.md @@ -0,0 +1,51 @@ +# Go Live >> Overview + +A few things are usually needed before going live "for real". + +## Add a not found page + +When a user enters a url that does not exists then a "famous" 404 page not found error occures. +Many servers are configured to handle this automatically and to serve a 404.html page instead. + +The [Rocket Lauch Preset](../../docs/presets/launch.md) ships a default 404 template you can use. + +To enable it you need to creating a 404.md and use the 404 layout. + +👉 `docs/404.md` + +``` +--- +layout: 404.njk +permalink: 404.html +--- +``` + +## Add a sitemap + +A sitemap can be used to inform search engines or services about the pages your site has. + +You can create one by adding this file + +👉 `docs/sitemap.njk` + +{% raw %} + +``` +--- +layout: pure-content.njk +permalink: /sitemap.xml +eleventyExcludeFromCollections: true +--- + + + {% for page in collections.all %} + + {{ rocketConfig.absoluteBaseUrl }}{{ page.url | url }} + {{ page.date.toISOString() }} + {{ page.data.changeFreq if page.data.changeFreq else "monthly" }} + + {% endfor %} + +``` + +{% endraw %} diff --git a/docs/guides/index.md b/docs/guides/index.md new file mode 100644 index 00000000..3500ad52 --- /dev/null +++ b/docs/guides/index.md @@ -0,0 +1,9 @@ +--- +title: Learning Rocket +description: 'foo' +eleventyNavigation: + key: Guides + order: 10 +--- + +Rocket is a fundamentally straight forward way to generate static pages while still allowing to sprinkle in some JavaScript where needed. diff --git a/docs/guides/presets/create-your-own.md b/docs/guides/presets/create-your-own.md new file mode 100644 index 00000000..198096bf --- /dev/null +++ b/docs/guides/presets/create-your-own.md @@ -0,0 +1,7 @@ +# Presets >> Create your own || 90 + +All loaded presets will be combined but you can override each file. + +Take a look at `docs/_merged_includes` and override what you want to override by placing the same filename into `_includes`. + +Also works for `_assets`, `_data` ... diff --git a/docs/guides/presets/getting-started.md b/docs/guides/presets/getting-started.md new file mode 100644 index 00000000..f2841c00 --- /dev/null +++ b/docs/guides/presets/getting-started.md @@ -0,0 +1,7 @@ +# Presets >> Getting Started ||10 + +Presets are ... + +You can use a preset via the config... + +You can load multiple presets. diff --git a/docs/guides/presets/index.md b/docs/guides/presets/index.md new file mode 100644 index 00000000..d387f3af --- /dev/null +++ b/docs/guides/presets/index.md @@ -0,0 +1 @@ +# Presets || 20 diff --git a/docs/guides/presets/overriding-themes.md b/docs/guides/presets/overriding-themes.md new file mode 100644 index 00000000..c5a471e1 --- /dev/null +++ b/docs/guides/presets/overriding-themes.md @@ -0,0 +1,7 @@ +# Presets >> Overriding presets ||20 + +All loaded presets will be combined but you can override each file. + +Take a look at `docs/_merged_includes` and override what you want to override by placing the same filename into `_includes`. + +Also works for `_assets`, `_data` ... diff --git a/docs/guides/presets/using-theme-templates.md b/docs/guides/presets/using-theme-templates.md new file mode 100644 index 00000000..a160ed10 --- /dev/null +++ b/docs/guides/presets/using-theme-templates.md @@ -0,0 +1,3 @@ +# Presets >> Using preset templates ||30 + +Most presetse have specific entry files you can override... diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..803f949d --- /dev/null +++ b/docs/index.md @@ -0,0 +1,24 @@ +--- +title: Rocket +layout: home.njk +slogan: The modern web setup for static sites with a sprinkle of JavaScript. +callToActionItems: + - text: Follow Guides + href: /guides/ + - text: Browse Docs + href: /docs/ +reasonHeader: Why Rocket? +reasons: + - header: Small + text: No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed. + - header: Pre-Rendered + text: Statically generated content means less javascript to ship and process. + - header: Zero Configuration + text: Automatic code splitting, filesystem based routing, and javascript in markdown. + - header: Meta Framework + text: 'Build on top of giants like
eleventy, Rollup, and Modern Web.' + - header: Powerful Default Template + text: Provide content and you are ready to go. + - header: Ready for Production + text: Optimized for a smaller build size, faster dev compilation and dozens of other improvements. +--- diff --git a/docs/sitemap.njk b/docs/sitemap.njk new file mode 100644 index 00000000..e5c26f1b --- /dev/null +++ b/docs/sitemap.njk @@ -0,0 +1,15 @@ +--- +layout: pure-content.njk +permalink: /sitemap.xml +eleventyExcludeFromCollections: true +--- + + + {% for page in collections.all %} + + {{ rocketConfig.absoluteBaseUrl }}{{ page.url | url }} + {{ page.date.toISOString() }} + {{ page.data.changeFreq if page.data.changeFreq else "monthly" }} + + {% endfor %} + diff --git a/package.json b/package.json new file mode 100644 index 00000000..2bc553ac --- /dev/null +++ b/package.json @@ -0,0 +1,130 @@ +{ + "name": "@rocket/root", + "private": true, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/rocket.git" + }, + "type": "module", + "scripts": { + "build": "npm run build:packages && npm run build:site", + "build:packages": "node scripts/workspaces-scripts-bin.mjs build:package", + "build:site": "npm run rocket:build", + "changeset": "changeset", + "debug": "web-test-runner --watch --config web-test-runner-chrome.config.mjs", + "debug:firefox": "web-test-runner --watch --config web-test-runner-firefox.config.mjs", + "debug:webkit": "web-test-runner --watch --config web-test-runner-webkit.config.mjs", + "format": "npm run format:eslint && npm run format:prettier", + "format:eslint": "eslint --ext .ts,.js,.mjs,.cjs . --fix", + "format:prettier": "node node_modules/prettier/bin-prettier.js \"**/*.{ts,js,mjs,cjs,md}\" \"**/package.json\" --write --ignore-path .eslintignore", + "lint": "run-p lint:*", + "lint:eslint": "eslint --ext .ts,.js,.mjs,.cjs .", + "lint:prettier": "node node_modules/prettier/bin-prettier.js \"**/*.{ts,js,mjs,cjs,md}\" --check --ignore-path .eslintignore", + "lint:types": "npm run types", + "lint:versions": "node scripts/lint-versions.js", + "postinstall": "npm run setup", + "release": "changeset publish && yarn format", + "rocket:build": "node packages/cli/src/cli.js build", + "search": "node packages/cli/src/cli.js search", + "setup": "npm run setup:ts-configs", + "setup:ts-configs": "node scripts/generate-ts-configs.mjs", + "start": "node packages/cli/src/cli.js start", + "test": "yarn test:node && yarn test:web", + "test:node": "mocha \"packages/*/test-node/**/*.test.{ts,js,mjs,cjs}\" --timeout 5000 --reporter dot --exit", + "test:web": "web-test-runner", + "types": "run-s types:clear types:copy types:build", + "types:build": "tsc --build", + "types:clear": "rimraf packages/*/dist-types/", + "types:copy": "node scripts/workspaces-scripts-bin.mjs types:copy", + "update-dependency": "node scripts/update-dependency.js", + "update-esm-entrypoints": "node scripts/update-esm-entrypoints.mjs && yarn format", + "update-package-configs": "node scripts/update-package-configs.mjs && yarn format" + }, + "devDependencies": { + "@changesets/cli": "^2.12.0", + "@open-wc/testing": "^2.5.32", + "@rollup/plugin-commonjs": "^17.0.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-typescript": "^8.1.0", + "@types/chai": "^4.2.14", + "@types/fs-extra": "^9.0.6", + "@types/mocha": "^8.2.0", + "@types/node": "^14.14.16", + "@types/sinon": "^9.0.10", + "@typescript-eslint/eslint-plugin": "^4.11.1", + "@typescript-eslint/parser": "^4.11.1", + "@web/test-runner": "^0.11.5", + "@web/test-runner-commands": "^0.3.0", + "@web/test-runner-playwright": "^0.7.0", + "chai": "^4.2.0", + "concurrently": "^5.3.0", + "copyfiles": "^2.4.1", + "deepmerge": "^4.2.2", + "esbuild": "^0.8.26", + "eslint": "^7.16.0", + "eslint-config-prettier": "^7.1.0", + "hanbi": "^0.4.1", + "husky": "^4.3.6", + "lint-staged": "^10.5.3", + "mocha": "^8.2.1", + "node-fetch": "^2.6.1", + "npm-run-all": "^4.1.5", + "onchange": "^7.1.0", + "prettier": "^2.2.1", + "prettier-plugin-package": "^1.3.0", + "puppeteer": "^5.5.0", + "remark-emoji": "^2.1.0", + "rimraf": "^3.0.2", + "rollup": "^2.35.1", + "rollup-plugin-terser": "^7.0.2", + "sinon": "^9.2.2", + "ts-node": "^9.1.1", + "typescript": "^4.1.3" + }, + "eslintConfig": { + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "eslint-config-prettier", + "plugin:@typescript-eslint/recommended" + ], + "env": { + "browser": true, + "node": true, + "mocha": true, + "es2020": true + }, + "rules": { + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-var-requires": "off" + } + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.js": [ + "eslint --fix", + "prettier --write --ignore-path .eslintignore" + ] + }, + "prettier": { + "singleQuote": true, + "arrowParens": "avoid", + "printWidth": 100, + "trailingComma": "all" + }, + "workspaces": [ + "packages/*" + ] +} diff --git a/packages/blog/README.md b/packages/blog/README.md new file mode 100644 index 00000000..27b92a8a --- /dev/null +++ b/packages/blog/README.md @@ -0,0 +1,5 @@ +# Blog Preset for Rocket + +Add blog posts to your rocket site. + +For docs please see our homepage [https://rocket.modern-web.dev/docs/presets/blog/](https://rocket.modern-web.dev/docs/presets/blog/). diff --git a/packages/blog/index.js b/packages/blog/index.js new file mode 100644 index 00000000..55807996 --- /dev/null +++ b/packages/blog/index.js @@ -0,0 +1 @@ +export { rocketBlog } from './preset/rocketBlog.js'; diff --git a/packages/blog/package.json b/packages/blog/package.json new file mode 100644 index 00000000..7b12ba48 --- /dev/null +++ b/packages/blog/package.json @@ -0,0 +1,43 @@ +{ + "name": "@rocket/blog", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "description": "Blog for Rocket", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/rocket.git", + "directory": "packages/blog" + }, + "author": "Modern Web (https://modern-web.dev/)", + "homepage": "https://rocket.modern-web.dev/docs/presets/blog/", + "main": "index.js", + "type": "module", + "exports": { + ".": "./index.js", + "./preset/": "./preset/" + }, + "scripts": { + "dev": "web-dev-server --node-resolve --root-dir ../../ --open packages/drawer/ --watch", + "rocket:build": "node src/build/cli.js -c demo/docs", + "rocket:start": "node src/start/cli.js -c demo/docs --root-dir ../../ --open packages/cli/demo/docs/README.md", + "start": "npm run rocket:start", + "test": "mocha test-node/**/*.test.js test-node/*.test.js", + "test:watch": "mocha test-node/**/*.test.js test-node/*.test.js --watch" + }, + "files": [ + "*.js", + "preset" + ], + "keywords": [ + "storybook", + "demo", + "demo-states", + "testing" + ], + "dependencies": { + "plugins-manager": "^0.1.0" + } +} diff --git a/packages/blog/preset/_assets/blog.css b/packages/blog/preset/_assets/blog.css new file mode 100644 index 00000000..cca46a96 --- /dev/null +++ b/packages/blog/preset/_assets/blog.css @@ -0,0 +1,55 @@ +/** BLOG OVERVIEW **************************************************************************/ + +body[layout='blog-details'] rocket-navigation > ul > li.current::before { + display: none; +} + +body[layout='blog-details'] #sidebar-nav li.anchor a:hover::before { + display: none; +} + +.articles { + display: flex; + justify-content: center; + align-items: center; + padding-top: 40px; + + /* css flexbox gap workaround https://coryrylan.com/blog/css-gap-space-with-flexbox */ + --gap: 60px; + display: inline-flex; + flex-wrap: wrap; + margin: calc(-1 * var(--gap)) 0 0 calc(-1 * var(--gap)); + width: calc(100% + var(--gap)); +} + +.articles article { + flex: 0 1 360px; + margin: var(--gap) 0 0 var(--gap); + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); + transition: 0.3s; +} + +.articles article h2 { + margin: 0; + border: none; +} + +.articles article .read { + display: block; + text-align: right; +} + +.articles article .content { + padding: 10px; +} + +.articles article:hover { + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2); +} + +@media screen and (min-width: 1024px) { + body[layout='blog-details'] #sidebar { + display: block; + } +} + diff --git a/packages/blog/preset/_includes/blog-details.njk b/packages/blog/preset/_includes/blog-details.njk new file mode 100644 index 00000000..76ba58c3 --- /dev/null +++ b/packages/blog/preset/_includes/blog-details.njk @@ -0,0 +1,57 @@ +{% extends 'with-index.njk' %} + +{% block headContent %} + {{ super() }} + +{% endblock %} + +{% block bodyTag %} + +{% endblock bodyTag %} + +{% block sidebar %} + + + +{% endblock sidebar %} + +{% block main %} +
+ {% if cover_image %} + + {% endif %} + {% include 'partials/addTitleHeadline.njk' %} + + {{ content.html | safe }} + + {% include 'partials/previousNext.njk' %} + {% include 'partials/blog-content-footer.njk' %} +
+{% endblock main %} diff --git a/packages/blog/preset/_includes/blog-overview.njk b/packages/blog/preset/_includes/blog-overview.njk new file mode 100644 index 00000000..aa9aee6f --- /dev/null +++ b/packages/blog/preset/_includes/blog-overview.njk @@ -0,0 +1,37 @@ +{% extends 'home.njk' %} + +{% block headContent %} + {{ super() }} + +{% endblock %} + +{% block bodyTag %} + +{% endblock bodyTag %} + +{% block main %} +
+ {% include 'partials/addTitleHeadline.njk' %} + {{ content.html | safe }} +
+ {% for post in posts %} + {% if post.data.published %} + + {% endif %} + {% endfor %} +
+
+{% endblock main %} diff --git a/packages/blog/preset/_includes/partials/blog-content-footer.njk b/packages/blog/preset/_includes/partials/blog-content-footer.njk new file mode 100644 index 00000000..3b395fc2 --- /dev/null +++ b/packages/blog/preset/_includes/partials/blog-content-footer.njk @@ -0,0 +1,6 @@ + diff --git a/packages/blog/preset/rocketBlog.js b/packages/blog/preset/rocketBlog.js new file mode 100644 index 00000000..a0069c57 --- /dev/null +++ b/packages/blog/preset/rocketBlog.js @@ -0,0 +1,55 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; +import { addPlugin } from 'plugins-manager'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const SECTION = 'blog'; +const POST_COLLECTION = 'posts'; + +export function rocketBlog({ section = SECTION, postCollection = POST_COLLECTION } = {}) { + const isHiddenCollection = item => ['-', '_'].includes(item.charAt(0)); + const isVisibleCollection = item => !isHiddenCollection(item); + const isNotPostCollection = collection => collection !== postCollection; + + const eleventyPluginRocketBlog = { + configFunction: eleventyConfig => { + eleventyConfig.addLayoutAlias('blog', 'blog-overview.njk'); + eleventyConfig.addLayoutAlias('post', 'blog-details.njk'); + + eleventyConfig.addCollection('posts', collection => { + /* + // It's not working beacuse it's a paginated collection. + const headerDocs = eleventyConfig.collections.header(collection); + headerDocs.filter(page => page.data.section === section).forEach(page => { + page.data.layout = 'blog'; + }); + */ + if (section === postCollection) { + throw new Error("Rocket blog: section and postCollection couldn't be equal"); + } + if (!eleventyConfig.collections[section]) { + const collectionKeys = Object.keys(eleventyConfig.collections); + const availableCollections = collectionKeys + .filter(isVisibleCollection) + .filter(isNotPostCollection); + throw new Error( + `Rocket blog: Collection '${section}' not found. Aviable colections: ${availableCollections.join( + ', ', + )}`, + ); + } + + const posts = eleventyConfig.collections[section](collection); + posts.forEach(page => { + page.data.layout = 'post'; + }); + return posts; + }); + }, + }; + + return { + path: path.resolve(__dirname), + setupEleventyPlugins: [addPlugin({ name: 'rocket-blog', plugin: eleventyPluginRocketBlog })], + }; +} diff --git a/packages/building-rollup/README.md b/packages/building-rollup/README.md new file mode 100644 index 00000000..520d7e66 --- /dev/null +++ b/packages/building-rollup/README.md @@ -0,0 +1,6 @@ +# Building Rollup + +Rollup configuration to help you get started building modern web applications. +You write modern javascript using the latest browser-features, rollup will optimize your code for production and ensure it runs on all supported browsers. + +For docs please see our homepage [https://rocket.modern-web.dev/docs/building/rollup-config/](https://rocket.modern-web.dev/docs/building/rollup-config/). diff --git a/packages/building-rollup/demo/babelrc/.babelrc b/packages/building-rollup/demo/babelrc/.babelrc new file mode 100644 index 00000000..fdd8651f --- /dev/null +++ b/packages/building-rollup/demo/babelrc/.babelrc @@ -0,0 +1,3 @@ +{ + "plugins": ["@babel/plugin-proposal-class-properties"] +} \ No newline at end of file diff --git a/packages/building-rollup/demo/babelrc/app.js b/packages/building-rollup/demo/babelrc/app.js new file mode 100644 index 00000000..a90e2fa4 --- /dev/null +++ b/packages/building-rollup/demo/babelrc/app.js @@ -0,0 +1,19 @@ +class Foo { + static bar = 'bar'; + static getBar() { + return this.bar; + } + #foo = 'foo'; + + getFoo() { + return this.#foo; + } + + getBar() { + return Foo.getBar(); + } +} + +const foo = new Foo(); + +console.log(`${foo.getFoo()} ${foo.getBar()}`); diff --git a/packages/building-rollup/demo/babelrc/index.html b/packages/building-rollup/demo/babelrc/index.html new file mode 100644 index 00000000..e3d36806 --- /dev/null +++ b/packages/building-rollup/demo/babelrc/index.html @@ -0,0 +1,14 @@ + + + + + + + + My Demo + + + + + + diff --git a/packages/building-rollup/demo/babelrc/rollup.config.js b/packages/building-rollup/demo/babelrc/rollup.config.js new file mode 100644 index 00000000..a4387a92 --- /dev/null +++ b/packages/building-rollup/demo/babelrc/rollup.config.js @@ -0,0 +1,10 @@ +const merge = require('deepmerge'); +const { createSpaConfig } = require('../../index.js'); + +const baseConfig = createSpaConfig({ + developmentMode: false, +}); + +module.exports = merge(baseConfig, { + input: 'demo/babelrc/index.html', +}); diff --git a/packages/building-rollup/demo/cjs/commonjs-module.js b/packages/building-rollup/demo/cjs/commonjs-module.js new file mode 100644 index 00000000..0373c8dc --- /dev/null +++ b/packages/building-rollup/demo/cjs/commonjs-module.js @@ -0,0 +1,3 @@ +module.exports = { + message: 'CommonJS plugin works', +}; diff --git a/packages/building-rollup/demo/cjs/demo-app.js b/packages/building-rollup/demo/cjs/demo-app.js new file mode 100644 index 00000000..72717114 --- /dev/null +++ b/packages/building-rollup/demo/cjs/demo-app.js @@ -0,0 +1,10 @@ +import { LitElement, html } from 'lit-element'; +import { message } from './commonjs-module.js'; + +class DemoApp extends LitElement { + render() { + return html` ${message} `; + } +} + +customElements.define('demo-app', DemoApp); diff --git a/packages/building-rollup/demo/cjs/index.html b/packages/building-rollup/demo/cjs/index.html new file mode 100644 index 00000000..478fe8bc --- /dev/null +++ b/packages/building-rollup/demo/cjs/index.html @@ -0,0 +1,15 @@ + + + + + + + + My Demo + + + + + + + diff --git a/packages/building-rollup/demo/cjs/rollup.spa.config.js b/packages/building-rollup/demo/cjs/rollup.spa.config.js new file mode 100644 index 00000000..32b62714 --- /dev/null +++ b/packages/building-rollup/demo/cjs/rollup.spa.config.js @@ -0,0 +1,14 @@ +const merge = require('deepmerge'); +const commonjs = require('@rollup/plugin-commonjs'); +const { createSpaConfig } = require('../../index.js'); + +const baseConfig = createSpaConfig({ + developmentMode: false, + injectServiceWorker: false, + legacyBuild: true, +}); + +module.exports = merge(baseConfig, { + input: 'demo/cjs/index.html', + plugins: [commonjs()], +}); diff --git a/packages/building-rollup/demo/js/demo-app.js b/packages/building-rollup/demo/js/demo-app.js new file mode 100644 index 00000000..de4aa9aa --- /dev/null +++ b/packages/building-rollup/demo/js/demo-app.js @@ -0,0 +1,115 @@ +/* eslint-disable */ +import { LitElement, html, css } from 'lit-element'; +import './demo-component.js'; + +// partial css trips up the minifier +const fontSize = css` + 16 +`; + +const fontMd = css` + font-size: ${fontSize}px; +`; + +class DemoApp extends LitElement { + static get styles() { + return css` + :host { + display: block; + color: black; + background-color: white; + ${fontMd} + } + `; + } + + render() { + return html` +

Demo app

+ + + `; + } +} + +customElements.define('demo-app', DemoApp); + +const stylesToBeMinified = css` + .foo { + color: 16px; + } +`; + +const partialCSS = DemoApp.styles.cssText.replace(/\s/g, ''); +const foo = { bar: 'lorem ipsum' }; +const loremIpsum = undefined; + +async function asyncFunction() { + await new Promise(resolve => setTimeout(resolve, 1)); + return true; +} + +async function asyncFunction2() { + return 'x'; +} + +console.log(asyncFunction2); + +function forOf() { + const map = new Map(); + map.set('a', 1); + map.set('2', 2); + let total = 0; + for (const [k, v] of map) { + total += v; + } + return total; +} + +const myAsyncIterable = { + async *[Symbol.asyncIterator]() { + yield 1; + yield 2; + yield 3; + }, +}; +function getAsyncIterated() { + return new Promise(async resolve => { + let total = 0; + for await (const x of myAsyncIterable) { + total += x; + } + resolve(total); + }); +} + +window.__startsWith = 'foo'.startsWith('fo'); +window.__map = new Map().set('foo', 'bar').get('foo') === 'bar'; +window.__asyncFunction = asyncFunction(); +window.__forOf = forOf() === 3; +window.__optionalChaining = foo?.bar === 'lorem ipsum' && foo?.bar?.loremIpsum === undefined; +window.__nullishCoalescing = (loremIpsum ?? 'lorem ipsum') === 'lorem ipsum'; +window.__asyncIterator = getAsyncIterated().then(r => r === 6); +window.__partialCSS = partialCSS.includes('font-size:16px') && partialCSS.includes('display:block'); +window.__minifiedCSS = stylesToBeMinified.cssText === ''; +window.__litElement = (async () => { + await import('./lazy-component.js'); + await customElements.whenDefined('demo-app'); + await customElements.whenDefined('demo-component'); + await customElements.whenDefined('lazy-component'); + + const app = document.body.querySelector('demo-app'); + await app.updateComplete; + + const demoComponent = app.shadowRoot.querySelector('demo-component'); + await demoComponent.updateComplete; + + const lazyComponent = app.shadowRoot.querySelector('lazy-component'); + await lazyComponent.updateComplete; + + return ( + app.shadowRoot.innerHTML.includes('Demo app

') && + demoComponent.shadowRoot.innerHTML.includes('Demo component

') && + lazyComponent.shadowRoot.innerHTML.includes('Lazy component

') + ); +})(); diff --git a/packages/building-rollup/demo/js/demo-component.js b/packages/building-rollup/demo/js/demo-component.js new file mode 100644 index 00000000..97bfdc6a --- /dev/null +++ b/packages/building-rollup/demo/js/demo-component.js @@ -0,0 +1,18 @@ +/* eslint-disable class-methods-use-this, import/no-extraneous-dependencies */ +import { LitElement, html, css } from 'lit-element'; + +class DemoComponent extends LitElement { + static get styles() { + return css` + p { + color: blue; + } + `; + } + + render() { + return html`

Demo component

`; + } +} + +customElements.define('demo-component', DemoComponent); diff --git a/packages/building-rollup/demo/js/index.html b/packages/building-rollup/demo/js/index.html new file mode 100644 index 00000000..22a76ab8 --- /dev/null +++ b/packages/building-rollup/demo/js/index.html @@ -0,0 +1,51 @@ + + + + + + + + My Demo + + + +

Static content in index.html is preserved

+ + + +
+ + + + diff --git a/packages/building-rollup/demo/js/lazy-component.js b/packages/building-rollup/demo/js/lazy-component.js new file mode 100644 index 00000000..25eff371 --- /dev/null +++ b/packages/building-rollup/demo/js/lazy-component.js @@ -0,0 +1,17 @@ +import { LitElement, html, css } from 'lit-element'; + +class LazyComponent extends LitElement { + static get styles() { + return css` + p { + color: red; + } + `; + } + + render() { + return html`

Lazy component

`; + } +} + +customElements.define('lazy-component', LazyComponent); diff --git a/packages/building-rollup/demo/js/rollup.basic.config.js b/packages/building-rollup/demo/js/rollup.basic.config.js new file mode 100644 index 00000000..c5cc113e --- /dev/null +++ b/packages/building-rollup/demo/js/rollup.basic.config.js @@ -0,0 +1,5 @@ +import { createBasicConfig } from '../../index.js'; + +export default createBasicConfig({ + input: './demo/js/demo-app.js', +}); diff --git a/packages/building-rollup/demo/js/rollup.spa-js-input.config.js b/packages/building-rollup/demo/js/rollup.spa-js-input.config.js new file mode 100644 index 00000000..eef5a537 --- /dev/null +++ b/packages/building-rollup/demo/js/rollup.spa-js-input.config.js @@ -0,0 +1,14 @@ +const merge = require('deepmerge'); +const { createSpaConfig } = require('../../index.js'); + +const baseConfig = createSpaConfig({ + developmentMode: false, + injectServiceWorker: true, + workbox: { + swDest: './dist/foo.js', + }, +}); + +module.exports = merge(baseConfig, { + input: './demo/js/demo-app.js', +}); diff --git a/packages/building-rollup/demo/js/rollup.spa-nomodule.config.js b/packages/building-rollup/demo/js/rollup.spa-nomodule.config.js new file mode 100644 index 00000000..6d53d69e --- /dev/null +++ b/packages/building-rollup/demo/js/rollup.spa-nomodule.config.js @@ -0,0 +1,14 @@ +const merge = require('deepmerge'); +const path = require('path'); +const { createSpaConfig } = require('../../index.js'); + +const baseConfig = createSpaConfig({ + developmentMode: false, + injectServiceWorker: true, + legacyBuild: true, + outputDir: path.join(__dirname, '..', '..', 'dist'), +}); + +module.exports = merge(baseConfig, { + input: require.resolve('./index.html'), +}); diff --git a/packages/building-rollup/demo/js/rollup.spa.config.mjs b/packages/building-rollup/demo/js/rollup.spa.config.mjs new file mode 100644 index 00000000..b46b8cec --- /dev/null +++ b/packages/building-rollup/demo/js/rollup.spa.config.mjs @@ -0,0 +1,15 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; +import { createSpaConfig } from '../../index.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const config = createSpaConfig({ + developmentMode: false, + input: path.join(__dirname, 'index.html'), + output: { + dir: path.join(__dirname, '..', '..', 'dist'), + } +}); + +export default config; diff --git a/packages/building-rollup/demo/modify-babel-plugin/demo-app.js b/packages/building-rollup/demo/modify-babel-plugin/demo-app.js new file mode 100644 index 00000000..f6be1cbd --- /dev/null +++ b/packages/building-rollup/demo/modify-babel-plugin/demo-app.js @@ -0,0 +1,12 @@ +import { LitElement, html } from 'lit-element'; + +class DemoApp extends LitElement { + render() { + return html` + + + `; + } +} + +customElements.define('demo-app', DemoApp); diff --git a/packages/building-rollup/demo/modify-babel-plugin/index.html b/packages/building-rollup/demo/modify-babel-plugin/index.html new file mode 100644 index 00000000..478fe8bc --- /dev/null +++ b/packages/building-rollup/demo/modify-babel-plugin/index.html @@ -0,0 +1,15 @@ + + + + + + + + My Demo + + + + + + + diff --git a/packages/building-rollup/demo/modify-babel-plugin/rollup.config.js b/packages/building-rollup/demo/modify-babel-plugin/rollup.config.js new file mode 100644 index 00000000..519e47c6 --- /dev/null +++ b/packages/building-rollup/demo/modify-babel-plugin/rollup.config.js @@ -0,0 +1,28 @@ +const merge = require('deepmerge'); +const { createSpaConfig } = require('../../index.js'); + +const baseConfig = createSpaConfig({ + developmentMode: false, + injectServiceWorker: false, + legacyBuild: false, + babel: { + plugins: [ + [ + 'babel-plugin-template-html-minifier', + { + modules: { + 'lit-html': ['html'], + 'lit-element': ['html', { name: 'css', encapsulation: 'style' }], + }, + htmlMinifier: { + removeComments: false, + }, + }, + ], + ], + }, +}); + +module.exports = merge(baseConfig, { + input: 'demo/modify-babel-plugin/index.html', +}); diff --git a/packages/building-rollup/demo/ts/demo-app.ts b/packages/building-rollup/demo/ts/demo-app.ts new file mode 100644 index 00000000..7822c863 --- /dev/null +++ b/packages/building-rollup/demo/ts/demo-app.ts @@ -0,0 +1,12 @@ +import { LitElement, html, customElement } from 'lit-element'; + +const msg: string = 'Typescript demo works'; + +@customElement('demo-app') +class DemoApp extends LitElement { + render() { + return html` + ${msg} + `; + } +} diff --git a/packages/building-rollup/demo/ts/index.html b/packages/building-rollup/demo/ts/index.html new file mode 100644 index 00000000..fd9c3173 --- /dev/null +++ b/packages/building-rollup/demo/ts/index.html @@ -0,0 +1,15 @@ + + + + + + + + My Demo + + + + + + + diff --git a/packages/building-rollup/demo/ts/rollup.spa.config.js b/packages/building-rollup/demo/ts/rollup.spa.config.js new file mode 100644 index 00000000..7238ea9a --- /dev/null +++ b/packages/building-rollup/demo/ts/rollup.spa.config.js @@ -0,0 +1,14 @@ +const merge = require('deepmerge'); +const typescript = require('@rollup/plugin-typescript'); +const { createSpaConfig } = require('../../index.js'); + +const baseConfig = createSpaConfig({ + developmentMode: false, + injectServiceWorker: false, + legacyBuild: true, +}); + +module.exports = merge(baseConfig, { + input: 'demo/ts/index.html', + plugins: [typescript({ experimentalDecorators: true, target: 'es2019' })], +}); diff --git a/packages/building-rollup/index.js b/packages/building-rollup/index.js new file mode 100644 index 00000000..fb4ec0aa --- /dev/null +++ b/packages/building-rollup/index.js @@ -0,0 +1,8 @@ +// /** +// * @typedef {import('./src/types').BasicOptions} BasicOptions +// * @typedef {import('./src/types').SpaOptions} SpaOptions +// */ + +export { createBasicConfig, createBasicMetaConfig } from './src/createBasicConfig.js'; +export { createSpaConfig, createSpaMetaConfig } from './src/createSpaConfig.js'; +export { createMpaConfig, createMpaMetaConfig } from './src/createMpaConfig.js'; diff --git a/packages/building-rollup/package.json b/packages/building-rollup/package.json new file mode 100644 index 00000000..e7bcbb32 --- /dev/null +++ b/packages/building-rollup/package.json @@ -0,0 +1,64 @@ +{ + "name": "@rocket/building-rollup", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "description": "Default configuration for working with rollup", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/rocket.git", + "directory": "packages/building-rollup" + }, + "author": "Modern Web (https://modern-web.dev/)", + "homepage": "https://rocket.modern-web.dev/docs/tools/building-rollup/", + "type": "module", + "exports": { + ".": "./index.js" + }, + "scripts": { + "build:babelrc": "rimraf dist && rollup -c demo/babelrc/rollup.config.js", + "build:basic": "rimraf dist && rollup -c demo/js/rollup.basic.config.js", + "build:cjs": "rimraf dist && rollup -c demo/cjs/rollup.spa.config.js", + "build:modify-babel-plugin": "rimraf dist && rollup -c demo/modify-babel-plugin/rollup.config.js", + "build:spa": "rimraf dist && rollup -c demo/js/rollup.spa.config.mjs", + "build:spa-js-input": "rimraf dist && rollup -c demo/js/rollup.spa-js-input.config.js", + "build:spa-nomodule": "rimraf dist && rollup -c demo/js/rollup.spa-nomodule.config.js", + "build:ts": "rimraf dist && rollup -c demo/ts/rollup.spa.config.js", + "start:babelrc": "npm run build:babelrc && npm run start:build", + "start:build": "web-dev-server --root-dir dist --compatibility none --open", + "start:cjs": "npm run build:cjs && npm run start:build", + "start:demo": "web-dev-server --app-index demo/js/index.html --open --compatibility none", + "start:modify-babel-plugin": "npm run build:modify-babel-plugin && npm run start:build", + "start:spa": "npm run build:spa && npm run start:build", + "start:spa-js-input": "npm run build:spa-js-input && npm run start:build", + "start:spa-nomodule": "npm run build:spa-nomodule && npm run start:build", + "start:ts": "npm run build:ts && npm run start:build", + "start:watch": "npm run build:spa-nomodule -- --watch & npm run start:build", + "test": "npm run test:node", + "test:node": "mocha test-node/**/*.test.js --timeout 5000" + }, + "files": [ + "*.js", + "src" + ], + "keywords": [ + "rollup" + ], + "peerDependencies": { + "rollup": "^2.35.0" + }, + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/preset-env": "^7.12.11", + "@rollup/plugin-babel": "^5.2.2", + "@rollup/plugin-node-resolve": "^11.0.1", + "@web/rollup-plugin-html": "^1.3.3", + "@web/rollup-plugin-import-meta-assets": "^1.0.4", + "@web/rollup-plugin-polyfills-loader": "^1.0.3", + "browserslist": "^4.16.0", + "rollup-plugin-terser": "^7.0.2", + "rollup-plugin-workbox": "^6.1.0" + } +} diff --git a/packages/building-rollup/src/createBasicConfig.js b/packages/building-rollup/src/createBasicConfig.js new file mode 100644 index 00000000..055706ee --- /dev/null +++ b/packages/building-rollup/src/createBasicConfig.js @@ -0,0 +1,82 @@ +import resolve from '@rollup/plugin-node-resolve'; +import { terser } from 'rollup-plugin-terser'; +import babelPkg from '@rollup/plugin-babel'; + +import { metaConfigToRollupConfig } from 'plugins-manager'; + +const { babel } = babelPkg; + +export function createBasicConfig(userConfig) { + const { config, metaPlugins } = createBasicMetaConfig(userConfig); + return metaConfigToRollupConfig(config, metaPlugins); +} + +export function createBasicMetaConfig(userConfig = { output: {} }) { + const developmentMode = + typeof userConfig.developmentMode !== undefined + ? userConfig.developmentMode + : !!process.env.ROLLUP_WATCH; + delete userConfig.developmentMode; + + const fileName = `[${developmentMode ? 'name' : 'hash'}].js`; + const assetName = `[${developmentMode ? 'name' : 'hash'}][extname]`; + + const config = { + preserveEntrySignatures: false, + treeshake: !developmentMode, + setupPlugins: [], + ...userConfig, + + output: { + entryFileNames: fileName, + chunkFileNames: fileName, + assetFileNames: assetName, + format: 'es', + dir: 'dist', + ...userConfig.output, + }, + }; + + let metaPlugins = [ + { + name: 'node-resolve', + plugin: resolve, + options: { + moduleDirectories: ['node_modules', 'web_modules'], + }, + }, + { + name: 'babel', + plugin: babel, + options: { + babelHelpers: 'bundled', + compact: true, + presets: [ + [ + '@babel/preset-env', + { + targets: [ + 'last 3 Chrome major versions', + 'last 3 ChromeAndroid major versions', + 'last 3 Firefox major versions', + 'last 3 Edge major versions', + 'last 3 Safari major versions', + 'last 3 iOS major versions', + ], + useBuiltIns: false, + shippedProposals: true, + modules: false, + bugfixes: true, + }, + ], + ], + }, + }, + { + name: 'terser', + plugin: terser, + }, + ]; + + return { config, metaPlugins, developmentMode }; +} diff --git a/packages/building-rollup/src/createMpaConfig.js b/packages/building-rollup/src/createMpaConfig.js new file mode 100644 index 00000000..5e95a9f4 --- /dev/null +++ b/packages/building-rollup/src/createMpaConfig.js @@ -0,0 +1,26 @@ +import { createSpaMetaConfig } from './createSpaConfig.js'; +import { adjustPluginOptions, metaConfigToRollupConfig } from 'plugins-manager'; + +export function createMpaConfig(userConfig) { + const { config, metaPlugins } = createMpaMetaConfig(userConfig); + + const final = metaConfigToRollupConfig(config, metaPlugins); + return final; +} + +export function createMpaMetaConfig(userConfig = { output: {}, setupPlugins: [] }) { + const { config, metaPlugins } = createSpaMetaConfig(userConfig); + + config.setupPlugins = [ + adjustPluginOptions('html', { + flattenOutput: false, + }), + adjustPluginOptions('workbox', config => { + delete config.navigateFallback; + return config; + }), + ...config.setupPlugins, + ]; + + return { config, metaPlugins }; +} diff --git a/packages/building-rollup/src/createSpaConfig.js b/packages/building-rollup/src/createSpaConfig.js new file mode 100644 index 00000000..f5f031e1 --- /dev/null +++ b/packages/building-rollup/src/createSpaConfig.js @@ -0,0 +1,82 @@ +import path from 'path'; +import { rollupPluginHTML } from '@web/rollup-plugin-html'; +import { generateSW } from 'rollup-plugin-workbox'; +import { importMetaAssets } from '@web/rollup-plugin-import-meta-assets'; +import { polyfillsLoader } from '@web/rollup-plugin-polyfills-loader'; +import { metaConfigToRollupConfig } from 'plugins-manager'; + +import { createBasicMetaConfig } from './createBasicConfig.js'; + +export function createSpaConfig(userConfig) { + const { config, metaPlugins } = createSpaMetaConfig(userConfig); + return metaConfigToRollupConfig(config, metaPlugins); +} + +export function createSpaMetaConfig(userConfig = { output: {} }) { + const { config, metaPlugins, developmentMode } = createBasicMetaConfig(userConfig); + + // root dir + let rootDir = process.cwd(); + if (config.rootDir) { + rootDir = config.rootDir; + delete config.rootDir; + } + + // base url + let absoluteBaseUrl; + if (config.absoluteBaseUrl) { + absoluteBaseUrl = config.absoluteBaseUrl; + } + delete config.absoluteBaseUrl; + + const spaMetaPlugins = [ + ...metaPlugins, + { + name: 'html', + plugin: rollupPluginHTML, + options: { + rootDir, + absoluteBaseUrl, + injectServiceWorker: true, + serviceWorkerPath: path.join(config.output.dir, 'service-worker.js'), + }, + }, + { + name: 'workbox', + plugin: generateSW, + options: { + // Keep 'legacy-*.js' just for retro compatibility + globIgnores: ['polyfills/*.js', 'legacy-*.js', 'nomodule-*.js'], + navigateFallback: '/index.html', + // where to output the generated sw + swDest: path.join(config.output.dir, 'service-worker.js'), + // directory to match patterns against to be precached + globDirectory: path.join(config.output.dir), + // cache any html js and css by default + globPatterns: ['**/*.{html,js,css,webmanifest}'], + skipWaiting: true, + clientsClaim: true, + runtimeCaching: [ + { + urlPattern: 'polyfills/*.js', + handler: 'CacheFirst', + }, + ], + }, + }, + { + name: 'import-meta-assets', + plugin: importMetaAssets, + }, + { + name: 'polyfills-loader', + plugin: polyfillsLoader, + options: { + polyfills: {}, + minify: !developmentMode, + }, + }, + ]; + + return { config, metaPlugins: spaMetaPlugins, developmentMode }; +} diff --git a/packages/building-rollup/test-node/createConfig.test.js b/packages/building-rollup/test-node/createConfig.test.js new file mode 100644 index 00000000..ba6f3766 --- /dev/null +++ b/packages/building-rollup/test-node/createConfig.test.js @@ -0,0 +1,21 @@ +import chai from 'chai'; +import { createBasicConfig, createSpaConfig, createMpaConfig } from '@rocket/building-rollup'; + +const { expect } = chai; + +describe('plugin count', () => { + it('createBasicConfig has 3 plugins', () => { + const config = createBasicConfig(); + expect(config.plugins.length).to.equal(3); + }); + + it('createSpaConfig has 7 plugins', () => { + const config = createSpaConfig(); + expect(config.plugins.length).to.equal(7); + }); + + it('createMpaConfig has 7 plugins', () => { + const config = createMpaConfig(); + expect(config.plugins.length).to.equal(7); + }); +}); diff --git a/packages/building-rollup/test-node/createMpaConfig.test.js b/packages/building-rollup/test-node/createMpaConfig.test.js new file mode 100644 index 00000000..9097ba23 --- /dev/null +++ b/packages/building-rollup/test-node/createMpaConfig.test.js @@ -0,0 +1,81 @@ +import chai from 'chai'; +import path from 'path'; +import fs from 'fs'; +import { fileURLToPath } from 'url'; +import { rollup } from 'rollup'; + +const { expect } = chai; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +/** + * @param {object} config + */ +async function buildAndWrite(config) { + const bundle = await rollup(config); + + if (Array.isArray(config.output)) { + await bundle.write(config.output[0]); + await bundle.write(config.output[1]); + } else { + await bundle.write(config.output); + } +} + +async function execute(configString) { + const configPath = path.join(__dirname, 'fixtures', configString.split('/').join(path.sep)); + const config = (await import(configPath)).default; + await buildAndWrite(config); + + return async ( + fileName, + { stripServiceWorker = false, stripToBody = false, stripStartEndWhitespace = true } = {}, + ) => { + let text = await fs.promises.readFile( + path.join(config.output.dir, fileName.split('/').join(path.sep)), + ); + text = text.toString(); + if (stripToBody) { + const bodyOpenTagEnd = text.indexOf('>', text.indexOf(''); + text = text.substring(bodyOpenTagEnd, bodyCloseTagStart); + } + if (stripServiceWorker) { + const scriptOpenTagEnd = text.indexOf('', + ); + + const serviceWorkerJs = await readOutput('service-worker.js'); + expect(serviceWorkerJs).to.include('Promise'); // not empty string might be enough... + }); +}); diff --git a/packages/building-rollup/test-node/fixtures/mpa/index.html b/packages/building-rollup/test-node/fixtures/mpa/index.html new file mode 100644 index 00000000..2e4b4d3b --- /dev/null +++ b/packages/building-rollup/test-node/fixtures/mpa/index.html @@ -0,0 +1 @@ +

Only static html content in index.html

diff --git a/packages/building-rollup/test-node/fixtures/mpa/rollup.mpa.config.js b/packages/building-rollup/test-node/fixtures/mpa/rollup.mpa.config.js new file mode 100644 index 00000000..c524b9df --- /dev/null +++ b/packages/building-rollup/test-node/fixtures/mpa/rollup.mpa.config.js @@ -0,0 +1,14 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; +import { createMpaConfig } from '@rocket/building-rollup'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +export default createMpaConfig({ + input: '**/*.html', + developmentMode: true, + rootDir: __dirname, + output: { + dir: path.join(__dirname, '..', '__output'), + }, +}); diff --git a/packages/building-rollup/test-node/fixtures/mpa/sub-html/index.html b/packages/building-rollup/test-node/fixtures/mpa/sub-html/index.html new file mode 100644 index 00000000..1a8c6f8f --- /dev/null +++ b/packages/building-rollup/test-node/fixtures/mpa/sub-html/index.html @@ -0,0 +1 @@ +

Only static html content in sub-html/index.html

diff --git a/packages/building-rollup/test-node/fixtures/mpa/sub-js/index.html b/packages/building-rollup/test-node/fixtures/mpa/sub-js/index.html new file mode 100644 index 00000000..98003e1b --- /dev/null +++ b/packages/building-rollup/test-node/fixtures/mpa/sub-js/index.html @@ -0,0 +1,2 @@ +

Has js in sub-js/index.html

+ diff --git a/packages/building-rollup/test-node/fixtures/mpa/sub-js/sub-js.js b/packages/building-rollup/test-node/fixtures/mpa/sub-js/sub-js.js new file mode 100644 index 00000000..e69de29b diff --git a/packages/building-rollup/test-node/spa-integration.test-revisit.js b/packages/building-rollup/test-node/spa-integration.test-revisit.js new file mode 100644 index 00000000..a4a658b4 --- /dev/null +++ b/packages/building-rollup/test-node/spa-integration.test-revisit.js @@ -0,0 +1,92 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import puppeteer from 'puppeteer'; +import chai from 'chai'; +import path from 'path'; +import fs from 'fs'; +import rimraf from 'rimraf'; +import { rollup } from 'rollup'; +import { startDevServer } from '@web/dev-server'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const rootDir = path.resolve(__dirname, '..', 'dist'); +const { expect } = chai; + +describe('spa integration tests', () => { + let server; + /** @type {import('puppeteer').Browser} */ + let browser; + + before(async () => { + server = await startDevServer({ + config: { + port: 8081, + rootDir, + }, + readCliArgs: false, + readFileConfig: false, + logStartMessage: false, + clearTerminalOnReload: false, + }); + browser = await puppeteer.launch(); + rimraf.sync(rootDir); + }); + + after(async () => { + await browser.close(); + await server.stop(); + }); + + [ + // + 'js/rollup.spa.config.mjs', + // 'js/rollup.spa-nomodule.config.js', + ].forEach(testCase => { + describe(`testcase ${testCase}`, function describe() { + this.timeout(30000); + let page; + + before(async () => { + rimraf.sync(rootDir); + const configPath = path.join(__dirname, '..', 'demo', testCase); + const config = (await import(configPath)).default; + const bundle = await rollup(config); + if (Array.isArray(config.output)) { + await Promise.all([bundle.write(config.output[0]), bundle.write(config.output[1])]); + } else { + await bundle.write(config.output); + } + + page = await browser.newPage(); + await page.goto('http://localhost:8081/', { + waitUntil: 'networkidle0', + }); + }); + + after(() => { + rimraf.sync(rootDir); + }); + + it('passes the in-browser tests', async () => { + // @ts-ignore + const browserTests = await page.evaluate(() => window.__tests); + expect(browserTests).to.eql({ + partialCSS: true, + litElement: true, + startsWith: true, + map: true, + asyncFunction: true, + forOf: true, + optionalChaining: true, + nullishCoalescing: true, + asyncIterator: true, + }); + }); + + it('outputs a service worker', () => { + expect(fs.existsSync(path.join(rootDir, 'service-worker.js'))).to.be.true; + }); + }); + }); +}); diff --git a/packages/cli/README.md b/packages/cli/README.md new file mode 100644 index 00000000..01ac1b63 --- /dev/null +++ b/packages/cli/README.md @@ -0,0 +1,5 @@ +# Rocket Cli + +Execute Rocket within you CLI + +For docs please see our homepage [https://rocket.modern-web.dev/](https://rocket.modern-web.dev/). diff --git a/packages/cli/demo/docs/blog/first.md b/packages/cli/demo/docs/blog/first.md new file mode 100644 index 00000000..6659d8f5 --- /dev/null +++ b/packages/cli/demo/docs/blog/first.md @@ -0,0 +1,8 @@ +--- +title: This Is My First Ever Post +date: 2019-06-30 +--- + +This is the first post on my blog. + +Eleventy is super fresh init. diff --git a/packages/cli/demo/docs/blog/index.md b/packages/cli/demo/docs/blog/index.md new file mode 100644 index 00000000..b295b85e --- /dev/null +++ b/packages/cli/demo/docs/blog/index.md @@ -0,0 +1,16 @@ +--- +title: Blog Post Overview +layout: blog-overview.njk +eleventyNavigation: + key: Blog + order: -30 +pagination: + data: collections.blog + size: 10 + reverse: true + alias: posts +--- + +\* Are in page h2 headlines which could be shown on desktop in a floating menu on the right? + +First and second Levels are always shown (3rd is only shown when in active main or 2nd) diff --git a/packages/cli/demo/docs/blog/introducing-mdjs.md b/packages/cli/demo/docs/blog/introducing-mdjs.md new file mode 100644 index 00000000..8a2b76c2 --- /dev/null +++ b/packages/cli/demo/docs/blog/introducing-mdjs.md @@ -0,0 +1,362 @@ +--- +title: Introducing mdjs - interactive demos everywhere +published: true +description: Write Interactive Demos Using Markdown and JavaScript +date: 2019-05-30 +tags: markdown, javascript, webcomponents, demos +cover_image: https://raw.githubusercontent.com/open-wc/blog-posts/master/2020-04-introducing-mdjs-interactive-demos-everywhere/images/aaron-burden-TNlHf4m4gpI-unsplash.jpg +--- + +All shared code should have written documentation to show what it can be used for and what the idea behind it is. +Users should at least be able to get a high level understanding of what they are using, what they're using it for, and why. + +On the web, we have many many different ways of writing documentation. +However, one thing almost all of them have in common is that they rely on [Markdown](https://en.wikipedia.org/wiki/Markdown) or some kind of variation of it. + +And it's no surprise, because Markdown is supported practically everywhere (vscode, atom, github, gitlab, dev.to, npmjs, ...) + +## For tools that do not run in the browser + +In this case, you will mostly share code snippets that people will need to run in their own projects in which case traditional static site generators like [Docusaurus](https://docusaurus.io/), [VuePress](https://vuepress.vuejs.org/), [Gatsby](https://www.gatsbyjs.org/), et al work great. All of them have full support for Markdown and allow you to easily create beautiful documentation pages with code snippets/highlighting, and more. + +And frankly, if that is your use case almost everything you need should be possible with those tools as long as you feel comfortable with the ecosystem/framework. + +## For (visual) components that do run in the browser + +In this context, users probably do expect a live demo to see all the different options of your component in action. So pure Markdown is usually not enough as we now want to actually execute code and "insert" our working component in our documentation somehow. This would require specialized handling for each framework. + +### Vue + +For Vue, as an example, you can use VuePress which auto registers all Vue components in a certain folder and then you can use as normal html tags since Markdown supports html + +``` +. +└─ .vuepress + └─ components + ├─ demo-1.vue +``` + +```html + +``` + +- supports vue components and has "magical" import for them +- no support for generic javascript or passing properties to components + +### React + +For React you can use [Mdx](https://mdxjs.com/) which extends Markdown with JSX support. Mdx is available via multiple tools like [Gatsby](https://www.gatsbyjs.org/), [docz](https://www.docz.site/), [storybook](https://storybook.js.org/), etc. + +```md +import { Chart } from '../components/chart' + +# Here’s a chart + +The chart is rendered inside our MDX document. + +``` + +- supports import/export JavaScript +- passes everything through JSX +- Doesn't look _great_ on github, requires special tools in editors to get highlighting + +## Limitations + +What all these specialized tools have in common is that they require a specific build tooling setup to work. +For web components, none of that is actually needed. Markdown already allows for HTML. The only missing piece is how to load a web component through JavaScript? + +## Introducing Markdown with JavaScript (mdjs) + +The primary goals are + +- minimal complexity +- follows progressive enhancement +- stick close to valid markdown syntax +- code highlighting in editors without additional tools +- looks good on github/gitlab/any source code management tool + +The fundamental idea seems almost too simple to be true. We "enhance" a code fence block with additional meta data `js script`. + + ```js script + import './my-component.js'; + ``` + # This is my component + + +And that's it! 😄 + +Alright, enough talk, you can see it live here: + +[==> Link to editable demo <==](https://webcomponents.dev/edit/aPQdZ4FtAiqJ7YXnRe2s?pm=1&sv=1) + +**How does it work** + +Mdjs hooks into [remark](https://remark.js.org/) and extracts all those tagged js blocks. +In the end, html and js is separately available. + +```js +{ + html: '

This is my component

', + jsCode: "import './my-component.js';" +} +``` + +It can then be combined/processed by any tool to create an actual documentation page. + +The process looks like this: + +1. Extract `js script` and separate it from md +2. Render md +3. Provide html & js + +![mdjs script transform](https://raw.githubusercontent.com/open-wc/blog-posts/master/2020-04-introducing-mdjs-interactive-demos-everywhere/images/mdjs-script-transform-resized.gif) + +> Link to [animation as slides](https://slides.com/dakmor/deck-mdjs#/) + +This already is powerful enough to directly include JavaScript and render web components with attributes. + +## Enhancing mdjs with demo format + +Now that we can execute JavaScript within our Markdown this opens the door for more advanced features. + +Our first step is to create another enhanced js code block, namely; `js story`. +From this code block you can export a function to be executed on demand: + + ```js script + import './my-component.js'; + ``` + # This is my component + ```js preview-story + export const demo = () => `` + ``` + +> if you want to add a border around and a button to show/hide the actual source code you can use `js preview-story` + +What you get looks something like this + +```js +{ + html: '

This is my component

', + jsCode: "import './my-component.js';", + stories: [ + key: 'demo', + name: 'demo', + code: 'export const demo = () => ``', + ] +} +``` + +Under the hood, this adds an extra step to the processing: + +1. Extract `js script` and separate from md +2. Extract `js story` and `js preview-story` and separate from md +3. Put a placeholder `` or `mdjs-preview` at it's place +4. Render markdown +5. Provide html, javascript, and stories + +This is all the information we need to create full javascript and demo capable pages purely from markdown. + +By default Mdjs takes it a small step further by supporting an actual template system - namely [lit-html](https://lit-html.polymer-project.org/). + + ```js script + import './demo-wc-card.js'; + import { html } from 'lit-html'; + ``` + # This is my component + ```js story + export const demo = () => html` + + `; + ``` + +![mdjs story transform](https://raw.githubusercontent.com/open-wc/blog-posts/master/2020-04-introducing-mdjs-interactive-demos-everywhere/images/mdjs-story-transform-dev-to-size.gif) + +> Link to [animation as slides](https://slides.com/dakmor/deck-mdjs#/) + +Here another playground mimicking a full documentation page. + +[==> Link to editable demo <==](https://webcomponents.dev/edit/PqrQkg3abvFJ7vxyZuqa?pm=1&sv=1) + +## mdjs default docs page + +Once all this meta-information is available you can render a specific docs page. + +It basically comes down to generating this code which assigns the demo function to the actual web component. + +```js +const stories = [{ key: 'demo', story: demo, code: demo }]; +for (const story of stories) { + const storyEl = rootNode.querySelector(`[mdjs-story-name="${story.key}"]`); + storyEl.story = story.story; + storyEl.code = story.code; +} +``` + +All of this happens under the hood for you 🤗 + +## Where can you use mdjs? + +### You can use it locally via es-dev-server + +Here i'll show you how you can create a github like markdown view for all your local markdown files including live demos. + +![es-dev-server screenshot](https://raw.githubusercontent.com/open-wc/blog-posts/master/2020-04-introducing-mdjs-interactive-demos-everywhere/images/es-dev-server-screenshot.png) + +- Install es-dev-server as a dependency by running `npm i -D es-dev-server` + +- Add the following script to your `package.json`: + + ```json + "scripts": { + "start": "es-dev-server", + } + ``` + +- Create a `es-dev-server.config.js` in the root of your repo. + + ```js + const { mdjsTransformer } = require('@mdjs/core'); + + module.exports = { + nodeResolve: true, + open: 'README.md', + watch: true, + responseTransformers: [mdjsTransformer], + }; + ``` + +After executing `npm run start` you can happily browse your live documentation via [http://localhost:8000/README.md](http://localhost:8000/README.md). + +You can see an example setup in the [demo-wc-card repo](https://github.com/daKmoR/demo-wc-card). + +### You can use it via Storybook + +If you want to work on individual components or get a list of all demos you can use Storybook. + +![storybook screenshot](https://raw.githubusercontent.com/open-wc/blog-posts/master/2020-04-introducing-mdjs-interactive-demos-everywhere/images/storybook-screenshot.png) + +- Install dependency `npm i -D @open-wc/demoing-storybook` + +- Add to your `package.json`: + + ```json + "scripts": { + "storybook": "start-storybook", + } + ``` + +- Adjust your `.storybook/main.js` to load markdown files + + ```js + module.exports = { + stories: ['../README.md', '../docs/**/*.md'], + esDevServer: { + nodeResolve: true, + watch: true, + open: true, + }, + }; + ``` + +- Add to every markdown file that should be in storybook a name via + + ```js + export default { + title: 'My Group/My Awesome Component', + }; + ``` + +And just like that, you are good to go. +No additional changes to any files are needed; a plugin will take care of everything by converting your markdown files to the support Storybook's mdx format. + +For more detailed information please see [https://open-wc.org/demoing-storybook/](https://open-wc.org/demoing-storybook/). + +### Show it on github + +Since Github supports markdown out of the box, we can take things even further by using Mdjs. + +![github screenshot](https://raw.githubusercontent.com/open-wc/blog-posts/master/2020-04-introducing-mdjs-interactive-demos-everywhere/images/github-screenshot.png) + +As it's not supported by github directly you will need a chrome extension called [mdjs-viewer](https://chrome.google.com/webstore/detail/mdjs-viewer/ifkkmomkjknligelmlcnakclabgohafe). + +- Do you want to see a demo without opening a different page? mdjs-viewer! +- Do you want to show a live example of the issue you are having? mdjs-viewer! + +Almost looks like black magic, huh? +All you did was install a Chrome extension and suddenly Github got superpowers. + +All that you need is to have some Markdown files with the correct code fence blocks, and have your code up and running on [unpkg.com](https://unpkg.com). + +**How does it actually work?** + +The extension detects which Github page you are on. +If it actually finds a markdown file or an issue with mdjs code then it adds a "show demo" button to activate it. +Only if you click the button it will start gathering all the needed info. + +- find the nearest `package.json` +- read the actual markdown file/issue content +- replace all bare import with `unpkg.com` imports +- replace all relative imports with `unpkg.com` and the name of the package.json + relative path for it +- create a secured iframe +- position the iframe absolute as an overlays +- put the javascript and html code inside the iframe +- the button becomes a toggle to show/hide the iframe + +Some of the tasks are more complicated and require some extra work to make it secure but in essence, that's it. + +With that, you can put documentation with live examples on github. +Even issues with demos showing the actual error in the code are possible. + +That sure sounds like a hell of a tool to improve your documentation an issue reproduction, doesn't it? +Especially as the readme and issue content still remain useful even without the extension. + +For more detailed information please see [https://github.com/open-wc/mdjs-viewer](https://github.com/open-wc/mdjs-viewer). + +### Supported on webcomponents.dev + +Fully supported by this awesome online editor. + +![webcomponent.dev screenshot](https://raw.githubusercontent.com/open-wc/blog-posts/master/2020-04-introducing-mdjs-interactive-demos-everywhere/images/webcomponents-dev-screenshot.png) + +You can directly edit your documentation, demos and code directly in the browser. + +![webcomponent.dev screenshot](https://raw.githubusercontent.com/open-wc/blog-posts/master/2020-04-introducing-mdjs-interactive-demos-everywhere/images/webcomponents-dev-new.png) + +You can start directly with documentation as in the screenshot above, or even better you can use it in every Markdown file or README.md 💪 + +Give it a go and document your components in all its glory. + +All the demo links are actually from [webcomponents.dev](https://webcomponents.dev/edit/collection/lsZ2eaviDNwy6pIBEDeL/tS7JYfymt6yeshma8Gn1?pm=1&sv=1). + +Be sure to [check it out](https://webcomponents.dev/). + +## How you can add support for mdjs + +Please check the official documentation page at [https://open-wc.org/mdjs/](https://open-wc.org/mdjs/). + +## Resume + +There you have it - mdjs is a format that can be shown in many different ways. +It is your single source of truth for good looking documentation everywhere. +Be it locally, a published storybook, on github or npmjs it always looks good even if there is no direct support for it, but when possible it will become interactive demos through progressive enhancement. + +Now go out there and write good documentation for your components! + +## Future + +- Have a separate github repo (potentially group as well). +- Have a dedicated homepage +- The default story preview frame should look a little nicer +- Support multiple renderers - discussion in [issue](https://github.com/open-wc/open-wc/issues/1498) +- Highlighting of code snippets +- More helpers to be used within stories +- ... (feel free to open issues within the corresponding projects) + +## Acknowledgements + +Follow us on [Twitter](https://twitter.com/openwc), or follow me on my personal [Twitter](https://twitter.com/dakmor). +Make sure to check out our other tools and recommendations at [open-wc.org](https://open-wc.org). + +Thanks to [Pascal](https://twitter.com/passle_) for feedback and helping turn my scribbles to a followable story. + +Photo by [Aaron Burden](https://unsplash.com/@aaronburden?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/bible?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) diff --git a/packages/cli/demo/docs/docs/dev-server.md b/packages/cli/demo/docs/docs/dev-server.md new file mode 100644 index 00000000..d4b33d36 --- /dev/null +++ b/packages/cli/demo/docs/docs/dev-server.md @@ -0,0 +1,7 @@ +--- +title: Development Server +eleventyNavigation: + key: Dev Server +--- + +You need it diff --git a/packages/cli/demo/docs/docs/index.md b/packages/cli/demo/docs/docs/index.md new file mode 100644 index 00000000..c60ba4a3 --- /dev/null +++ b/packages/cli/demo/docs/docs/index.md @@ -0,0 +1,6 @@ +--- +title: Documentation Section +eleventyNavigation: + key: Docs + order: -40 +--- diff --git a/packages/cli/demo/docs/docs/modern-web.md b/packages/cli/demo/docs/docs/modern-web.md new file mode 100644 index 00000000..f857cc8f --- /dev/null +++ b/packages/cli/demo/docs/docs/modern-web.md @@ -0,0 +1,46 @@ +--- +title: modern-web.dev +eleventyNavigation: + key: modern-web.dev +--- + +- Web fundamental (that also work with web components) + +| url | desc | +| ------------------------------------------ | ---------------------------------------- | +| - | Homepage | +| **/learn/** | **What is Modern Web? + Features?** | +| 1 - /learn/guide/ | - Getting Started | +| /learn/dev-setup/ | - Dev Setup (IDE, Node, ...) | +| /learn/codelabs/ | - Codelabs Overview | +| /learn/codelabs/x/ | ??? | +| /learn/fundaments/ | - Fundaments | +| /learn/fundaments/html/ | -- html | +| /learn/fundaments/css/ | -- css Basics | +| /learn/fundaments/browser/ | -- Browser Basics | +| /learn/fundaments/specs/ | -- Specs Basics | +| /learn/fundaments/server/ | -- Web Server Basics | +| 1 - /learn/serving/ | - Serving for development | +| 1 - /learn/testing/ | - Testing Basics | +| 1 - /learn/documenting/ | - Documenting/Demoing Basics | +| 1 - /learn/building/ | - Building Basics | +| 1 - /learn/deploying/ | - Deploying Basics | +| - | - | +| **/docs/** | **Overview Packages** | +| /docs/dev-server/ | - Dev Server Docs | +| /docs/dev-server/plugins/ | -- Dev Server Plugin List? | +| /docs/test-runner/ | - Test Runner Docs | +| /docs/test-runner/plugins/ | -- Test Runner Plugin List? | +| /docs/test-runner/plugins/playwright | --- Playwright Plugin docs | +| /docs/build/ | - Overview Build Plugins | +| /docs/build/rollup-plugin-html | -- Rollup Plugin for html | +| /docs/build/rollup-plugin-polyfills-loader | -- Rollup Plugin for html | +| /docs/build/polyfills-loader | -- Polyfills loading system | +| /docs/mdjs?docs?/ | - Mdjs/Docs Overview | +| /docs/mdjs/elements | - Mdjs Overview | +| - | - | +| **/blog/** | **Blog Overview** | +| /blog/2020/08/01/announcing-modern-web | - Announcement Blog Post | +| - | - | +| **/about/** | **About** | +| /about/family | Relationship modern-web, open-wc, rocket | diff --git a/packages/cli/demo/docs/docs/open-wc.md b/packages/cli/demo/docs/docs/open-wc.md new file mode 100644 index 00000000..9abdcd24 --- /dev/null +++ b/packages/cli/demo/docs/docs/open-wc.md @@ -0,0 +1,54 @@ +--- +title: open-wc.org +eleventyNavigation: + key: open-wc.org +--- + +- Web Component fundamentals + +| url | desc | +| ---------------------------------------------- | -------------------------------------------- | +| - | Homepage | +| **/learn/** | **What is Modern Web? + Features?** | +| /learn/guide/ | - Getting Started | +| /learn/dev-setup/ | - Dev Setup (IDE, Node, link to @web) | +| /learn/codelabs/ | - Codelabs Overview | +| /learn/codelabs/web-component-basics/ | -- Web Component Basics | +| /learn/codelabs/lit-basics/ | -- Lit Basics | +| /learn/codelabs/lit-intermediate/ | -- Lit Intermediate | +| /learn/code-examples/ | - Code Examples | +| /learn/code-examples/lit-basic | -- Lit Basic Overview | +| /learn/code-examples/lit-basic/01-setup | +++ Lit Basic 01 | +| /learn/code-examples/lit-basic/02-... | +++ Lit Basic 02 | +| /learn/code-examples/lit-intermediate | -- Lit Intermediate Overview | +| /learn/code-examples/lit-intermediate/01-setup | +++ Lit Intermediate 01 | +| /learn/code-examples/lit-intermediate/02-... | +++ Lit Intermediate 02 | +| /learn/code-examples/haunted/ | -- Haunted | +| /learn/code-examples/haunted/01-setup | +++ Haunted 01 | +| /learn/serving/ | - Web Server Basics (+ link to @web) | +| /learn/testing/ | - Testing Basics (+ link to @web and helper) | +| /learn/code-quality/ | - Code Quality | +| /learn/components/ | - Components Overview | +| /learn/components/best-practice/ | -- Best Practices | +| /learn/components/documenting/ | -- Documenting | +| /learn/components/publishing/ | -- Publish | +| /learn/apps/ | - Apps Overview | +| /learn/apps/best-practice/ | -- Best Practices | +| /learn/apps/building/ | -- Building Basics | +| /learn/apps/deploying/ | -- Deploying Basics | +| - | - | +| **/docs/** | **Overview Packages** | +| /docs/lib/ | - Production Libraries | +| /docs/lib/dedupe-mixin/ | -- Dedupe Mixin | +| /docs/lib/scoped-elements/ | -- Scoped Elements | +| /docs/lib/lit-helpers/ | -- Lit Helpers | +| /docs/test/ | - Test Libraries | +| /docs/test/testing-helpers/ | -- Testing Helpers | +| /docs/test/chai-a11y-axe/ | -- Chai A11y Axe?? => @web? | +| /docs/init/ | - Generator | +| - | - | +| **/blog/** | **Blog Overview** | +| /blog/2020/08/01/announcing-modern-web | - Announcement Blog Post | +| - | - | +| **/legacy/** | **Legacy Overview** | +| /legacy/karma-\* | - Karma | diff --git a/packages/cli/demo/docs/docs/rocket.md b/packages/cli/demo/docs/docs/rocket.md new file mode 100644 index 00000000..e8bc7a32 --- /dev/null +++ b/packages/cli/demo/docs/docs/rocket.md @@ -0,0 +1,45 @@ +--- +title: rocket.dev +eleventyNavigation: + key: rocket.dev +--- + +- Opinionated Meta Framework on top of (@web, @open-wc, @11ty) +- Initial goal mostly server rendered Multi Page App +- Compares with next/nuxt +- Small!!! + +| url | desc | +| ---------------------------------- | ------------------------------- | +| - | Homepage | +| **/learn/** | **What is Rocket? + Features?** | +| /learn/guide/ | - Getting Started | +| /learn/codelabs/ | - Codelabs Overview | +| /learn/codelabs/x/ | ??? | +| /learn/basics/ | - Summery + links to modern-web | +| /learn/authoring/ | - Authoring (Init + Pages) | +| /learn/navigation/ | - navigation | +| /learn/images/ | - Images | +| /learn/building/ | - Building Basics | +| /learn/deploying/ | - Deploying Basics | +| - | - | +| **/docs/** | **Overview Packages** | +| /docs/dev-server/ | - Dev Server Docs | +| /docs/build/ | - Overview Build Plugins | +| /docs/data/ | - Overview Build Plugins | +| **/blog/** | **Blog Overview** | +| /blog/2020/08/01/announcing-rocket | - Announcement Blog Post | + +- Learn rocket.dev/learn/ + - Create a Rocket App rocket.dev/learn/create-a-rocket-app/ + - Init rocket.dev/learn/create-a-rocket-app/init/ + - Pages + - ... + - Navigation rocket.dev/learn/navigation/ + - Assets rocket.dev/learn/navigation/ + - Assets rocket.dev/learn/navigation/ + - Deploying +- Docs + - Dev Server + - Build + - Data diff --git a/packages/cli/demo/docs/index.md b/packages/cli/demo/docs/index.md new file mode 100644 index 00000000..42764218 --- /dev/null +++ b/packages/cli/demo/docs/index.md @@ -0,0 +1,29 @@ +--- +layout: home.njk +eleventyNavigation: + key: Introduction +--- + +

🚀

+ +# Rocket + +The modern web setup with less complexity + +## Why Rocket.dev? + +### Small + +No overblown tools and frontend frameworks. + +### Fast + +By shipping html + +### Simple + +Pure html with little js helpers here and there allows you to debug and enhance where needed. + +### Meta Framework + +It is build on top of giants. diff --git a/packages/cli/demo/docs/learn/codelabs/index.md b/packages/cli/demo/docs/learn/codelabs/index.md new file mode 100644 index 00000000..1df29e27 --- /dev/null +++ b/packages/cli/demo/docs/learn/codelabs/index.md @@ -0,0 +1,20 @@ +--- +title: Codelabs Overview +eleventyNavigation: + key: Codelabs + order: 100 +--- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi eros urna, facilisis sit amet erat vitae, tempus fermentum leo. Aliquam at mauris pellentesque, porttitor dolor efficitur, pellentesque massa. Cras sit amet mauris consectetur, malesuada velit sit amet, pulvinar libero. Integer venenatis massa luctus erat vehicula dignissim in quis justo. Sed dictum ipsum orci, ut feugiat purus vulputate quis. Sed ante velit, condimentum sed nulla auctor, eleifend tincidunt sem. Proin aliquam neque egestas, facilisis odio eu, lobortis tellus. Vestibulum blandit elit nisi, nec lacinia sem venenatis a. Maecenas dignissim facilisis erat, id dictum velit fringilla vel. Duis interdum maximus nisl, eu luctus mi tincidunt ut. Nullam pellentesque sodales augue vitae sollicitudin. Suspendisse magna dolor, luctus blandit vehicula id, congue vitae velit. Vivamus eu augue leo. Nam faucibus tellus ligula, vitae finibus magna commodo sit amet. Donec pellentesque velit vel posuere tincidunt. Nulla tempor, metus id ullamcorper feugiat, lectus ex pretium arcu, eget malesuada sem enim vitae metus. + +Pellentesque viverra pretium semper. Vestibulum volutpat dui id congue auctor. Donec cursus lobortis est, vel dignissim augue euismod posuere. Sed sed efficitur arcu, sed lobortis velit. Nunc gravida erat nunc, vel lacinia lectus commodo vitae. Aliquam tincidunt bibendum fermentum. Donec in risus eros. Phasellus eu sapien fermentum, laoreet sapien sed, posuere est. Fusce et rutrum ante. Nulla et augue sapien. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam ac accumsan ante. + +## Start + +Ut vel iaculis libero. Aliquam ac auctor risus. Proin aliquam libero augue, vel venenatis ex mattis eget. Aenean facilisis tellus vitae volutpat hendrerit. Duis erat turpis, gravida a tortor sed, mollis tincidunt turpis. Nam ut ex sem. Aliquam erat volutpat. Suspendisse nec aliquet risus, sit amet aliquam libero. Morbi sagittis nisl auctor ante pretium ultrices vel nec leo. Phasellus feugiat risus elit, et luctus ex ultricies nec. Ut non dolor molestie, eleifend lectus ut, dictum ex. Cras eu dolor urna. Curabitur eu vulputate mauris. + +## More + +Phasellus suscipit, erat vel ultrices congue, diam metus euismod ligula, at vulputate diam nisl quis nulla. Nulla consectetur, arcu ornare euismod eleifend, mi metus convallis nibh, a mollis ligula eros et velit. Etiam sed erat libero. In sed condimentum tellus. Praesent vel porttitor leo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla fringilla lacus justo, id feugiat lorem tincidunt ac. Vivamus quis consectetur leo. Duis non convallis felis. Fusce condimentum lectus ex. Cras quis dui vitae leo imperdiet placerat sit amet vel libero. Nulla blandit tempus nulla, eu pellentesque augue egestas sit amet. Nulla placerat nibh mi, in gravida odio vestibulum non. Cras sed viverra mi. + +Sed et blandit nisl. In ac risus sollicitudin velit condimentum consectetur non eu justo. In rutrum mattis justo, sed consequat velit eleifend vitae. Integer viverra elementum auctor. Donec vitae egestas felis, vel imperdiet urna. Vestibulum viverra tortor ut venenatis vestibulum. Nullam et luctus odio. Nulla tincidunt accumsan arcu, ac dignissim urna suscipit vitae. In fringilla maximus sem, nec lobortis nisl congue sit amet. Praesent pretium auctor nulla et tempor. diff --git a/packages/cli/demo/docs/learn/codelabs/web-components-basics/01-custom-elements.md b/packages/cli/demo/docs/learn/codelabs/web-components-basics/01-custom-elements.md new file mode 100644 index 00000000..dedfeb2d --- /dev/null +++ b/packages/cli/demo/docs/learn/codelabs/web-components-basics/01-custom-elements.md @@ -0,0 +1,71 @@ +--- +title: Custom Elements +eleventyNavigation: + key: Custom Elements + parent: Web Components Basics +--- + +First, we will take a look at the most important Web Component feature: Custom Elements. + +Modify your HTML to wrap the "Hello world" message in an element called ``: + +```html + +

Hello world!

+
+``` + +Currently, your browser does not recognize the `` tag. When the browser encounters an unknown HTML tag like ``, it will just render it as an inline element and move on. With the custom elements API, we can tell the browser what to do with the HTML tag that we have just created. + +We need to do this in javascript, so let's add a script tag to the bottom of our `` element: + +```html + +``` + +To create a custom element we need to declare a class that extends the `HTMLElement` class. This is the base class that powers all other native elements such as the `` and ` + + + + {% endif %} + + + diff --git a/packages/launch/preset/_includes/partials/head-content.njk b/packages/launch/preset/_includes/partials/head-content.njk new file mode 100644 index 00000000..6222414d --- /dev/null +++ b/packages/launch/preset/_includes/partials/head-content.njk @@ -0,0 +1,51 @@ +{% set _pageTitle = title %} +{% if title != site.name %} + {% set _pageTitle = title + ': ' + site.name %} +{% endif %} +{% if pageTitle %} + {% set _pageTitle = pageTitle %} +{% endif %} + + + +{{ _pageTitle }} + + + + + + + + + + + + + + + + + +{% set _socialMediaImage = '/_assets/social-media-image.jpg' | asset | url %} +{% if socialMediaImage %} + {% set _socialMediaImage = socialMediaImage %} +{% endif %} + + + + + +{% set _description = site.description %} +{% if description %} + {% set _description = description %} +{% endif %} + + + + + + + + + +{% include 'partials/head.njk' %} diff --git a/packages/launch/preset/_includes/partials/head.njk b/packages/launch/preset/_includes/partials/head.njk new file mode 100644 index 00000000..e69de29b diff --git a/packages/launch/preset/_includes/partials/header.njk b/packages/launch/preset/_includes/partials/header.njk new file mode 100644 index 00000000..21539865 --- /dev/null +++ b/packages/launch/preset/_includes/partials/header.njk @@ -0,0 +1,38 @@ +
+
+ + {% if layout === "home.njk" and rocketLaunch.homeLayout === "background" %} + + {{ site.logoAlt }} + {{ site.name }} + + {% else %} + {% include 'partials/logoLink.njk' %} + {% endif %} + + {%- for entry in collections.header %} + {{ entry.data.eleventyNavigation.key }} + {%- endfor %} + + + + {% include 'search/input.njk' %} + + {%- for entry in site.socialLinks %} + + {%- endfor %} +
+
diff --git a/packages/launch/preset/_includes/partials/logoLink.njk b/packages/launch/preset/_includes/partials/logoLink.njk new file mode 100644 index 00000000..5dbea5f0 --- /dev/null +++ b/packages/launch/preset/_includes/partials/logoLink.njk @@ -0,0 +1,4 @@ + + {{ site.logoAlt }} + {{ site.name }} + diff --git a/packages/launch/preset/_includes/partials/mobile-sidebar-bottom.njk b/packages/launch/preset/_includes/partials/mobile-sidebar-bottom.njk new file mode 100644 index 00000000..f6ae28fe --- /dev/null +++ b/packages/launch/preset/_includes/partials/mobile-sidebar-bottom.njk @@ -0,0 +1,7 @@ + diff --git a/packages/launch/preset/_includes/partials/mobileNavigationJs.njk b/packages/launch/preset/_includes/partials/mobileNavigationJs.njk new file mode 100644 index 00000000..1e22c49e --- /dev/null +++ b/packages/launch/preset/_includes/partials/mobileNavigationJs.njk @@ -0,0 +1,12 @@ + diff --git a/packages/launch/preset/_includes/partials/pageJs.njk b/packages/launch/preset/_includes/partials/pageJs.njk new file mode 100644 index 00000000..6da9446b --- /dev/null +++ b/packages/launch/preset/_includes/partials/pageJs.njk @@ -0,0 +1,20 @@ +{% if content.jsCode %} + +{% endif %} + +{% if site.analytics %} + + +{% endif %} + + diff --git a/packages/launch/preset/_includes/partials/previousNext.njk b/packages/launch/preset/_includes/partials/previousNext.njk new file mode 100644 index 00000000..ba50dbf8 --- /dev/null +++ b/packages/launch/preset/_includes/partials/previousNext.njk @@ -0,0 +1,6 @@ +{% if previousUrl %} + Previous +{% endif %} +{% if nextUrl %} + Next +{% endif %} diff --git a/packages/launch/preset/_includes/pure-content.njk b/packages/launch/preset/_includes/pure-content.njk new file mode 100644 index 00000000..f8ed737c --- /dev/null +++ b/packages/launch/preset/_includes/pure-content.njk @@ -0,0 +1 @@ +{{ content | safe }} diff --git a/packages/launch/preset/_includes/search/input.njk b/packages/launch/preset/_includes/search/input.njk new file mode 100644 index 00000000..e69de29b diff --git a/packages/launch/preset/_includes/with-index.njk b/packages/launch/preset/_includes/with-index.njk new file mode 100644 index 00000000..0f4d6e13 --- /dev/null +++ b/packages/launch/preset/_includes/with-index.njk @@ -0,0 +1,32 @@ +{% extends 'with-sidebar.njk' %} + +{% block sidebar %} + + + +{% endblock sidebar %} + +{% block main %} +
+ {% include 'partials/addTitleHeadline.njk' %} + + {{ content.html | safe }} + +

Find out more on the following pages:

+ {{ collections[section] | rocketNav(eleventyNavigation.key) | rocketNavToHtml({ + listItemClass: "index-item", + activeKey: eleventyNavigation.key + }) | safe }} + {% include 'partials/previousNext.njk' %} +
+{% endblock main %} diff --git a/packages/launch/preset/_includes/with-sidebar.njk b/packages/launch/preset/_includes/with-sidebar.njk new file mode 100644 index 00000000..0ec0d31f --- /dev/null +++ b/packages/launch/preset/_includes/with-sidebar.njk @@ -0,0 +1,32 @@ +{% extends 'layout.njk' %} + +{% block bodyTag %} + +{% endblock bodyTag %} + +{% block sidebar %} + + + +{% endblock sidebar %} + +{% block main %} +
+ {% include 'partials/addTitleHeadline.njk' %} + + {{ content.html | safe }} + + {% include 'partials/previousNext.njk' %} + {% include 'partials/content-footer.njk' %} +
+{% endblock main %} diff --git a/packages/launch/preset/rocketLaunch.js b/packages/launch/preset/rocketLaunch.js new file mode 100644 index 00000000..33a0afc0 --- /dev/null +++ b/packages/launch/preset/rocketLaunch.js @@ -0,0 +1,51 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +function addOcticonToHeadlines(plugins) { + return plugins.map(pluginObj => { + if (pluginObj.name === 'htmlHeading') { + return { + ...pluginObj, + options: { + properties: { + className: ['anchor'], + }, + content: [ + { + type: 'element', + tagName: 'svg', + properties: { + className: ['octicon', 'octicon-link'], + viewBox: '0 0 16 16', + ariaHidden: 'true', + width: 16, + height: 16, + }, + children: [ + { + type: 'element', + tagName: 'path', + properties: { + fillRule: 'evenodd', + d: + 'M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z', + }, + }, + ], + }, + ], + }, + }; + } + return pluginObj; + }); +} + +export function rocketLaunch() { + return { + path: path.resolve(__dirname), + setupUnifiedPlugins: [addOcticonToHeadlines], + }; +} diff --git a/packages/mdjs-core/CHANGELOG.md b/packages/mdjs-core/CHANGELOG.md new file mode 100644 index 00000000..4e7687ae --- /dev/null +++ b/packages/mdjs-core/CHANGELOG.md @@ -0,0 +1,134 @@ +# Change Log + +## 0.6.0 + +### Minor Changes + +- b9a6274: Use new dependency [plugins-manager](https://www.npmjs.com/package/plugins-manager) to add, remove or adjust plugins. + + Removals: + + - Removed own add plugin helper again + - Removed deprecated export of `mdjsProcessPlugins` please us `setupPlugins` option instead + +### Patch Changes + +- Updated dependencies [b9a6274] + - plugins-manager@0.1.0 + +## 0.5.1 + +### Patch Changes + +- 6cf6ef2: Adds a helper for adding remark plugins + +## 0.5.0 + +### Minor Changes + +- 15e0abe: Remove of resolveToUnpkg.js and mdjsTransformer.js - add Types + +### Patch Changes + +- Updated dependencies [15e0abe] + - @mdjs/mdjs-preview@0.3.0 + - @mdjs/mdjs-story@0.1.0 + +## 0.4.1 + +### Patch Changes + +- 17e9e7dc: Change type distribution workflow + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [0.4.0](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.3.3...@mdjs/core@0.4.0) (2020-09-12) + +### Features + +- **core:** replace exporting plugins array with setup functions ([44de89e](https://github.com/open-wc/open-wc/commit/44de89e01092835248425f6c53255337061a935a)) + +## [0.3.3](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.3.2...@mdjs/core@0.3.3) (2020-06-13) + +### Bug Fixes + +- **core:** auto load mdjs-preview/story if not defined by user ([6849afd](https://github.com/open-wc/open-wc/commit/6849afd5e20f8cdb7d54db2a1c22f384657055fd)) +- **core:** use js of md files even if there are no stories ([6d12de5](https://github.com/open-wc/open-wc/commit/6d12de5dbeeceedfd54709c37eba890c5f160e64)) + +## [0.3.2](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.3.1...@mdjs/core@0.3.2) (2020-05-23) + +### Bug Fixes + +- **core:** export type for plugins ([c8ea754](https://github.com/open-wc/open-wc/commit/c8ea754153e2da4e73fa1f6a927c7b24108bf658)) + +## [0.3.1](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.3.0...@mdjs/core@0.3.1) (2020-05-16) + +### Bug Fixes + +- **core:** use types everywhere, export interfaces ([3f4ba8b](https://github.com/open-wc/open-wc/commit/3f4ba8b2293d2fa29d8ac8b210abf2dc3727a008)) + +# [0.3.0](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.2.0...@mdjs/core@0.3.0) (2020-05-09) + +### Bug Fixes + +- **core:** having a js or html code block alone does not mean mdjs ([427ea5e](https://github.com/open-wc/open-wc/commit/427ea5eb2947ff461f2a3c69cd74bad9f3a2d24a)) +- **core:** limit Story.type to js|html and make it optional ([f0191d1](https://github.com/open-wc/open-wc/commit/f0191d1ad0974e667e730e4df8ff2f7930fa082f)) + +### Features + +- **core:** mimic github syntax highlighting, upoptimized code view ([a9879f8](https://github.com/open-wc/open-wc/commit/a9879f84b46726fe20de3240d11b534e9776bc70)) +- **core:** support html preview/-stories ([c820f17](https://github.com/open-wc/open-wc/commit/c820f1718115a4f376c6541edec44c41d1ed7d8d)) + +# [0.2.0](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.9...@mdjs/core@0.2.0) (2020-05-07) + +### Bug Fixes + +- **core:** update @mdjs/mdjs-preview with no css side effect for buttons ([c21abf6](https://github.com/open-wc/open-wc/commit/c21abf640b34e98c216c374e70741e7e7a6a6a72)) + +### Features + +- **core:** allow to fully customize used plugins ([bd3c443](https://github.com/open-wc/open-wc/commit/bd3c44321a9e866aadf42d59ca8d5c788401c786)) +- **core:** no jsCode if no stories, no auto import of wc ([9eab522](https://github.com/open-wc/open-wc/commit/9eab52224edf618ef3bb956db18ed4ade98a3ac6)) + +## [0.1.9](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.8...@mdjs/core@0.1.9) (2020-04-12) + +**Note:** Version bump only for package @mdjs/core + +## [0.1.8](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.7...@mdjs/core@0.1.8) (2020-04-05) + +**Note:** Version bump only for package @mdjs/core + +## [0.1.7](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.6...@mdjs/core@0.1.7) (2020-03-26) + +**Note:** Version bump only for package @mdjs/core + +## [0.1.6](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.5...@mdjs/core@0.1.6) (2020-03-24) + +**Note:** Version bump only for package @mdjs/core + +## [0.1.5](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.4...@mdjs/core@0.1.5) (2020-03-19) + +**Note:** Version bump only for package @mdjs/core + +## [0.1.4](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.3...@mdjs/core@0.1.4) (2020-03-15) + +**Note:** Version bump only for package @mdjs/core + +## [0.1.3](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.2...@mdjs/core@0.1.3) (2020-03-15) + +**Note:** Version bump only for package @mdjs/core + +## [0.1.2](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.1...@mdjs/core@0.1.2) (2020-03-11) + +**Note:** Version bump only for package @mdjs/core + +## [0.1.1](https://github.com/open-wc/open-wc/compare/@mdjs/core@0.1.0...@mdjs/core@0.1.1) (2020-03-10) + +**Note:** Version bump only for package @mdjs/core + +# 0.1.0 (2020-03-08) + +### Features + +- add Markdown with JavaScript (mdjs) ([5547ebc](https://github.com/open-wc/open-wc/commit/5547ebc00c02c5c34725030865dc3fd5a02aae80)) diff --git a/packages/mdjs-core/README.md b/packages/mdjs-core/README.md new file mode 100644 index 00000000..39bdedc6 --- /dev/null +++ b/packages/mdjs-core/README.md @@ -0,0 +1,5 @@ +# Markdown with JavaScript (mdjs) + +Combine Markdown with JavaScript + +For docs please see our homepage [https://rocket.modern-web.dev/docs/markdown-javascript/overview/](https://rocket.modern-web.dev/docs/markdown-javascript/overview/). diff --git a/packages/mdjs-core/demo/script/README.md b/packages/mdjs-core/demo/script/README.md new file mode 100644 index 00000000..2d942873 --- /dev/null +++ b/packages/mdjs-core/demo/script/README.md @@ -0,0 +1,40 @@ +## My El + +A component that is as young as you are. +Just see for yourself. + + + +```js script +import { LitElement, html, css } from 'lit-element'; + +class MyEl extends LitElement { + static get properties() { + return { + age: { type: Number }, + }; + } + + static get styles() { + return css` + h1 { + color: red; + } + `; + } + + constructor() { + super(); + this.age = 8; + } + + render() { + return html` +

I am ${this.age} years

+ + `; + } +} + +customElements.define('my-el', MyEl); +``` diff --git a/packages/mdjs-core/demo/script/server.js b/packages/mdjs-core/demo/script/server.js new file mode 100644 index 00000000..e6973fd9 --- /dev/null +++ b/packages/mdjs-core/demo/script/server.js @@ -0,0 +1,8 @@ +const { mdjsTransformer } = require('../../index.js'); + +module.exports = { + nodeResolve: true, + open: 'packages/mdjs/demo/script/README.md', + watch: true, + responseTransformers: [mdjsTransformer], +}; diff --git a/packages/mdjs-core/demo/stories/README.md b/packages/mdjs-core/demo/stories/README.md new file mode 100644 index 00000000..11f22a5b --- /dev/null +++ b/packages/mdjs-core/demo/stories/README.md @@ -0,0 +1,50 @@ +```js script +import { html } from 'lit-html'; +import './demo-wc-card.js'; +``` + +# Heading 1 + +Foo is great + +- looks like a game card +- content in the front +- data in the back + +## How to use + +```bash +yarn add @foo/demo-wc-card +``` + +```js +import '@foo/demo-wc-card/demo-wc-card.js'; +``` + +## Js Story + +```js story +export const JsStory = () => html` JS Story `; +``` + +## Js Preview Story + +with preview + +```js preview-story +export const JsStory2 = () => html` JS Story with preview `; +``` + +## Html Story + +```html story + +``` + +## Html Preview Story + +with preview + +```html preview-story + +``` diff --git a/packages/mdjs-core/demo/stories/demo-wc-card.js b/packages/mdjs-core/demo/stories/demo-wc-card.js new file mode 100644 index 00000000..f98e4df2 --- /dev/null +++ b/packages/mdjs-core/demo/stories/demo-wc-card.js @@ -0,0 +1,3 @@ +import { DemoWcCard } from './src/DemoWcCard.js'; + +customElements.define('demo-wc-card', DemoWcCard); diff --git a/packages/mdjs-core/demo/stories/server.js b/packages/mdjs-core/demo/stories/server.js new file mode 100644 index 00000000..a0fc7a63 --- /dev/null +++ b/packages/mdjs-core/demo/stories/server.js @@ -0,0 +1,8 @@ +const { mdjsTransformer } = require('../../index.js'); + +module.exports = { + nodeResolve: true, + open: 'packages/mdjs/demo/stories/README.md', + watch: true, + responseTransformers: [mdjsTransformer], +}; diff --git a/packages/mdjs-core/demo/stories/src/DemoWcCard.js b/packages/mdjs-core/demo/stories/src/DemoWcCard.js new file mode 100644 index 00000000..d361cdfb --- /dev/null +++ b/packages/mdjs-core/demo/stories/src/DemoWcCard.js @@ -0,0 +1,74 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import { LitElement, html } from 'lit-element'; +import { demoWcCardStyle } from './demoWcCardStyle.css.js'; +import { chevron } from './chevron.svg.js'; + +export class DemoWcCard extends LitElement { + static get properties() { + return { + backSide: { type: Boolean, reflect: true, attribute: 'back-side' }, + header: { type: String }, + rows: { type: Object }, + }; + } + + static get styles() { + return demoWcCardStyle; + } + + constructor() { + super(); + this.backSide = false; + this.header = 'Your Message'; + this.rows = []; + } + + _requestUpdate(name, oldValue) { + super._requestUpdate(name, oldValue); + + if (name === 'backSide') { + this.dispatchEvent(new Event('side-changed')); + } + } + + toggle() { + this.backSide = !this.backSide; + } + + render() { + return html` +
+
${this.header}
+
+ +
+ +
+
+
${this.header}
+ +
+ ${this.rows.length === 0 + ? html`` + : html` +
+ ${this.rows.map( + row => html` +
${row.header}
+
${row.value}
+ `, + )} +
+ `} +
+ +
+ `; + } +} diff --git a/packages/mdjs-core/demo/stories/src/chevron.svg.js b/packages/mdjs-core/demo/stories/src/chevron.svg.js new file mode 100644 index 00000000..26509dc1 --- /dev/null +++ b/packages/mdjs-core/demo/stories/src/chevron.svg.js @@ -0,0 +1,27 @@ +import { html } from 'lit-element'; + +export const chevron = html` + + + + + +`; diff --git a/packages/mdjs-core/demo/stories/src/demoWcCardStyle.css.js b/packages/mdjs-core/demo/stories/src/demoWcCardStyle.css.js new file mode 100644 index 00000000..0a20efc4 --- /dev/null +++ b/packages/mdjs-core/demo/stories/src/demoWcCardStyle.css.js @@ -0,0 +1,111 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import { css } from 'lit-element'; + +export const demoWcCardStyle = css` + :host { + display: block; + margin: 20px; + position: relative; + width: 250px; + height: 200px; + border-radius: 10px; + transform-style: preserve-3d; + transition: all 0.8s ease; + font-family: sans-serif; + --demo-wc-card-font-color: #2c3e50; + --demo-wc-card-header-color-front: #217ff9; + --demo-wc-card-header-color-back: #9b35fa; + --demo-wc-card-header-font-size: 16px; + } + + .header { + padding: 10px; + text-transform: uppercase; + margin: -10px; + color: white; + font-weight: bold; + font-size: var(--demo-wc-card-header-font-size); + text-align: center; + } + + .content { + padding: 20px 10px 0 10px; + flex-grow: 1; + color: var(--demo-wc-card-font-color); + } + + .footer { + display: flex; + } + + dl { + margin: 0; + text-align: left; + } + + dd { + margin-left: 15px; + } + + button { + border-radius: 15px; + width: 30px; + height: 30px; + background: #fff; + border: 1px solid #ccc; + color: #000; + font-size: 21px; + line-height: 27px; + font-weight: bold; + cursor: pointer; + margin: 5px; + } + + .note { + flex-grow: 1; + color: #666; + font-size: 16px; + font-weight: bold; + text-align: left; + padding-top: 15px; + } + + :host([back-side]) { + transform: rotateY(180deg); + } + + #front, + #back { + position: absolute; + width: 250px; + box-sizing: border-box; + box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.25); + padding: 10px; + display: flex; + flex-flow: column; + top: 0; + left: 0; + height: 100%; + border-radius: 10px; + backface-visibility: hidden; + overflow: hidden; + } + + #front { + background: #ededed; + } + + #front .header { + background-color: var(--demo-wc-card-header-color-front); + } + + #back .header { + background-color: var(--demo-wc-card-header-color-back); + } + + #back { + background: #ededed; + text-align: center; + transform: rotateY(180deg); + } +`; diff --git a/packages/mdjs-core/index.js b/packages/mdjs-core/index.js new file mode 100644 index 00000000..63825a41 --- /dev/null +++ b/packages/mdjs-core/index.js @@ -0,0 +1,17 @@ +/** @typedef {import('@mdjs/core/types/code').MarkdownResult} MarkdownResult */ +/** @typedef {import('@mdjs/core/types/code').Story} Story */ +/** @typedef {import('@mdjs/core/types/code').MdjsProcessPlugin} MdjsProcessPlugin */ + +const { mdjsParse } = require('./src/mdjsParse.js'); +const { mdjsStoryParse } = require('./src/mdjsStoryParse.js'); +const { mdjsDocPage } = require('./src/mdjsDocPage.js'); +const { mdjsProcess } = require('./src/mdjsProcess.js'); +const { isMdjsContent } = require('./src/isMdjsContent.js'); + +module.exports = { + mdjsParse, + mdjsStoryParse, + mdjsDocPage, + mdjsProcess, + isMdjsContent, +}; diff --git a/packages/mdjs-core/index.mjs b/packages/mdjs-core/index.mjs new file mode 100644 index 00000000..ab10a108 --- /dev/null +++ b/packages/mdjs-core/index.mjs @@ -0,0 +1,5 @@ +import cjsEntrypoint from './index.js'; + +const { mdjsParse, mdjsStoryParse, mdjsDocPage, mdjsProcess, isMdjsContent } = cjsEntrypoint; + +export { mdjsParse, mdjsStoryParse, mdjsDocPage, mdjsProcess, isMdjsContent }; diff --git a/packages/mdjs-core/package.json b/packages/mdjs-core/package.json new file mode 100644 index 00000000..4b04f808 --- /dev/null +++ b/packages/mdjs-core/package.json @@ -0,0 +1,72 @@ +{ + "name": "@mdjs/core", + "version": "0.6.0", + "publishConfig": { + "access": "public" + }, + "description": "Combine Markdown with JavaScript", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/rocket.git", + "directory": "packages/mdjs-core" + }, + "author": "Modern Web (https://modern-web.dev/)", + "homepage": "https://rocket.modern-web.dev/docs/markdown-javascript/overview/", + "main": "./index.js", + "exports": { + ".": { + "require": "./index.js", + "default": "./index.mjs" + } + }, + "scripts": { + "start": "npm run start:stories", + "start:script": "web-dev-server -c demo/script/server.js --root-dir ../../", + "start:stories": "web-dev-server -c demo/stories/server.js --root-dir ../../", + "test": "npm run test:node", + "test:node": "mocha test-node", + "test:watch": "mocha test-node --watch", + "types:copy": "copyfiles -f \"./types/**/*.d.ts\" dist-types/types" + }, + "files": [ + "*.d.ts", + "*.js", + "dist-types", + "src", + "types" + ], + "keywords": [ + "open-wc", + "markdown", + "unified", + "remark" + ], + "dependencies": { + "@mdjs/mdjs-preview": "^0.3.0", + "@mdjs/mdjs-story": "^0.1.0", + "@types/unist": "^2.0.3", + "es-module-lexer": "^0.3.26", + "github-markdown-css": "^4.0.0", + "plugins-manager": "^0.1.0", + "rehype-autolink-headings": "^5.0.1", + "rehype-prism-template": "^0.4.1", + "rehype-raw": "^5.0.0", + "rehype-slug": "^4.0.1", + "rehype-stringify": "^8.0.0", + "remark": "^11.0.2", + "remark-parse": "^9.0.0", + "remark-rehype": "^8.0.0", + "unified": "^8.4.2", + "unist-util-remove": "^2.0.1", + "unist-util-visit": "^2.0.3" + }, + "devDependencies": { + "demo-wc-card": "^0.1.0", + "remark-autolink-headings": "^6.0.1", + "remark-html": "^13.0.1", + "remark-slug": "^6.0.0", + "remark-stringify": "^9.0.1" + }, + "types": "dist-types/index.d.ts" +} diff --git a/packages/mdjs-core/src/isMdjsContent.js b/packages/mdjs-core/src/isMdjsContent.js new file mode 100644 index 00000000..ae673300 --- /dev/null +++ b/packages/mdjs-core/src/isMdjsContent.js @@ -0,0 +1,24 @@ +/** + * Check if a given text uses any of the mdjs features + * + * @param {string} text + * @returns {boolean} + */ +function isMdjsContent(text) { + if (!text) { + return false; + } + switch (true) { + case text.includes('```js story'): + case text.includes('```js preview-story'): + case text.includes('```html story'): + case text.includes('```html preview-story'): + return true; + default: + return false; + } +} + +module.exports = { + isMdjsContent, +}; diff --git a/packages/mdjs-core/src/mdjsDocPage.js b/packages/mdjs-core/src/mdjsDocPage.js new file mode 100644 index 00000000..0f6bf7a1 --- /dev/null +++ b/packages/mdjs-core/src/mdjsDocPage.js @@ -0,0 +1,98 @@ +const { mdjsProcess } = require('./mdjsProcess.js'); + +/** + * + * @param {string} body + * @returns {Promise} + */ +async function mdjsDocPage(body) { + const data = await mdjsProcess(body); + return ` + + + + +
+ ${data.html} +
+ `; +} + +module.exports = { + mdjsDocPage, +}; diff --git a/packages/mdjs-core/src/mdjsParse.js b/packages/mdjs-core/src/mdjsParse.js new file mode 100644 index 00000000..306ffbe3 --- /dev/null +++ b/packages/mdjs-core/src/mdjsParse.js @@ -0,0 +1,40 @@ +const visit = require('unist-util-visit'); +const remove = require('unist-util-remove'); + +/** @typedef {import('vfile').VFileOptions} VFileOptions */ +/** @typedef {import('unist').Node} Node */ + +function mdjsParse() { + let jsCode = ''; + + /** + * @param {Node} tree + * @param {VFileOptions} file + */ + function transformer(tree, file) { + visit(tree, 'code', node => { + if (node.lang === 'js' && node.meta === 'script') { + jsCode += node.value; + } + }); + // we can only return/modify the tree but jsCode should not be part of the tree + // so we attach it globally to the file.data + // eslint-disable-next-line no-param-reassign + file.data.jsCode = jsCode; + + /** + * @param {Node} node + */ + const removeFunction = node => + node.type === 'code' && node.lang === 'js' && node.meta === 'script'; + remove(tree, removeFunction); + + return tree; + } + + return transformer; +} + +module.exports = { + mdjsParse, +}; diff --git a/packages/mdjs-core/src/mdjsProcess.js b/packages/mdjs-core/src/mdjsProcess.js new file mode 100644 index 00000000..9414c20f --- /dev/null +++ b/packages/mdjs-core/src/mdjsProcess.js @@ -0,0 +1,127 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +/** @typedef {import('@mdjs/core/types/code').Story} Story */ +/** @typedef {import('@mdjs/core/types/code').ParseResult} ParseResult */ +/** @typedef {import('@mdjs/core/types/code').ProcessResult} ProcessResult */ +/** @typedef {import('@mdjs/core/types/code').MdjsProcessPlugin} MdjsProcessPlugin */ + +const unified = require('unified'); +const markdown = require('remark-parse'); +const remark2rehype = require('remark-rehype'); +const raw = require('rehype-raw'); +const htmlStringify = require('rehype-stringify'); +const htmlSlug = require('rehype-slug'); +const htmlHeading = require('rehype-autolink-headings'); +const rehypePrism = require('rehype-prism-template'); +// @ts-ignore +const { executeSetupFunctions } = require('plugins-manager'); + +const { mdjsParse } = require('./mdjsParse.js'); +const { mdjsStoryParse } = require('./mdjsStoryParse.js'); + +/** @type {MdjsProcessPlugin[]} */ +const defaultMetaPlugins = [ + { name: 'markdown', plugin: markdown }, + { name: 'mdjsParse', plugin: mdjsParse }, + { name: 'mdjsStoryParse', plugin: mdjsStoryParse }, + // @ts-ignore + { name: 'remark2rehype', plugin: remark2rehype, options: { allowDangerousHtml: true } }, + // @ts-ignore + { name: 'rehypePrism', plugin: rehypePrism }, + // @ts-ignore + { name: 'raw', plugin: raw }, + // @ts-ignore + { name: 'htmlSlug', plugin: htmlSlug }, + // @ts-ignore + { name: 'htmlHeading', plugin: htmlHeading }, + // @ts-ignore + { name: 'htmlStringify', plugin: htmlStringify }, +]; + +/** + * Processes mdjs to html/js/stories + * + * Js code includes the linking between js and stories + * + * @param {string} mdjs + * @param {object} options + * @param {string} [options.rootNodeQueryCode] + * @param {function[]} [options.setupUnifiedPlugins] + * @param {MdjsProcessPlugin[]} [options.plugins] deprecated option use setupUnifiedPlugins instead + */ +async function mdjsProcess( + mdjs, + { rootNodeQueryCode = 'document', setupUnifiedPlugins = [] } = {}, +) { + const parser = unified(); + + const metaPlugins = executeSetupFunctions(setupUnifiedPlugins, defaultMetaPlugins); + + // @ts-ignore + for (const pluginObj of metaPlugins) { + parser.use(pluginObj.plugin, pluginObj.options); + } + + /** @type {unknown} */ + const parseResult = await parser.process(mdjs); + const result = /** @type {ParseResult} */ (parseResult); + + const { stories, jsCode } = result.data; + let fullJsCode = jsCode; + + if (stories && stories.length > 0) { + const storiesCode = stories.map(story => story.code).join('\n'); + + // @ts-ignore + const codePlugins = metaPlugins.filter(pluginObj => + ['markdown', 'remark2rehype', 'rehypePrism', 'htmlStringify'].includes(pluginObj.name), + ); + const codeParser = unified(); + // @ts-ignore + for (const pluginObj of codePlugins) { + codeParser.use(pluginObj.plugin, pluginObj.options); + } + + const invokeStoriesCode = []; + for (const story of stories) { + let code = ''; + switch (story.type) { + case 'html': + code = `\`\`\`html\n${story.code.split('`')[1]}\n\`\`\``; + break; + case 'js': + code = `\`\`\`js\n${story.code}\n\`\`\``; + break; + default: + break; + } + const codeResult = await codeParser.process(code); + const highlightedCode = /** @type {string} */ (codeResult.contents) + .replace(/`/g, '\\`') + .replace(/\$/g, '\\$'); + invokeStoriesCode.push( + `{ key: '${story.key}', story: ${story.key}, code: \`${highlightedCode}\` }`, + ); + } + + fullJsCode = [ + jsCode, + storiesCode, + `const rootNode = ${rootNodeQueryCode};`, + `const stories = [${invokeStoriesCode.join(', ')}];`, + `for (const story of stories) {`, + // eslint-disable-next-line no-template-curly-in-string + ' const storyEl = rootNode.querySelector(`[mdjs-story-name="${story.key}"]`);', + ` storyEl.codeHasHtml = true;`, + ` storyEl.story = story.story;`, + ` storyEl.code = story.code;`, + `};`, + `if (!customElements.get('mdjs-preview')) { import('@mdjs/mdjs-preview/mdjs-preview.js'); }`, + `if (!customElements.get('mdjs-story')) { import('@mdjs/mdjs-story/mdjs-story.js'); }`, + ].join('\n'); + } + return { stories, jsCode: fullJsCode, html: result.contents }; +} + +module.exports = { + mdjsProcess, +}; diff --git a/packages/mdjs-core/src/mdjsStoryParse.js b/packages/mdjs-core/src/mdjsStoryParse.js new file mode 100644 index 00000000..bf2e9255 --- /dev/null +++ b/packages/mdjs-core/src/mdjsStoryParse.js @@ -0,0 +1,123 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +/** @typedef {import('@mdjs/core/types/code').Story} Story */ +/** @typedef {import('@mdjs/core/types/code').StoryTypes} StoryTypes */ +/** @typedef {(name: string) => string} TagFunction */ +/** @typedef {import('unist').Node} UnistNode */ +/** @typedef {import('vfile').VFileOptions} VFileOptions */ + +const visit = require('unist-util-visit'); +const { init, parse } = require('es-module-lexer'); + +/** + * @typedef {object} MDJSNodeProperties + * @property {string} value + * @property {'js'|'ts'|'html'} lang + * @property {'script'|'story'|'preview-story'} meta + */ + +/** @typedef {UnistNode & MDJSNodeProperties} MDJSNode */ + +/** + * @param {string} code + * @param {{type: StoryTypes}} options + * @returns {Story} + */ +function extractStoryData(code, { type = 'js' } = { type: 'js' }) { + const parsed = parse(code); + const key = parsed[1][0]; + const name = key; + return { key, name, code, type }; +} + +/** + * @param {string} name + */ +function defaultStoryTag(name) { + return ``; +} + +/** + * @param {string} name + */ +function defaultPreviewStoryTag(name) { + return ``; +} + +/** + * @param {object} arg + * @param {TagFunction} [arg.storyTag] + * @param {TagFunction} [arg.previewStoryTag] + * @param {number} [arg.counter] + */ +function mdjsStoryParse({ + storyTag = defaultStoryTag, + previewStoryTag = defaultPreviewStoryTag, +} = {}) { + /** @type {Story[]} */ + const stories = []; + let index = 0; + + /* eslint-disable no-param-reassign */ + + /** + * @param {UnistNode} node + */ + const nodeCodeVisitor = node => { + if (node.lang === 'js' && node.meta === 'story' && typeof node.value === 'string') { + const storyData = extractStoryData(node.value); + node.type = 'html'; + node.value = storyTag(storyData.name); + stories.push(storyData); + } + if (node.lang === 'js' && node.meta === 'preview-story' && typeof node.value === 'string') { + const storyData = extractStoryData(node.value); + node.type = 'html'; + node.value = previewStoryTag(storyData.name); + stories.push(storyData); + } + + if (node.lang === 'html' && node.meta === 'story') { + const storyData = extractStoryData( + `export const HtmlStory${index} = () => html\`${node.value}\`;`, + { type: 'html' }, + ); + node.type = 'html'; + node.value = storyTag(storyData.name); + stories.push(storyData); + index += 1; + } + if (node.lang === 'html' && node.meta === 'preview-story') { + const storyData = extractStoryData( + `export const HtmlStory${index} = () => html\`${node.value}\`;`, + { type: 'html' }, + ); + node.type = 'html'; + node.value = previewStoryTag(storyData.name); + stories.push(storyData); + index += 1; + } + }; + + /** + * @param {Node} tree + * @param {VFileOptions} file + */ + async function transformer(tree, file) { + // unifiedjs expects node changes to be made on the given node... + await init; + // @ts-ignore + visit(tree, 'code', nodeCodeVisitor); + // we can only return/modify the tree but stories should not be part of the tree + // so we attach it globally to the file.data + file.data.stories = stories; + + return tree; + } + + return transformer; + /* eslint-enable no-param-reassign */ +} + +module.exports = { + mdjsStoryParse, +}; diff --git a/packages/mdjs-core/test-node/integration.test.js b/packages/mdjs-core/test-node/integration.test.js new file mode 100644 index 00000000..0e48bb35 --- /dev/null +++ b/packages/mdjs-core/test-node/integration.test.js @@ -0,0 +1,118 @@ +/* eslint-disable no-template-curly-in-string */ + +const unified = require('unified'); +const markdown = require('remark-parse'); +const remark2rehype = require('remark-rehype'); +const htmlStringify = require('rehype-stringify'); +const htmlSlug = require('rehype-slug'); +const htmlHeading = require('rehype-autolink-headings'); +const raw = require('rehype-raw'); + +const mdSlug = require('remark-slug'); +const mdHeadings = require('remark-autolink-headings'); +const mdStringify = require('remark-html'); + +const chai = require('chai'); +const { mdjsParse } = require('../src/mdjsParse.js'); +const { mdjsStoryParse } = require('../src/mdjsStoryParse.js'); + +const { expect } = chai; + +/** @typedef {import("../src/mdjsParse.js").MDJSVFileData} MDJSVFileData */ + +describe('Integration', () => { + it('supports rehype slug, link, html', async () => { + const input = [ + '## Intro', + '## Intro', + '```js', + 'const foo = 1;', + '```', + '```js script', + 'const bar = 22;', + '```', + '```js story', + 'export const fooStory = () => {}', + '```', + '```js preview-story', + 'export const fooPreviewStory = () => {}', + '```', + ].join('\n'); + + const expected = [ + '

Intro

', + '

Intro

', + '
const foo = 1;',
+      '
', + '', + '', + ]; + + const parser = unified() + .use(markdown) + .use(mdjsParse) + .use(mdjsStoryParse) + .use(remark2rehype, { allowDangerousHtml: true }) + .use(raw) + .use(htmlSlug) + .use(htmlHeading) + .use(htmlStringify); + const result = await parser.process(input); + if (result.contents instanceof Buffer) throw new Error('contents should not be a buffer'); + expect(result.contents.split('\n')).to.deep.equal(expected); + expect(/** @type {MDJSVFileData} */ (result.data).jsCode).to.equal('const bar = 22;'); + }); + + it('supports JSX Code in markdown', async () => { + const input = [ + '## Intro', + '## Intro', + '```js', + 'const foo = 1;', + '```', + '```js story', + 'export const fooStory = () => {}', + '```', + '```js preview-story', + 'export const fooPreviewStory = () => {}', + '```', + ].join('\n'); + + const expected = [ + '

Intro

', + '

Intro

', + '
const foo = 1;',
+      '
', + '', + '', + '', + ].join('\n'); + + const parser = unified() + .use(markdown) + .use(mdjsParse) + .use(mdjsStoryParse, { + storyTag: name => ``, + previewStoryTag: name => ``, + }) + .use(mdSlug) + .use(mdHeadings) + .use(mdStringify); + const result = await parser.process(input); + expect(result.contents).to.equal(expected); + expect(/** @type {MDJSVFileData} */ (result.data).stories).to.deep.equal([ + { + key: 'fooStory', + name: 'fooStory', + code: 'export const fooStory = () => {}', + type: 'js', + }, + { + key: 'fooPreviewStory', + name: 'fooPreviewStory', + code: 'export const fooPreviewStory = () => {}', + type: 'js', + }, + ]); + }); +}); diff --git a/packages/mdjs-core/test-node/mdJsProcess.test.js b/packages/mdjs-core/test-node/mdJsProcess.test.js new file mode 100644 index 00000000..61a0ca18 --- /dev/null +++ b/packages/mdjs-core/test-node/mdJsProcess.test.js @@ -0,0 +1,139 @@ +/* eslint-disable no-template-curly-in-string */ + +const chai = require('chai'); +const { mdjsProcess } = require('../src/mdjsProcess.js'); + +const { expect } = chai; + +describe('mdjsProcess', () => { + const input = [ + 'Intro', + '```js', + 'const foo = 1;', + '```', + '```js script', + 'const bar = 2;', + '```', + '```js story', + 'export const fooStory = () => {}', + '```', + '```js preview-story', + 'export const fooPreviewStory = () => {}', + '```', + ].join('\n'); + + it('extracts code blocks with "js story" and "js preview-story" and places marker tags', async () => { + const expected = [ + '

Intro

', + '
const foo = 1;',
+      '
', + '', + '', + ].join('\n'); + const expectedJsCode = [ + 'const bar = 2;', + 'export const fooStory = () => {}', + 'export const fooPreviewStory = () => {}', + 'const rootNode = document;', + `const stories = [{ key: 'fooStory', story: fooStory, code: \`
export const fooStory = () => {}`,
+      `
\` }, { key: 'fooPreviewStory', story: fooPreviewStory, code: \`
export const fooPreviewStory = () => {}`,
+      `
\` }];`, + 'for (const story of stories) {', + ' const storyEl = rootNode.querySelector(`[mdjs-story-name="${story.key}"]`);', + ' storyEl.codeHasHtml = true;', + ' storyEl.story = story.story;', + ' storyEl.code = story.code;', + '};', + `if (!customElements.get('mdjs-preview')) { import('@mdjs/mdjs-preview/mdjs-preview.js'); }`, + `if (!customElements.get('mdjs-story')) { import('@mdjs/mdjs-story/mdjs-story.js'); }`, + ].join('\n'); + + const result = await mdjsProcess(input); + expect(result.html).to.equal(expected); + expect(result.jsCode).to.equal(expectedJsCode); + }); + + it('has no js code if there are no stories', async () => { + const result = await mdjsProcess('## Intro'); + expect(result.html).to.equal( + '

Intro

', + ); + expect(result.jsCode).to.equal(''); + }); + + it('handles files which have js but no stories', async () => { + const md = [ + // + '## Intro', + '```js script', + 'const bar = 2;', + '```', + ].join('\n'); + + const result = await mdjsProcess(md); + expect(result.html).to.equal( + '

Intro

', + ); + expect(result.jsCode).to.equal('const bar = 2;'); + }); + + it('can setup all unified plugins via "setupUnifiedPlugins" which accepts a single function or an array of functions', async () => { + const expected = [ + '

Intro

', + '
const foo = 1;',
+      '
', + '', + '', + ].join('\n'); + + function replaceStoryTag(plugins) { + return plugins.map(pluginObj => { + if (pluginObj.name === 'mdjsStoryParse') { + return { + ...pluginObj, + options: { + storyTag: name => ``, + previewStoryTag: name => ``, + }, + }; + } + return pluginObj; + }); + } + + const result = await mdjsProcess(input, { + setupUnifiedPlugins: [replaceStoryTag], + }); + expect(result.html).to.equal(expected); + + // Works with arrays + + const expectedForArray = [ + '

Intro

', + '
const foo = 1;',
+      '
', + '', + '', + ].join('\n'); + + function replaceStoryTag2(plugins) { + return plugins.map(pluginObj => { + if (pluginObj.name === 'mdjsStoryParse') { + return { + ...pluginObj, + options: { + storyTag: name => ``, + previewStoryTag: name => ``, + }, + }; + } + return pluginObj; + }); + } + + const resultOfArray = await mdjsProcess(input, { + setupUnifiedPlugins: [replaceStoryTag, replaceStoryTag2], + }); + expect(resultOfArray.html).to.equal(expectedForArray); + }); +}); diff --git a/packages/mdjs-core/test-node/mdjsParse.test.js b/packages/mdjs-core/test-node/mdjsParse.test.js new file mode 100644 index 00000000..5ca290b0 --- /dev/null +++ b/packages/mdjs-core/test-node/mdjsParse.test.js @@ -0,0 +1,44 @@ +const unified = require('unified'); +const markdown = require('remark-parse'); +const html = require('remark-html'); + +const chai = require('chai'); +const { mdjsParse } = require('../src/mdjsParse.js'); + +const { expect } = chai; + +/** @typedef {import("../src/mdjsParse.js").MDJSVFileData} MDJSVFileData */ + +describe('mdjsParse', () => { + it('extracts only "js script" code blocks', async () => { + const input = [ + '## Intro', + '```js', + 'const foo = 1;', + '```', + '```js script', + 'const bar = 22;', + '```', + ].join('\n'); + const parser = unified().use(markdown).use(mdjsParse).use(html); + const result = await parser.process(input); + expect(result.contents).to.equal( + '

Intro

\n
const foo = 1;\n
\n', + ); + expect(/** @type {MDJSVFileData} */ (result.data).jsCode).to.equal('const bar = 22;'); + }); + + // TODO: fix this bug + it.skip('handling only "js script" code blocks', async () => { + const input = [ + // + '```js script', + 'const bar = 22;', + '```', + ].join('\n'); + const parser = unified().use(markdown).use(mdjsParse).use(html); + const result = await parser.process(input); + expect(result.contents).to.equal(''); + expect(/** @type {MDJSVFileData} */ (result.data).jsCode).to.equal('const bar = 22;'); + }); +}); diff --git a/packages/mdjs-core/test-node/mdjsStoryParse.test.js b/packages/mdjs-core/test-node/mdjsStoryParse.test.js new file mode 100644 index 00000000..e8b24cdc --- /dev/null +++ b/packages/mdjs-core/test-node/mdjsStoryParse.test.js @@ -0,0 +1,99 @@ +/* eslint-disable no-template-curly-in-string */ + +const unified = require('unified'); +const markdown = require('remark-parse'); +const html = require('remark-html'); + +const chai = require('chai'); +const { mdjsStoryParse } = require('../src/mdjsStoryParse.js'); + +const { expect } = chai; + +/** @typedef {import("../src/mdjsParse.js").MDJSVFileData} MDJSVFileData */ + +describe('mdjsStoryParse', () => { + const input = [ + '## Intro', + '```js', + 'const foo = 1;', + '```', + '```js story', + 'export const fooStory = () => {}', + '```', + '```js preview-story', + 'export const fooPreviewStory = () => {}', + '```', + '```html story', + '', + '```', + '```html preview-story', + '', + '```', + ].join('\n'); + + it('extracts code blocks with "js/html story" and "js/html preview-story" and places marker tags', async () => { + const expected = [ + '

Intro

', + '
const foo = 1;',
+      '
', + '', + '', + '', + '', + '', + ].join('\n'); + + const parser = unified().use(markdown).use(mdjsStoryParse).use(html); + const result = await parser.process(input); + expect(result.contents).to.equal(expected); + expect(/** @type {MDJSVFileData} */ (result.data).stories).to.deep.equal([ + { + key: 'fooStory', + name: 'fooStory', + code: 'export const fooStory = () => {}', + type: 'js', + }, + { + key: 'fooPreviewStory', + name: 'fooPreviewStory', + code: 'export const fooPreviewStory = () => {}', + type: 'js', + }, + { + key: 'HtmlStory0', + name: 'HtmlStory0', + code: 'export const HtmlStory0 = () => html``;', + type: 'html', + }, + { + key: 'HtmlStory1', + name: 'HtmlStory1', + code: 'export const HtmlStory1 = () => html``;', + type: 'html', + }, + ]); + }); + + it('allows to configure the marker tags', async () => { + const expected = [ + '

Intro

', + '
const foo = 1;',
+      '
', + '', + '', + '', + '', + '', + ].join('\n'); + + const parser = unified() + .use(markdown) + .use(mdjsStoryParse, { + storyTag: name => ``, + previewStoryTag: name => ``, + }) + .use(html); + const result = await parser.process(input); + expect(result.contents).to.equal(expected); + }); +}); diff --git a/packages/mdjs-core/tsconfig.json b/packages/mdjs-core/tsconfig.json new file mode 100644 index 00000000..5d41ef41 --- /dev/null +++ b/packages/mdjs-core/tsconfig.json @@ -0,0 +1,34 @@ +// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts + +{ + "extends": "../../tsconfig.node-base.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "./dist-types", + "rootDir": ".", + "composite": true, + "allowJs": true, + "checkJs": true, + "emitDeclarationOnly": true + }, + "references": [ + { + "path": "../mdjs-preview/tsconfig.json" + }, + { + "path": "../mdjs-story/tsconfig.json" + }, + { + "path": "../plugins-manager/tsconfig.json" + } + ], + "include": [ + "src", + "*.js", + "types" + ], + "exclude": [ + "dist", + "dist-types" + ] +} \ No newline at end of file diff --git a/packages/mdjs-core/types/code.d.ts b/packages/mdjs-core/types/code.d.ts new file mode 100644 index 00000000..071af40e --- /dev/null +++ b/packages/mdjs-core/types/code.d.ts @@ -0,0 +1,35 @@ +import unified from 'unified'; + +export type StoryTypes = 'js' | 'html'; + +export interface MarkdownResult { + html: string; + jsCode: string; + stories: Story[]; +} + +export interface Story { + key: string; + name: string; + code: string; + type?: StoryTypes; +} + +export interface ProcessResult { + jsCode: string; + allHtml: string[]; +} + +export interface ParseResult { + contents: string; + data: { + stories: Story[]; + jsCode: string; + }; +} + +export interface MdjsProcessPlugin { + name: string; + plugin: unified.Plugin; + options?: unified.Settings; +} diff --git a/packages/mdjs-core/types/es-module-lexer.d.ts b/packages/mdjs-core/types/es-module-lexer.d.ts new file mode 100644 index 00000000..b2f27d1b --- /dev/null +++ b/packages/mdjs-core/types/es-module-lexer.d.ts @@ -0,0 +1,7 @@ +declare module 'es-module-lexer' { + export const init: Promise; + export function parse( + code: string, + importer?: string, + ): [{ s: number; e: number; ss: number; se: number; d: number }[], string[]]; +} diff --git a/packages/mdjs-core/types/remark.d.ts b/packages/mdjs-core/types/remark.d.ts new file mode 100644 index 00000000..1396feec --- /dev/null +++ b/packages/mdjs-core/types/remark.d.ts @@ -0,0 +1,43 @@ +declare module 'remark-rehype' { + import unified from 'unified'; + + export = unified.Plugin; +} + +declare module 'rehype-raw' { + import unified from 'unified'; + + export = unified.Plugin; +} + +declare module 'rehype-stringify' { + import unified from 'unified'; + + export = unified.Plugin; +} + +declare module 'rehype-slug' { + import unified from 'unified'; + + export = unified.Plugin; +} + +declare module 'rehype-autolink-headings' { + import unified from 'unified'; + + export = unified.Plugin; +} + +declare module 'rehype-prism-template' { + import unified from 'unified'; + + export = unified.Plugin; +} + +declare module 'unist-util-remove' { + import unified from 'unified'; + + function remove(ast: unified.Node, opts: any, test?: any): unified.Node; + + export = remove; +} diff --git a/packages/mdjs-preview/CHANGELOG.md b/packages/mdjs-preview/CHANGELOG.md new file mode 100644 index 00000000..5f1fb609 --- /dev/null +++ b/packages/mdjs-preview/CHANGELOG.md @@ -0,0 +1,6 @@ +# @mdjs/mdjs-preview + +## 0.3.0 +### Minor Changes + +- 15e0abe: Clean up dependencies - add Types diff --git a/packages/mdjs-preview/README.md b/packages/mdjs-preview/README.md new file mode 100644 index 00000000..8056d5f8 --- /dev/null +++ b/packages/mdjs-preview/README.md @@ -0,0 +1,3 @@ +# Preview element for Mdjs + +For docs please see our homepage [https://rocket.modern-web.dev/docs/markdown-javascript/preview/](https://rocket.modern-web.dev/docs/markdown-javascript/preview/). diff --git a/packages/mdjs-preview/index.js b/packages/mdjs-preview/index.js new file mode 100644 index 00000000..666e1aba --- /dev/null +++ b/packages/mdjs-preview/index.js @@ -0,0 +1 @@ +export { MdJsPreview } from './src/MdJsPreview.js'; diff --git a/packages/mdjs-preview/mdjs-preview.js b/packages/mdjs-preview/mdjs-preview.js new file mode 100644 index 00000000..ad19522a --- /dev/null +++ b/packages/mdjs-preview/mdjs-preview.js @@ -0,0 +1,3 @@ +import { MdJsPreview } from './src/MdJsPreview.js'; + +customElements.define('mdjs-preview', MdJsPreview); diff --git a/packages/mdjs-preview/package.json b/packages/mdjs-preview/package.json new file mode 100644 index 00000000..5fc974c0 --- /dev/null +++ b/packages/mdjs-preview/package.json @@ -0,0 +1,38 @@ +{ + "name": "@mdjs/mdjs-preview", + "version": "0.3.0", + "publishConfig": { + "access": "public" + }, + "description": "Rendering storybook story functions inside a preview window with show code capabilities", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/rocket.git", + "directory": "packages/mdjs-preview" + }, + "author": "Modern Web (https://modern-web.dev/)", + "homepage": "https://rocket.modern-web.dev/docs/markdown-javascript/preview/", + "type": "module", + "exports": { + ".": "./index.js", + "./mdjs-preview.js": "./mdjs-preview.js" + }, + "scripts": { + "debug": "cd ../../ && npm run debug -- --group mdjs-preview", + "test": "npm run test:web", + "test:watch": "onchange 'src/**/*.{js,cjs}' 'test-node/**/*.js' -- npm run test:node", + "test:web": "cd ../../ && npm run test:web -- --group mdjs-preview" + }, + "files": [ + "*.js", + "assets", + "dist-types", + "src" + ], + "dependencies": { + "lit-element": "^2.4.0", + "lit-html": "^1.3.0" + }, + "types": "dist-types/index.d.ts" +} diff --git a/packages/mdjs-preview/src/MdJsPreview.js b/packages/mdjs-preview/src/MdJsPreview.js new file mode 100644 index 00000000..6fb756d2 --- /dev/null +++ b/packages/mdjs-preview/src/MdJsPreview.js @@ -0,0 +1,165 @@ +import { LitElement, html, css } from 'lit-element'; +import { unsafeHTML } from 'lit-html/directives/unsafe-html.js'; + +export class MdJsPreview extends LitElement { + static get properties() { + return { + story: { + attribute: false, + }, + code: { + type: String, + }, + codeHasHtml: { + type: Boolean, + }, + showCode: { + type: Boolean, + attribute: 'show-code', + reflect: true, + }, + }; + } + + toggleShowCode() { + this.showCode = !this.showCode; + } + + constructor() { + super(); + this.code = ''; + this.story = () => html`

Loading...

`; + this.codeHasHtml = false; + } + + render() { + return html` +
+
${this.story()}
+ +
+ ${this.codeHasHtml ? unsafeHTML(this.code) : html`
${this.code}
`} + `; + } + + static get styles() { + return css` + :host { + border: 1px solid #ccc; + display: block; + box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; + } + + #showCodeButton { + position: absolute; + right: 5px; + bottom: 5px; + font-size: 12px; + line-height: 20px; + color: #24292e; + background-color: #eff3f6; + background-image: linear-gradient(-180deg, #fafbfc, #eff3f6 90%); + display: inline-block; + padding: 3px 12px; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-repeat: repeat-x; + background-position: -1px -1px; + background-size: 110% 110%; + border: 1px solid rgba(27, 31, 35, 0.2); + border-radius: 0.25em; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + } + + #showCodeButton:hover { + background-color: #e6ebf1; + background-image: linear-gradient(-180deg, #f0f3f6, #e6ebf1 90%); + background-position: -0.5em; + border-color: rgba(27, 31, 35, 0.35); + text-decoration: none; + background-repeat: repeat-x; + } + + #wrapper { + position: relative; + padding: 10px; + } + + :host > pre { + display: none; + margin: 0; + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: #f6f8fa; + border-radius: 3px; + } + + :host([show-code]) > pre { + display: block; + } + + code[class*='language-'], + pre[class*='language-'] { + color: #393a34; + font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + tab-size: 4; + hyphens: none; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: #f6f8fa; + border-radius: 3px; + } + + .token.function, + .token.class-name { + color: #6f42c1; + } + + .token.tag, + .token.selector, + .language-autohotkey .token.keyword { + color: #22863a; + } + + .token.entity, + .token.url, + .token.symbol, + .token.number, + .token.boolean, + .token.variable, + .token.constant, + .token.property, + .token.inserted, + .token.punctuation, + .token.operator { + color: #005cc5; + } + + .token.regex { + color: #032f62; + } + + .token.atrule, + .token.keyword, + .token.attr-name, + .language-autohotkey .token.selector { + color: #d73a49; + } + `; + } +} diff --git a/packages/mdjs-preview/tsconfig.json b/packages/mdjs-preview/tsconfig.json new file mode 100644 index 00000000..adf91217 --- /dev/null +++ b/packages/mdjs-preview/tsconfig.json @@ -0,0 +1,24 @@ +// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts + +{ + "extends": "../../tsconfig.browser-base.json", + "compilerOptions": { + "module": "ESNext", + "outDir": "./dist-types", + "rootDir": ".", + "composite": true, + "allowJs": true, + "checkJs": true, + "emitDeclarationOnly": true + }, + "references": [], + "include": [ + "src", + "*.js", + "types" + ], + "exclude": [ + "dist", + "dist-types" + ] +} \ No newline at end of file diff --git a/packages/mdjs-story/CHANGELOG.md b/packages/mdjs-story/CHANGELOG.md new file mode 100644 index 00000000..9aace1cb --- /dev/null +++ b/packages/mdjs-story/CHANGELOG.md @@ -0,0 +1,6 @@ +# @mdjs/mdjs-story + +## 0.1.0 +### Minor Changes + +- 15e0abe: Clean up dependencies - add Types diff --git a/packages/mdjs-story/README.md b/packages/mdjs-story/README.md new file mode 100644 index 00000000..f49390fa --- /dev/null +++ b/packages/mdjs-story/README.md @@ -0,0 +1,3 @@ +# Story element for Mdjs + +For docs please see our homepage [https://rocket.modern-web.dev/docs/markdown-javascript/story/](https://rocket.modern-web.dev/docs/markdown-javascript/story/). diff --git a/packages/mdjs-story/index.js b/packages/mdjs-story/index.js new file mode 100644 index 00000000..65402f57 --- /dev/null +++ b/packages/mdjs-story/index.js @@ -0,0 +1 @@ +export { MdJsStory } from './src/MdJsStory.js'; diff --git a/packages/mdjs-story/mdjs-story.js b/packages/mdjs-story/mdjs-story.js new file mode 100644 index 00000000..5be9cefc --- /dev/null +++ b/packages/mdjs-story/mdjs-story.js @@ -0,0 +1,3 @@ +import { MdJsStory } from './src/MdJsStory.js'; + +customElements.define('mdjs-story', MdJsStory); diff --git a/packages/mdjs-story/package.json b/packages/mdjs-story/package.json new file mode 100644 index 00000000..8f3f1d98 --- /dev/null +++ b/packages/mdjs-story/package.json @@ -0,0 +1,37 @@ +{ + "name": "@mdjs/mdjs-story", + "version": "0.1.0", + "publishConfig": { + "access": "public" + }, + "description": "Rendering storybook story functions inside a story window with show code capabilities", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/rocket.git", + "directory": "packages/mdjs-story" + }, + "author": "Modern Web (https://modern-web.dev/)", + "homepage": "https://rocket.modern-web.dev/docs/markdown-javascript/story/", + "type": "module", + "exports": { + ".": "./index.js", + "./mdjs-story.js": "./mdjs-story.js" + }, + "scripts": { + "debug": "cd ../../ && npm run debug -- --group mdjs-story", + "test": "npm run test:web", + "test:watch": "onchange 'src/**/*.{js,cjs}' 'test-node/**/*.js' -- npm run test:node", + "test:web": "cd ../../ && npm run test:web -- --group mdjs-story" + }, + "files": [ + "*.js", + "assets", + "dist-types", + "src" + ], + "dependencies": { + "lit-element": "^2.4.0" + }, + "types": "dist-types/index.d.ts" +} diff --git a/packages/mdjs-story/src/MdJsStory.js b/packages/mdjs-story/src/MdJsStory.js new file mode 100644 index 00000000..96527be1 --- /dev/null +++ b/packages/mdjs-story/src/MdJsStory.js @@ -0,0 +1,20 @@ +import { LitElement, html } from 'lit-element'; + +export class MdJsStory extends LitElement { + static get properties() { + return { + story: { + attribute: false, + }, + }; + } + + constructor() { + super(); + this.story = () => html`

Loading...

`; + } + + render() { + return this.story(); + } +} diff --git a/packages/mdjs-story/tsconfig.json b/packages/mdjs-story/tsconfig.json new file mode 100644 index 00000000..adf91217 --- /dev/null +++ b/packages/mdjs-story/tsconfig.json @@ -0,0 +1,24 @@ +// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts + +{ + "extends": "../../tsconfig.browser-base.json", + "compilerOptions": { + "module": "ESNext", + "outDir": "./dist-types", + "rootDir": ".", + "composite": true, + "allowJs": true, + "checkJs": true, + "emitDeclarationOnly": true + }, + "references": [], + "include": [ + "src", + "*.js", + "types" + ], + "exclude": [ + "dist", + "dist-types" + ] +} \ No newline at end of file diff --git a/packages/navigation/README.md b/packages/navigation/README.md new file mode 100644 index 00000000..645263c8 --- /dev/null +++ b/packages/navigation/README.md @@ -0,0 +1,3 @@ +# Rocket Navigation + +For navigation on [Rocket Sites](https://rocket.modern-web.dev/). diff --git a/packages/navigation/index.js b/packages/navigation/index.js new file mode 100644 index 00000000..52c7bb39 --- /dev/null +++ b/packages/navigation/index.js @@ -0,0 +1 @@ +export { RocketNavigation } from './src/RocketNavigation.js'; diff --git a/packages/navigation/package.json b/packages/navigation/package.json new file mode 100644 index 00000000..3db31616 --- /dev/null +++ b/packages/navigation/package.json @@ -0,0 +1,37 @@ +{ + "name": "@rocket/navigation", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "description": "Rocket stuff", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/rocket.git", + "directory": "packages/navgiation" + }, + "author": "Modern Web (https://modern-web.dev/)", + "main": "index.js", + "type": "module", + "exports": { + ".": "./index.js", + "./rocket-navigation.js": "./rocket-navigation.js" + }, + "scripts": { + "debug": "cd ../../ && npm run debug -- --group navigation", + "test": "npm run test:web", + "test:web": "cd ../../ && npm run test:web -- --group navigation" + }, + "files": [ + "*.d.ts", + "*.js", + "dist-types", + "src" + ], + "keywords": [ + "rocket", + "navigation" + ], + "types": "dist-types/index.js" +} diff --git a/packages/navigation/rocket-navigation.js b/packages/navigation/rocket-navigation.js new file mode 100644 index 00000000..2931778f --- /dev/null +++ b/packages/navigation/rocket-navigation.js @@ -0,0 +1,3 @@ +import { RocketNavigation } from './src/RocketNavigation.js'; + +customElements.define('rocket-navigation', RocketNavigation); diff --git a/packages/navigation/src/RocketNavigation.js b/packages/navigation/src/RocketNavigation.js new file mode 100644 index 00000000..6928a3ea --- /dev/null +++ b/packages/navigation/src/RocketNavigation.js @@ -0,0 +1,72 @@ +/** + * @typedef {object} NavigationListItem + * @property {HTMLElement} headline + * @property {HTMLAnchorElement} anchor + * @property {number} top + */ + +export class RocketNavigation extends HTMLElement { + constructor() { + super(); + /** @type NavigationListItem[] */ + this.list = []; + this.__scrollHandler = this.__scrollHandler.bind(this); + } + + connectedCallback() { + this.addEventListener('click', ev => { + const el = /** @type {HTMLElement} */ (ev.target); + if (el.classList.contains('anchor')) { + this.dispatchEvent(new Event('close-overlay', { bubbles: true })); + } + const links = el.parentElement?.querySelectorAll('ul a'); + if (links && links.length > 1) { + const subLink = /** @type {HTMLAnchorElement} */ (links[1]); + if (!subLink.classList.contains('anchor')) { + ev.preventDefault(); + subLink.click(); + } + } + }); + + const anchors = /** @type {NodeListOf} */ (this.querySelectorAll( + 'li.current a.anchor', + )); + + for (const anchor of anchors) { + const headline = document.getElementById(anchor.hash.substring(1)); + if (headline) { + this.list.push({ + top: headline.getBoundingClientRect().top, + headline, + anchor, + }); + } + } + + // TODO: debounce + window.addEventListener('scroll', this.__scrollHandler); + + this.__scrollHandler(); + } + + __scrollHandler() { + for (const listObj of this.list) { + listObj.top = listObj.headline.getBoundingClientRect().top; + } + + const sorted = this.list.sort((a, b) => Math.abs(a.top) - Math.abs(b.top)); + + for (let i = 0; i < sorted.length; i += 1) { + if (i === 0) { + sorted[0]?.anchor?.parentElement?.classList.add('current'); + } else { + sorted[i]?.anchor?.parentElement?.classList.remove('current'); + } + } + } + + disconnectedCallback() { + window.removeEventListener('scroll', this.__scrollHandler); + } +} diff --git a/packages/navigation/test-web/rocket-navigation.test.js b/packages/navigation/test-web/rocket-navigation.test.js new file mode 100644 index 00000000..2c4a1e2c --- /dev/null +++ b/packages/navigation/test-web/rocket-navigation.test.js @@ -0,0 +1,117 @@ +import { aTimeout, expect, fixture, html } from '@open-wc/testing'; +import sinon from 'sinon'; +import '../rocket-navigation.js'; + +describe('rocket-navigation', () => { + it('fires a "close-overlay" event if you click on an anchor', async () => { + const spy = sinon.spy(); + const el = await fixture(html` + + + + `); + const anchor = el.querySelector('.anchor'); + anchor.click(); + expect(spy).to.have.been.calledOnce; + }); + + it('will navigate to the first sub page if there is one that is not an anchor', async () => { + const pageSpy = sinon.spy(); + const anchorSpy = sinon.spy(); + + const el = await fixture(html` + + + + `); + const links = el.querySelectorAll('rocket-navigation > ul > li > a'); + links[0].click(); + expect(pageSpy).to.be.calledOnce; + + links[1].click(); + expect(anchorSpy).to.not.be.called; + }); + + it('will mark the currently "active" headline in the menu', async () => { + function addBlock(headline, length = 5) { + return html` +

${headline}

+ ${new Array(length).fill(html`

text content

`)} + `; + } + + const wrapper = await fixture(html` +
+ + + +
+ ${addBlock('top', 10)} ${addBlock('middle', 30)} ${addBlock('bottom', 10)} +
+
+ + `); + await aTimeout(0); + const anchorLis = wrapper.querySelectorAll('.menu-item.anchor'); + expect(anchorLis[0]).to.have.class('current'); + expect(anchorLis[1]).to.not.have.class('current'); + expect(anchorLis[2]).to.not.have.class('current'); + + document.querySelector('#middle').scrollIntoView(); + await aTimeout(20); + expect(anchorLis[0]).to.not.have.class('current'); + expect(anchorLis[1]).to.have.class('current'); + expect(anchorLis[2]).to.not.have.class('current'); + + document.querySelector('#bottom').scrollIntoView(); + await aTimeout(20); + expect(anchorLis[0]).to.not.have.class('current'); + expect(anchorLis[1]).to.not.have.class('current'); + expect(anchorLis[2]).to.have.class('current'); + }); +}); diff --git a/packages/navigation/tsconfig.json b/packages/navigation/tsconfig.json new file mode 100644 index 00000000..adf91217 --- /dev/null +++ b/packages/navigation/tsconfig.json @@ -0,0 +1,24 @@ +// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts + +{ + "extends": "../../tsconfig.browser-base.json", + "compilerOptions": { + "module": "ESNext", + "outDir": "./dist-types", + "rootDir": ".", + "composite": true, + "allowJs": true, + "checkJs": true, + "emitDeclarationOnly": true + }, + "references": [], + "include": [ + "src", + "*.js", + "types" + ], + "exclude": [ + "dist", + "dist-types" + ] +} \ No newline at end of file diff --git a/packages/plugins-manager/CHANGELOG.md b/packages/plugins-manager/CHANGELOG.md new file mode 100644 index 00000000..bfc86ae5 --- /dev/null +++ b/packages/plugins-manager/CHANGELOG.md @@ -0,0 +1,6 @@ +# plugins-manager + +## 0.1.0 +### Minor Changes + +- b9a6274: First initial release diff --git a/packages/plugins-manager/README.md b/packages/plugins-manager/README.md new file mode 100644 index 00000000..d22c3a29 --- /dev/null +++ b/packages/plugins-manager/README.md @@ -0,0 +1,6 @@ +# Plugins Manager + +The Plugins Manager replaces the specific registration/execution (with options) in a given plugin system by an intend to use a plugin (with these options). +This allows your users to adjust the options before actually applying the plugins. + +For docs please see our homepage [https://rocket.modern-web.dev/docs/plugins-manager/overview/](https://rocket.modern-web.dev/docs/plugins-manager/overview/). diff --git a/packages/plugins-manager/index.js b/packages/plugins-manager/index.js new file mode 100644 index 00000000..8403d650 --- /dev/null +++ b/packages/plugins-manager/index.js @@ -0,0 +1,7 @@ +/** @typedef {import('./types/main').MetaPlugin} MetaPlugin */ + +export { addPlugin } from './src/addPlugin.js'; +export { adjustPluginOptions } from './src/adjustPluginOptions.js'; +export { metaConfigToRollupConfig } from './src/metaConfigToRollupConfig.js'; +export { metaConfigToWebDevServerConfig } from './src/metaConfigToWebDevServerConfig.js'; +export { executeSetupFunctions } from './src/executeSetupFunctions.js'; diff --git a/packages/plugins-manager/package.json b/packages/plugins-manager/package.json new file mode 100644 index 00000000..94716690 --- /dev/null +++ b/packages/plugins-manager/package.json @@ -0,0 +1,36 @@ +{ + "name": "plugins-manager", + "version": "0.1.0", + "publishConfig": { + "access": "public" + }, + "description": "Helper for handling Plugins", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/rocket.git", + "directory": "packages/plugins-manager" + }, + "author": "Modern Web (https://modern-web.dev/)", + "homepage": "https://rocket.modern-web.dev/docs/tools/plugins-manager/", + "type": "module", + "exports": { + ".": { + "require": "./dist/index.cjs", + "default": "./index.js" + } + }, + "scripts": { + "build:package": "rimraf dist && esbuild --platform=node --format=cjs --bundle --outfile=dist/index.cjs ./index.js", + "test": "mocha --timeout 5000 test-node/**/*.test.{js,cjs} test-node/*.test.{js,cjs}", + "test:watch": "onchange 'src/**/*.{js,cjs}' 'test-node/**/*.{js,cjs}' -- npm test", + "types:copy": "copyfiles \"./types/**/*.d.ts\" dist-types/" + }, + "files": [ + "*.js", + "dist", + "dist-types", + "src" + ], + "types": "dist-types/index.d.ts" +} diff --git a/packages/plugins-manager/src/addPlugin.js b/packages/plugins-manager/src/addPlugin.js new file mode 100644 index 00000000..65c507ea --- /dev/null +++ b/packages/plugins-manager/src/addPlugin.js @@ -0,0 +1,60 @@ +/** @typedef {import('../types/main').MetaPlugin} MetaPlugin */ + +/** + * @param {object} options + * @param {string} options.name + * @param {any} options.plugin + * @param {any} [options.options] + * @param {string} [options.how] + * @param {string} [options.location] + */ +export function addPlugin({ + name, + plugin, + options = undefined, + how = 'after', + location = 'bottom', +}) { + /** + * @param {MetaPlugin[]} plugins + */ + const addPluginFn = plugins => { + if (plugins === undefined) { + plugins = []; + } + // only add if name is not already in the meta plugin list + if (plugins.findIndex(pluginObj => pluginObj.name === name) === -1) { + let index = -1; + let _how = how; + switch (location) { + case 'top': + index = 0; + _how = 'fixed'; + break; + case 'bottom': + index = plugins.length; + _how = 'fixed'; + break; + default: + index = plugins.findIndex(plugin => plugin.name === location); + } + if (index < 0) { + throw new Error( + `Could not find a plugin with the name "${location}" to insert "${name}" ${how} it.`, + ); + } + + if (_how === 'after') { + index += 1; + } + + plugins.splice(index, 0, { + name, + plugin, + options, + }); + } + return plugins; + }; + return addPluginFn; +} diff --git a/packages/plugins-manager/src/adjustPluginOptions.js b/packages/plugins-manager/src/adjustPluginOptions.js new file mode 100644 index 00000000..991d160b --- /dev/null +++ b/packages/plugins-manager/src/adjustPluginOptions.js @@ -0,0 +1,38 @@ +/** @typedef {import('../types/main').MetaPlugin} MetaPlugin */ + +/** + * @param {any} obj + */ +function isObject(obj) { + return typeof obj === 'object' && !!obj && !Array.isArray(obj); +} + +/** + * @param {string} pluginName + * @param {any} mergeOptions + */ +export function adjustPluginOptions(pluginName, mergeOptions) { + /** + * @param {MetaPlugin[]} plugins + */ + const adjustPluginOptionsFn = plugins => { + const index = plugins.findIndex(plugin => plugin.name === pluginName); + + if (index === -1) { + throw new Error( + `Could not find a plugin with the name "${pluginName}" to adjust the options.`, + ); + } + + if (typeof mergeOptions === 'function') { + plugins[index].options = mergeOptions(plugins[index].options); + } else if (isObject(plugins[index].options)) { + plugins[index].options = { ...plugins[index].options, ...mergeOptions }; + } else { + plugins[index].options = mergeOptions; + } + + return plugins; + }; + return adjustPluginOptionsFn; +} diff --git a/packages/plugins-manager/src/executeSetupFunctions.js b/packages/plugins-manager/src/executeSetupFunctions.js new file mode 100644 index 00000000..6c441ea7 --- /dev/null +++ b/packages/plugins-manager/src/executeSetupFunctions.js @@ -0,0 +1,16 @@ +/** @typedef {import('../types/main').MetaPlugin} MetaPlugin */ + +/** + * @param {function[]} setupFunctions + * @param {MetaPlugin[]} metaPlugins + * @return {MetaPlugin[]} + */ +export function executeSetupFunctions(setupFunctions, metaPlugins = []) { + let _metaPlugins = [...metaPlugins]; + if (Array.isArray(setupFunctions)) { + for (const setupFn of setupFunctions) { + _metaPlugins = setupFn(_metaPlugins); + } + } + return _metaPlugins; +} diff --git a/packages/plugins-manager/src/metaConfigToRollupConfig.js b/packages/plugins-manager/src/metaConfigToRollupConfig.js new file mode 100644 index 00000000..42c8f4c4 --- /dev/null +++ b/packages/plugins-manager/src/metaConfigToRollupConfig.js @@ -0,0 +1,23 @@ +/** @typedef {import('../types/main').MetaPlugin} MetaPlugin */ + +import { executeSetupFunctions } from 'plugins-manager'; + +/** + * @param {any} config + * @param {MetaPlugin[]} [metaPlugins] + */ +export function metaConfigToRollupConfig(config, metaPlugins = []) { + const _metaPlugins = executeSetupFunctions(config.setupPlugins, [...metaPlugins]); + + const plugins = _metaPlugins.map(pluginObj => { + if (pluginObj.options) { + return pluginObj.plugin(pluginObj.options); + } else { + return pluginObj.plugin(); + } + }); + config.plugins = plugins; + + delete config.setupPlugins; + return config; +} diff --git a/packages/plugins-manager/src/metaConfigToWebDevServerConfig.js b/packages/plugins-manager/src/metaConfigToWebDevServerConfig.js new file mode 100644 index 00000000..e875b670 --- /dev/null +++ b/packages/plugins-manager/src/metaConfigToWebDevServerConfig.js @@ -0,0 +1,28 @@ +/** @typedef {import('../types/main').MetaPlugin} MetaPlugin */ + +import { executeSetupFunctions } from 'plugins-manager'; + +/** + * @param {any} config + * @param {MetaPlugin[]} metaPlugins + * @param {object} [options] + * @param {function | null} [options.wrapperFunction] + */ +export function metaConfigToWebDevServerConfig(config, metaPlugins, { wrapperFunction = null }) { + const _metaPlugins = executeSetupFunctions(config.setupPlugins, [...metaPlugins]); + + const plugins = _metaPlugins.map(pluginObj => { + const usePlugin = + typeof wrapperFunction === 'function' ? wrapperFunction(pluginObj.plugin) : pluginObj.plugin; + + if (pluginObj.options) { + return usePlugin(pluginObj.options); + } else { + return usePlugin(); + } + }); + config.plugins = plugins; + + delete config.setupPlugins; + return config; +} diff --git a/packages/plugins-manager/test-node/addPlugin.test.js b/packages/plugins-manager/test-node/addPlugin.test.js new file mode 100644 index 00000000..5d8381d2 --- /dev/null +++ b/packages/plugins-manager/test-node/addPlugin.test.js @@ -0,0 +1,99 @@ +import chai from 'chai'; + +import { addPlugin, metaConfigToRollupConfig } from 'plugins-manager'; + +const { expect } = chai; + +describe('addPlugin', () => { + const insertPlugin = (options = 'insert') => `-- ${options}Plugin --`; + const oneExistingPlugin = [{ name: 'first', plugin: () => 'firstPlugin' }]; + const threeExistingPlugins = [ + { name: 'first', plugin: () => 'firstPlugin' }, + { name: 'second', plugin: () => 'secondPlugin' }, + { name: 'third', plugin: () => 'thirdPlugin' }, + ]; + + it('adds plugins at the bottom by default', async () => { + const config = metaConfigToRollupConfig({ + setupPlugins: [addPlugin({ name: 'insert', plugin: insertPlugin })], + }); + expect(config.plugins).to.deep.equal(['-- insertPlugin --']); + + const config2 = metaConfigToRollupConfig( + { + setupPlugins: [addPlugin({ name: 'insert', plugin: insertPlugin })], + }, + oneExistingPlugin, + ); + expect(config2.plugins).to.deep.equal(['firstPlugin', '-- insertPlugin --']); + }); + + it('can add at the top', async () => { + const config = metaConfigToRollupConfig( + { + setupPlugins: [addPlugin({ name: 'insert', plugin: insertPlugin, location: 'top' })], + }, + oneExistingPlugin, + ); + expect(config.plugins).to.deep.equal(['-- insertPlugin --', 'firstPlugin']); + }); + + it('handles inserting "before" the 0 index ', async () => { + const config = metaConfigToRollupConfig( + { + setupPlugins: [ + addPlugin({ name: 'insert', plugin: insertPlugin, location: 'top', how: 'before' }), + ], + }, + oneExistingPlugin, + ); + expect(config.plugins).to.deep.equal(['-- insertPlugin --', 'firstPlugin']); + }); + + it('adds after a given location by default', async () => { + const config = metaConfigToRollupConfig( + { + setupPlugins: [addPlugin({ name: 'insert', plugin: insertPlugin, location: 'second' })], + }, + threeExistingPlugins, + ); + expect(config.plugins).to.deep.equal([ + 'firstPlugin', + 'secondPlugin', + '-- insertPlugin --', + 'thirdPlugin', + ]); + }); + + it('can adds before a given location', async () => { + const config = metaConfigToRollupConfig( + { + setupPlugins: [ + addPlugin({ name: 'insert', plugin: insertPlugin, location: 'second', how: 'before' }), + ], + }, + threeExistingPlugins, + ); + expect(config.plugins).to.deep.equal([ + 'firstPlugin', + '-- insertPlugin --', + 'secondPlugin', + 'thirdPlugin', + ]); + }); + + it('throws if given location does not exist', async () => { + expect(() => { + metaConfigToRollupConfig({ + setupPlugins: [addPlugin({ name: 'insert', plugin: insertPlugin, location: 'not-found' })], + }); + }).to.throw('Could not find a plugin with the name "not-found" to insert "insert" after it.'); + }); + + it('accepts options', async () => { + const config = metaConfigToRollupConfig({ + setupPlugins: [addPlugin({ name: 'insert', plugin: insertPlugin, options: 'extra' })], + }); + expect(config.plugins).to.deep.equal(['-- extraPlugin --']); + }); +}); diff --git a/packages/plugins-manager/test-node/adjustPluginOptions.test.js b/packages/plugins-manager/test-node/adjustPluginOptions.test.js new file mode 100644 index 00000000..2ade20d9 --- /dev/null +++ b/packages/plugins-manager/test-node/adjustPluginOptions.test.js @@ -0,0 +1,81 @@ +import chai from 'chai'; + +import { adjustPluginOptions, metaConfigToRollupConfig } from 'plugins-manager'; + +const { expect } = chai; + +describe('adjustPluginOptions', () => { + const defaultCurrentMetaPlugins = [ + { + name: 'first', + plugin: options => `firstPlugin-${options.flag}`, + options: { flag: 'firstSettings' }, + }, + { + name: 'second', + plugin: options => `secondPlugin-${options.other.nested}-${options.other.nested2}`, + options: { other: { nested: 'other.nested', nested2: 'other.nested2' } }, + }, + { name: 'third', plugin: options => `thirdPlugin-${options}`, options: 'aString' }, + ]; + function newCurrentMetaPlugins() { + return defaultCurrentMetaPlugins.map(obj => ({ ...obj })); + } + + it('will merge options objects (flatly)', async () => { + const config = metaConfigToRollupConfig( + { + setupPlugins: [ + adjustPluginOptions('first', { flag: '#mod#FirstSettings' }), + adjustPluginOptions('second', { other: { nested: '#mod#other.nested' } }), + ], + }, + newCurrentMetaPlugins(), + ); + expect(config.plugins).to.deep.equal([ + 'firstPlugin-#mod#FirstSettings', + 'secondPlugin-#mod#other.nested-undefined', + 'thirdPlugin-aString', + ]); + }); + + it('will override non object settings', async () => { + const config = metaConfigToRollupConfig( + { + setupPlugins: [adjustPluginOptions('third', '#mod#aString')], + }, + newCurrentMetaPlugins(), + ); + expect(config.plugins).to.deep.equal([ + 'firstPlugin-firstSettings', + 'secondPlugin-other.nested-other.nested2', + 'thirdPlugin-#mod#aString', + ]); + }); + + it('accepts a function as a setting to manually merge objects', async () => { + const config = metaConfigToRollupConfig( + { + setupPlugins: [ + adjustPluginOptions('second', config => ({ + other: { ...config.other, nested: '#mod#other.nested' }, + })), + ], + }, + newCurrentMetaPlugins(), + ); + expect(config.plugins).to.deep.equal([ + 'firstPlugin-firstSettings', + 'secondPlugin-#mod#other.nested-other.nested2', + 'thirdPlugin-aString', + ]); + }); + + it('throws if given location does not exist', async () => { + expect(() => { + metaConfigToRollupConfig({ + setupPlugins: [adjustPluginOptions('not-found', '#mod#aString')], + }); + }).to.throw('Could not find a plugin with the name "not-found" to adjust the options.'); + }); +}); diff --git a/packages/plugins-manager/test-node/executeSetupFunction.test.js b/packages/plugins-manager/test-node/executeSetupFunction.test.js new file mode 100644 index 00000000..1c5a613e --- /dev/null +++ b/packages/plugins-manager/test-node/executeSetupFunction.test.js @@ -0,0 +1,35 @@ +import chai from 'chai'; + +import { executeSetupFunctions, addPlugin } from 'plugins-manager'; + +const { expect } = chai; + +describe('executeSetupFunctions', () => { + const firstPlugin = () => 'firstPlugin'; + const secondPlugin = () => 'secondPlugin'; + const thirdPlugin = () => 'thirdPlugin'; + + const threeExistingPlugin = [ + { name: 'first', plugin: firstPlugin }, + { name: 'second', plugin: secondPlugin }, + { name: 'third', plugin: thirdPlugin }, + ]; + + it('executes and returns a new array not adjusting the original', async () => { + const metaPlugins = executeSetupFunctions( + [ + addPlugin({ name: 'add-a', plugin: () => 'a' }), + addPlugin({ name: 'add-b', plugin: () => 'b' }), + ], + threeExistingPlugin, + ); + expect(metaPlugins.length).to.equal(5); + + // does not change original array + expect(threeExistingPlugin).to.deep.equal([ + { name: 'first', plugin: firstPlugin }, + { name: 'second', plugin: secondPlugin }, + { name: 'third', plugin: thirdPlugin }, + ]); + }); +}); diff --git a/packages/plugins-manager/test-node/metaConfigToRollupConfig.test.js b/packages/plugins-manager/test-node/metaConfigToRollupConfig.test.js new file mode 100644 index 00000000..55d83a28 --- /dev/null +++ b/packages/plugins-manager/test-node/metaConfigToRollupConfig.test.js @@ -0,0 +1,31 @@ +import chai from 'chai'; + +import { metaConfigToRollupConfig, addPlugin } from 'plugins-manager'; + +const { expect } = chai; + +describe('metaConfigToRollupConfig', () => { + const insertPlugin = () => `-- insertPlugin --`; + const oneExistingPlugin = [{ name: 'first', plugin: () => 'firstPlugin' }]; + const threeExistingPlugin = [ + { name: 'first', plugin: () => 'firstPlugin' }, + { name: 'second', plugin: () => 'secondPlugin' }, + { name: 'third', plugin: () => 'thirdPlugin' }, + ]; + + it('converts meta config by executing the plugins and assigning it to the config', async () => { + const config = metaConfigToRollupConfig({}, threeExistingPlugin); + expect(config.plugins).to.deep.equal(['firstPlugin', 'secondPlugin', 'thirdPlugin']); + }); + + it('incorporates "setupPlugin" functions in the config & removes "setupPlugins"', async () => { + const config = metaConfigToRollupConfig( + { + setupPlugins: [addPlugin({ name: 'insert', plugin: insertPlugin })], + }, + oneExistingPlugin, + ); + expect(config.plugins).to.deep.equal(['firstPlugin', '-- insertPlugin --']); + expect(config.setupPlugins).to.be.undefined; + }); +}); diff --git a/packages/plugins-manager/test-node/metaConfigToWebDevServerConfig.test.js b/packages/plugins-manager/test-node/metaConfigToWebDevServerConfig.test.js new file mode 100644 index 00000000..6ee0da63 --- /dev/null +++ b/packages/plugins-manager/test-node/metaConfigToWebDevServerConfig.test.js @@ -0,0 +1,26 @@ +import chai from 'chai'; + +import { metaConfigToWebDevServerConfig } from 'plugins-manager'; + +const { expect } = chai; + +describe('metaConfigToWebDevServerConfig', () => { + const threeExistingPlugin = [ + { name: 'first', plugin: () => 'firstPlugin' }, + { name: 'second', plugin: () => 'secondPlugin' }, + { name: 'third', plugin: () => 'thirdPlugin' }, + ]; + + it('accepts a wrapper function for plugins', async () => { + function wrapperFunction(srcFn) { + return () => `*wrapped* ${srcFn()}`; + } + + const config = metaConfigToWebDevServerConfig({}, threeExistingPlugin, { wrapperFunction }); + expect(config.plugins).to.deep.equal([ + '*wrapped* firstPlugin', + '*wrapped* secondPlugin', + '*wrapped* thirdPlugin', + ]); + }); +}); diff --git a/packages/plugins-manager/tsconfig.json b/packages/plugins-manager/tsconfig.json new file mode 100644 index 00000000..6f834c47 --- /dev/null +++ b/packages/plugins-manager/tsconfig.json @@ -0,0 +1,24 @@ +// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts + +{ + "extends": "../../tsconfig.node-base.json", + "compilerOptions": { + "module": "ESNext", + "outDir": "./dist-types", + "rootDir": ".", + "composite": true, + "allowJs": true, + "checkJs": true, + "emitDeclarationOnly": true + }, + "references": [], + "include": [ + "src", + "*.js", + "types" + ], + "exclude": [ + "dist", + "dist-types" + ] +} \ No newline at end of file diff --git a/packages/plugins-manager/types/main.d.ts b/packages/plugins-manager/types/main.d.ts new file mode 100644 index 00000000..34bc2b7d --- /dev/null +++ b/packages/plugins-manager/types/main.d.ts @@ -0,0 +1,5 @@ +export interface MetaPlugin { + name: string; + plugin: any; + options?: any; +} diff --git a/packages/search/README.md b/packages/search/README.md new file mode 100644 index 00000000..1686ae83 --- /dev/null +++ b/packages/search/README.md @@ -0,0 +1,5 @@ +# Rocket Search + +Add a search for all your static content. + +For docs please see our homepage [https://rocket.modern-web.dev/docs/presets/search/](https://rocket.modern-web.dev/docs/presets/search/). diff --git a/packages/search/assets/blog.svg b/packages/search/assets/blog.svg new file mode 100644 index 00000000..ebe5eab7 --- /dev/null +++ b/packages/search/assets/blog.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/search/assets/docs.svg b/packages/search/assets/docs.svg new file mode 100644 index 00000000..4ba84acd --- /dev/null +++ b/packages/search/assets/docs.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/search/assets/guides.svg b/packages/search/assets/guides.svg new file mode 100644 index 00000000..47535196 --- /dev/null +++ b/packages/search/assets/guides.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/search/assets/others.svg b/packages/search/assets/others.svg new file mode 100644 index 00000000..a7ad87e2 --- /dev/null +++ b/packages/search/assets/others.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/search/node.js b/packages/search/node.js new file mode 100644 index 00000000..12f8a7f8 --- /dev/null +++ b/packages/search/node.js @@ -0,0 +1,4 @@ +export { getIdBlocksOfHtml } from './src/getIdBlocksOfHtml.js'; +export { RocketSearchPlugin } from './src/RocketSearchPlugin.js'; + +export { rocketSearch } from './preset/rocketSearch.js'; diff --git a/packages/search/package.json b/packages/search/package.json new file mode 100644 index 00000000..06cd26c5 --- /dev/null +++ b/packages/search/package.json @@ -0,0 +1,49 @@ +{ + "name": "@rocket/search", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "description": "Search Preset for Rocket", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/rocket.git", + "directory": "packages/search" + }, + "author": "Modern Web (https://modern-web.dev/)", + "homepage": "https://rocket.modern-web.dev/docs/presets/search/", + "type": "module", + "exports": { + ".": "./node.js", + "./node": "./node.js", + "./web": "./web.js", + "./rocket-search.js": "./rocket-search.js" + }, + "scripts": { + "debug": "cd ../../ && npm run debug -- --group search", + "test": "npm run test:node && npm run test:web", + "test:node": "mocha test-node/**/*.test.js test-node/*.test.js", + "test:watch": "onchange 'src/**/*.{js,cjs}' 'test-node/**/*.js' -- npm run test:node", + "test:web": "cd ../../ && npm run test:web -- --group search" + }, + "files": [ + "*.js", + "assets", + "dist", + "dist-types", + "preset", + "src" + ], + "keywords": [ + "rocket", + "search" + ], + "dependencies": { + "@lion/combobox": "^0.1.16", + "@open-wc/scoped-elements": "^1.3.2", + "minisearch": "^3.0.2", + "plugins-manager": "^0.1.0", + "sax-wasm": "^2.0.0" + } +} diff --git a/packages/search/preset/_includes/search/input.njk b/packages/search/preset/_includes/search/input.njk new file mode 100644 index 00000000..79a4984d --- /dev/null +++ b/packages/search/preset/_includes/search/input.njk @@ -0,0 +1,9 @@ + + + + + + + diff --git a/packages/search/preset/rocketSearch.js b/packages/search/preset/rocketSearch.js new file mode 100644 index 00000000..5b7757ea --- /dev/null +++ b/packages/search/preset/rocketSearch.js @@ -0,0 +1,13 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; +import { addPlugin } from 'plugins-manager'; +import { RocketSearchPlugin } from '../src/RocketSearchPlugin.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +export function rocketSearch() { + return { + path: path.resolve(__dirname), + setupCliPlugins: [addPlugin({ name: 'rocket-search', plugin: RocketSearchPlugin })], + }; +} diff --git a/packages/search/rocket-search.js b/packages/search/rocket-search.js new file mode 100644 index 00000000..60d8de90 --- /dev/null +++ b/packages/search/rocket-search.js @@ -0,0 +1,3 @@ +import { RocketSearch } from './src/RocketSearch.js'; + +customElements.define('rocket-search', RocketSearch); diff --git a/packages/search/src/LinkMixin.js b/packages/search/src/LinkMixin.js new file mode 100644 index 00000000..01cc5861 --- /dev/null +++ b/packages/search/src/LinkMixin.js @@ -0,0 +1,63 @@ +import { dedupeMixin } from '@lion/core'; + +/** + * @typedef {import('lit-element').PropertyValues } changedProperties + */ + +/** + * Designed for webcomponents that need to behave like a link. + * For instance, comboboxes that have search result options opening a webpage on click. + * Using an is not a viable alternative, because: + * - no shadow dom (and thus no style encapsulation possibilities) + * - we need to extend from LionOption (and we cannot put the anchor inside + * the focusable element (LionOption which has [role=option])) + */ +const LinkMixinImplementation = superclass => + class extends superclass { + static get properties() { + return { + href: String, + target: String, + }; + } + + constructor() { + super(); + this._nativeAnchor = document.createElement('a'); + } + + connectedCallback() { + super.connectedCallback(); + if (!this.hasAttribute('role')) { + this.setAttribute('role', 'link'); + } + } + + firstUpdated(changedProperties) { + super.firstUpdated(changedProperties); + this.addEventListener('click', this.__navigate); + this.addEventListener('keydown', ({ key }) => { + if (key === ' ' || key === 'Enter') { + this.__navigate(); + } + }); + } + + updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('href')) { + this._nativeAnchor.href = this.href; + } + if (changedProperties.has('target')) { + this._nativeAnchor.target = this.target; + } + if (changedProperties.has('rel')) { + this._nativeAnchor.rel = this.rel; + } + } + + __navigate() { + this._nativeAnchor.click(); + } + }; +export const LinkMixin = dedupeMixin(LinkMixinImplementation); diff --git a/packages/search/src/RocketSearch.js b/packages/search/src/RocketSearch.js new file mode 100644 index 00000000..385a73c7 --- /dev/null +++ b/packages/search/src/RocketSearch.js @@ -0,0 +1,150 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import { html, LitElement, css } from 'lit-element'; +import MiniSearch from 'minisearch'; +import { repeat } from 'lit-html/directives/repeat.js'; +import { ScopedElementsMixin } from '@open-wc/scoped-elements'; +import { RocketSearchCombobox } from './RocketSearchCombobox.js'; +import { RocketSearchOption } from './RocketSearchOption.js'; +import { highlightSearchTerms, joinTitleHeadline } from './utils-shared.js'; + +/** @typedef {import('./types').RocketSearchResult} RocketSearchResult */ + +/** + * @param {object} options + * @param {RocketSearchResult} options.result + * @param {string} options.search + */ +function getTitle({ result, search }) { + const { terms, title, headline } = result; + + const header = joinTitleHeadline(title, headline); + return highlightSearchTerms({ text: header, search, terms }); +} + +/** + * @param {object} options + * @param {RocketSearchResult} options.result + * @param {string} options.search + */ +function getText({ result, search }) { + const { terms, body } = result; + + return highlightSearchTerms({ text: body, search, terms }); +} + +// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110 +export class RocketSearch extends ScopedElementsMixin(LitElement) { + static get properties() { + return { + jsonUrl: { type: String, attribute: 'json-url' }, + search: { type: String }, + results: { type: Array }, + maxResults: { type: Number, attribute: 'max-results' }, + }; + } + + static get scopedElements() { + return { + 'rocket-search-combobox': RocketSearchCombobox, + 'rocket-search-option': RocketSearchOption, + }; + } + + constructor() { + super(); + this.jsonUrl = ''; + this.search = ''; + this.maxResults = 10; + /** + * @type {RocketSearchResult[]} + */ + this.results = []; + this.miniSearch = null; + } + + async setupSearch() { + if (!this.jsonUrl) { + throw new Error( + 'You need to provide a url to your json index. use for example: ', + ); + } + + let responseText; + try { + const response = await fetch(this.jsonUrl); + responseText = await response.text(); + } catch (e) { + throw new Error(`The given json-url "${this.jsonUrl}" could not be fetched.`); + } + + if (responseText[0] !== '{') { + throw new Error(`The given json-url "${this.jsonUrl}" could not be fetched.`); + } + + this.miniSearch = MiniSearch.loadJSON(responseText, { + fields: ['title', 'headline', 'body'], + searchOptions: { + boost: { headline: 3, title: 2 }, + fuzzy: 0.2, + prefix: true, + }, + }); + } + + get combobox() { + return this.shadowRoot?.children[0]; + } + + /** @param {import('lit-element').PropertyValues } changedProperties */ + update(changedProperties) { + if (this.miniSearch && changedProperties.has('search')) { + this.results = /** @type {RocketSearchResult[]} */ (this.miniSearch.search( + this.search, + )).slice(0, this.maxResults); + } + + super.update(changedProperties); + } + + render() { + return html` + { + this.search = ev.target.value; + }} + @focus=${() => { + this.setupSearch(); + }} + > + ${repeat( + this.results, + result => result.id, + result => html` + + `, + )} + + `; + } + + static get styles() { + return css` + :host { + display: block; + } + + ::slotted(input.form-control) { + caret-color: var(--rocket-search-caret-color, initial); + } + `; + } +} diff --git a/packages/search/src/RocketSearchCombobox.js b/packages/search/src/RocketSearchCombobox.js new file mode 100644 index 00000000..f66e73b1 --- /dev/null +++ b/packages/search/src/RocketSearchCombobox.js @@ -0,0 +1,265 @@ +import { css } from '@lion/core'; +import { LionCombobox } from '@lion/combobox'; +import { withDropdownConfig } from '@lion/overlays'; + +const tmpl = document.createElement('template'); +tmpl.innerHTML = ` + +`; + +export class RocketSearchCombobox extends LionCombobox { + static get styles() { + return [ + super.styles, + css` + ::slotted([slot='label']) { + display: none; + } + + ::slotted([slot='prefix']) { + width: 25px; + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ + background: none; + color: inherit; + border: none; + padding: 0; + font: inherit; + cursor: pointer; + fill: var(--rocket-search-fill-color, #000); + } + + ::slotted([slot='prefix'][arrow-left]) { + transform: rotate(180deg); + display: none; + } + + ::slotted([slot='listbox']) { + max-height: calc(100vh - 70px); + background: var(--rocket-search-background-color, #fff); + } + + .input-group__container { + border: none; + } + + .input-group { + display: flex; + flex-flow: column; + justify-content: center; + } + + ::slotted([slot='input']) { + font-size: 25px; + line-height: 25px; + margin: 0; + background: transparent; + color: inherit; + } + + .input-group__input { + display: none; + } + + /** Showing the input */ + + :host([show-input]) { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + height: 100vh; + background: var(--rocket-search-background-color, #fff); + } + + :host([show-input]) ::slotted([slot='prefix'][arrow-left]) { + display: block; + } + + :host([show-input]) ::slotted([slot='prefix'][magnifying-glass]) { + display: none; + } + + :host([show-input]) .input-group { + height: 70px; + border-bottom: 1px solid var(--rocket-search-input-overlay-border-color, #ccc); + } + + :host([show-input]) .input-group__prefix { + padding: 0 20px 0 10px; + } + + :host([show-input]) .input-group__input { + display: block; + } + + /** Undo Popper only for mobile */ + @media screen and (max-width: 1024px) { + #overlay-content-node-wrapper { + position: static !important; + width: auto !important; + transform: none !important; + } + } + + @media screen and (min-width: 1024px) { + /* desktop */ + + :host { + background: transparent; + } + .input-group__input { + display: block; + } + + .input-group__container { + position: relative; + background: var(--rocket-search-background-color, #fff); + display: flex; + border: 1px solid var(--rocket-search-input-border-color, #dfe1e5); + box-shadow: none; + border-radius: 24px; + padding: 5px 0; + } + + .input-group { + margin-bottom: 16px; + max-width: 582px; + margin: auto; + font-size: 20px; + line-height: 20px; + } + + .input-group__prefix, + .input-group__suffix { + display: flex; + place-items: center; + padding: 0 10px 0 15px; + } + + .input-group__input { + display: flex; + place-items: center; + } + + #overlay-content-node-wrapper { + max-height: 60vh; + overflow: auto; + box-shadow: 0 4px 6px rgba(32, 33, 36, 0.28); + } + + ::slotted([slot='listbox']) { + max-height: none; + } + } + `, + ]; + } + + static get properties() { + return { + showInput: { type: Boolean, reflect: true, attribute: 'show-input' }, + }; + } + + _connectSlotMixin() { + if (!this.__isConnectedSlotMixin) { + Object.keys(this.slots).forEach(slotName => { + if (!this.querySelector(`[slot=${slotName}]`)) { + const slotFactory = this.slots[slotName]; + let slotEls = slotFactory(); + if (!Array.isArray(slotEls)) { + slotEls = [slotEls]; + } + for (const slotEl of slotEls) { + // ignore non-elements to enable conditional slots + if (slotEl instanceof Element) { + slotEl.setAttribute('slot', slotName); + this.appendChild(slotEl); + this.__privateSlots.add(slotName); + } + } + } + }); + this.__isConnectedSlotMixin = true; + } + } + + _defineOverlayConfig() { + return { + ...withDropdownConfig(), + popperConfig: { + placement: 'bottom-center', + // modifiers: { + // ...parentConfig?.popperConfig?.modifiers, + // offset: { + // offset: 100, + // enabled: false, + // }, + // keepTogether: { + // enabled: true, + // }, + // arrow: { + // enabled: true, + // } + // }, + }, + }; + } + + get slots() { + return { + ...super.slots, + prefix: () => { + const arrowLeft = document.importNode(tmpl.content, true).children[0]; + arrowLeft.addEventListener('click', () => { + if (window.innerWidth < 1024) { + this.showInput = false; + } + }); + + tmpl.innerHTML = ` + + `; + const magnifyingClass = document.importNode(tmpl.content, true).children[0]; + + magnifyingClass.addEventListener('click', () => { + if (window.innerWidth < 1024) { + this.showInput = true; + this.updateComplete.then(() => { + this._inputNode.focus(); + }); + } else { + this._inputNode.focus(); + } + }); + + return [arrowLeft, magnifyingClass]; + }, + }; + } + + focus() { + this._inputNode.focus(); + } + + constructor() { + super(); + this.autocomplete = 'none'; + this.selectionFollowsFocus = false; + this.rotateKeyboardNavigation = false; + this.showInput = false; + } +} +customElements.define('rocket-search-combobox', RocketSearchCombobox); diff --git a/packages/search/src/RocketSearchOption.js b/packages/search/src/RocketSearchOption.js new file mode 100644 index 00000000..f3ce195d --- /dev/null +++ b/packages/search/src/RocketSearchOption.js @@ -0,0 +1,113 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import { css, html, unsafeHTML } from '@lion/core'; +import { LionOption } from '@lion/listbox'; +import { LinkMixin } from './LinkMixin.js'; + +const icons = { + guides: new URL('../assets/guides.svg', import.meta.url).href, + docs: new URL('../assets/docs.svg', import.meta.url).href, + blog: new URL('../assets/blog.svg', import.meta.url).href, + others: new URL('../assets/others.svg', import.meta.url).href, +}; + +/** + * @param {string} section + */ +function getIcon(section) { + const typedSection = /** @type {keyof icons} */ (section); + return icons[typedSection] ? icons[typedSection] : icons['others']; +} + +// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110 +export class RocketSearchOption extends LinkMixin(LionOption) { + static get properties() { + return { + title: { + type: String, + }, + text: { + type: String, + }, + section: { + type: String, + }, + }; + } + + constructor() { + super(); + this.title = ''; + this.text = ''; + this.section = ''; + } + + static get styles() { + return [ + css` + :host([hidden]) { + display: none; + } + + :host(:hover) { + background-color: var(--rocket-search-hover-background-color, #eee); + } + :host([active]) { + background-color: var(--rocket-search-hover-background-color, #eee); + } + /* :host:hover, + :host([active]) { + background: #eee !important; + } */ + + :host([disabled]) { + color: #adadad; + } + + :host { + display: block; + cursor: default; + position: relative; + padding: 12px 10px; + display: flex; + align-items: center; + font-weight: normal; + } + + .icon { + width: 50px; + margin-right: 15px; + flex-shrink: 0; + align-self: start; + } + + .title { + margin-bottom: 4px; + } + + .text { + font-size: 14px; + } + + strong { + color: var(--rocket-search-highlight-color, #6c63ff); + } + + @media screen and (min-width: 1024px) { + :host { + max-width: 600px; + } + } + `, + ]; + } + + render() { + return html` + +
+
${unsafeHTML(this.title)}
+
${unsafeHTML(this.text)}
+
+ `; + } +} diff --git a/packages/search/src/RocketSearchPlugin.js b/packages/search/src/RocketSearchPlugin.js new file mode 100644 index 00000000..10612c71 --- /dev/null +++ b/packages/search/src/RocketSearchPlugin.js @@ -0,0 +1,148 @@ +import commandLineArgs from 'command-line-args'; +import MiniSearch from 'minisearch'; +import { getIdBlocksOfHtml } from './getIdBlocksOfHtml.js'; +import readline from 'readline'; +import fs from 'fs'; +import path from 'path'; +import { renderResults } from './renderResults.js'; + +export class RocketSearchPlugin { + commands = ['search', 'start', 'build']; + + excludeLayouts = ['with-index.njk']; + documents = []; + + async setup({ config, argv }) { + const searcDefinitions = [ + { + name: 'mode', + alias: 'm', + type: String, + defaultValue: 'search', + description: 'What build to run [search, index]', + }, + { name: 'term', type: String, defaultOption: true, defaultValue: '' }, + { name: 'help', type: Boolean, description: 'See all options' }, + ]; + const searchOptions = commandLineArgs(searcDefinitions, { argv }); + + this.config = { + ...config, + search: searchOptions, + }; + } + + async execute() { + if (this.config.command !== 'search') { + return; + } + const { mode } = this.config.search; + switch (mode) { + case 'search': + await this.search(); + break; + /* no default */ + } + } + + async inspectRenderedHtml({ html, url, layout, title, data, eleventy }) { + if (this.excludeLayouts.includes(layout)) { + return; + } + if (data.excludeFromSearch) { + return; + } + + const urlFilter = eleventy.config.nunjucksFilters.url; + + const blocks = await getIdBlocksOfHtml({ html, url }); + for (const block of blocks) { + this.documents.push({ + id: urlFilter(block.url), + title, + section: data.section, + headline: block.headline, + body: block.text, + }); + } + } + + async search() { + await this.setupIndex(); + + process.stderr.write('\u001B[?25l'); // hide default cursor + + readline.emitKeypressEvents(process.stdin); + process.stdin.setRawMode(true); + process.stdin.on('keypress', (str, key) => { + if (key.ctrl && key.name === 'c') { + process.stderr.write('\u001B[?25h'); // show cursor + process.exit(); + } + + const { term } = this.config.search; + switch (key.name) { + case 'backspace': + this.config.search.term = term.substring(0, term.length - 1); + break; + case 'return': + case 'right': + case 'left': + case 'up': + case 'down': + // ignore + break; + default: + this.config.search.term += str; + } + this.renderCli(); + }); + + this.renderCli(); + } + + renderCli() { + const { term } = this.config.search; + const results = this.miniSearch?.search(term); + + if (results) { + const output = renderResults({ term, results }); + console.log(output.join('\n')); + } + } + + async setupIndex() { + this.miniSearch = new MiniSearch({ + fields: ['title', 'headline', 'body', 'section'], // fields to index for full-text search + storeFields: ['title', 'headline', 'body', 'section'], // fields to return with search results + searchOptions: { + boost: { headline: 3, title: 2 }, + fuzzy: 0.2, + prefix: true, + }, + }); + + this.miniSearch.addAll(this.documents); + } + + async updated() { + await this.saveIndex(); + } + + async saveIndex() { + await this.setupIndex(); + const json = JSON.stringify(this.miniSearch); + + const writePath = path.join( + this.config.outputDevDir, + '_merged_assets', + '_static', + 'rocket-search-index.json', + ); + const relPath = path.relative(process.cwd(), writePath); + fs.writeFileSync(writePath, json); + console.log( + `Search index written to ${relPath} - ${new TextEncoder().encode(json).byteLength} bytes`, + ); + } +} diff --git a/packages/search/src/getIdBlocksOfHtml.js b/packages/search/src/getIdBlocksOfHtml.js new file mode 100644 index 00000000..c406fde2 --- /dev/null +++ b/packages/search/src/getIdBlocksOfHtml.js @@ -0,0 +1,76 @@ +import fs from 'fs'; +import saxWasm from 'sax-wasm'; +import { createRequire } from 'module'; + +const require = createRequire(import.meta.url); + +const { SaxEventType, SAXParser } = saxWasm; + +const saxPath = require.resolve('sax-wasm/lib/sax-wasm.wasm'); +const saxWasmBuffer = fs.readFileSync(saxPath); + +export async function getIdBlocksOfHtml({ html, url }) { + const parser = new SAXParser( + SaxEventType.Attribute | + SaxEventType.OpenTag | + SaxEventType.OpenTagStart | + SaxEventType.Text | + SaxEventType.CloseTag, + { highWaterMark: 256 * 1024 }, // 256k chunks + ); + await parser.prepareWasm(saxWasmBuffer); + + const startExcludeMainOpening = html.indexOf('>', html.indexOf('')); + + const blocks = []; + let captureText = true; + let insideHeading = false; + let block = { text: '', headline: '', url }; + parser.eventHandler = (ev, data) => { + if (ev === SaxEventType.OpenTagStart) { + if (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(data.name)) { + insideHeading = true; + captureText = false; + block.text = block.text.trim(); + block.headline = block.headline.trim(); + if (block.text !== '') { + blocks.push(block); + block = { text: '', headline: '', url }; + } + } + } + + if (captureText && ev === SaxEventType.Text) { + block.text += data.value; + } + if (insideHeading && ev === SaxEventType.Text) { + block.headline += data.value; + } + + if (insideHeading && ev === SaxEventType.Attribute) { + if (data.name.toString() === 'id') { + block.url += `#${data.value}`; + } + } + + if (ev === SaxEventType.CloseTag) { + if (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(data.name)) { + captureText = true; + insideHeading = false; + } else { + block.text += ' '; + } + } + }; + + parser.write(Buffer.from(mainHtml)); + parser.end(); + + block.text = block.text.trim(); + block.headline = block.headline.trim(); + if (block.text !== '') { + blocks.push(block); + } + return blocks; +} diff --git a/packages/search/src/renderResults.js b/packages/search/src/renderResults.js new file mode 100644 index 00000000..51fa8dc4 --- /dev/null +++ b/packages/search/src/renderResults.js @@ -0,0 +1,111 @@ +import chalk from 'chalk'; +import { highlightSearchTerms, joinTitleHeadline } from './utils-shared.js'; + +/** @typedef {import('./types').RocketSearchResult} RocketSearchResult */ + +const CLEAR_COMMAND = process.platform === 'win32' ? '\x1B[2J\x1B[0f' : '\x1B[2J\x1B[3J\x1B[H'; + +const icons = { + guides: '📜', + docs: '📖', + blog: '📝', + others: '❓', +}; + +/** + * @param {string} term + */ +function chalkHighlight(term) { + return chalk.green(term); +} + +/** + * @param {string} section + */ +function getIcon(section) { + const typedSection = /** @type {keyof icons} */ (section); + return icons[typedSection] ? icons[typedSection] : icons['others']; +} + +/** + * @param {object} options + * @param {RocketSearchResult} options.result + * @param {string} options.search + */ +export function renderResult({ result, search }) { + const output = []; + const { terms, section, title, headline, id, body } = result; + const icon = getIcon(section); + + const header = joinTitleHeadline(title, headline); + const highlightedHeader = highlightSearchTerms({ + text: header, + highlight: chalkHighlight, + search, + terms, + }); + const highlightedText = highlightSearchTerms({ + text: body, + highlight: chalkHighlight, + search, + terms, + length: 180, + }) + .replace(/\r?\n|\r/g, ' ') // remove line breaks + .replace(/\s{2,}/g, ' '); // remove whitespace + + const highlightedTextLine1 = + highlightedText.length > 100 ? highlightedText.slice(0, 90) : highlightedText; + const highlightedTextLine2 = highlightedText.length > 100 ? highlightedText.substring(90) : ''; + + output.push(` ${icon} ${highlightedHeader}`); + output.push(` ${chalk.gray(highlightedTextLine1)}`); + if (highlightedTextLine2) { + output.push(` ${chalk.gray(highlightedTextLine2)}`); + } + output.push(` ${chalk.cyanBright(`http://localhost:8080${id}`)}`); + output.push(''); + return output; +} + +/** + * @param {object} options + * @param {string} options.term + * @param {RocketSearchResult[]} options.results + * @param {number} [options.maxCount] + */ +export function renderResults({ term, results, maxCount = 6 }) { + let output = []; + + output.push(CLEAR_COMMAND); + output.push(`Searching for: ${term}█`); + + output.push(''); + if (results.length > 0) { + let count = 0; + for (const result of results) { + count += 1; + if (count >= maxCount) { + break; + } + output = [...output, ...renderResult({ result, search: term })]; + } + const moreCount = results.length - maxCount; + if (moreCount > 0) { + output.push(` there are ${moreCount} more result${moreCount > 2 ? 's' : ''}...`); + } + } else { + output.push(' No results found. (type more or less)'); + } + output.push(''); + + output.push('Legend:'); + let legend = ' '; + for (const iconKey of Object.keys(icons)) { + legend += ` ${getIcon(iconKey)} ${iconKey[0].toUpperCase()}${iconKey.substr(1)}`; + } + output.push(chalk.gray(legend)); + output.push(''); + output.push(`${chalk.gray('Press')} Strg+C ${chalk.gray('to quit search.')}`); + return output; +} diff --git a/packages/search/src/types.d.ts b/packages/search/src/types.d.ts new file mode 100644 index 00000000..03143322 --- /dev/null +++ b/packages/search/src/types.d.ts @@ -0,0 +1,8 @@ +import { SearchResult } from 'minisearch'; + +export interface RocketSearchResult extends SearchResult { + section: string; + title: string; + headline: string; + body: string; +} diff --git a/packages/search/src/utils-shared.js b/packages/search/src/utils-shared.js new file mode 100644 index 00000000..de290064 --- /dev/null +++ b/packages/search/src/utils-shared.js @@ -0,0 +1,74 @@ +/** + * @param {string} title + * @param {string} headline + */ +export function joinTitleHeadline(title, headline) { + if (title === headline) { + return title; + } + return `${title} > ${headline}`; +} + +/** + * @param {string} term + */ +function defaultHighlight(term) { + return `${term}`; +} + +/** + * Highlights a search term within a text and truncates the output. + * + * @param {object} options + * @param {string} options.search + * @param {string} options.text + * @param {string[]} options.terms + * @param {number} [options.before] + * @param {number} [options.length] + * @param {function} [options.highlight] + */ +export function highlightSearchTerms({ + search, + text, + terms, + before = 15, + length = 100, + highlight = defaultHighlight, +}) { + if (!search || !text) { + return ''; + } + + let newText = text; + let searchText = newText.toLowerCase(); + let extraLength = 0; + let truncateStart = 0; + + let firstFoundIndex; + for (const term of terms) { + let offset = 0; + let startIndex = 0; + const startsWithMatch = term.substring(0, search.length) === search; + const addForEnd = startsWithMatch ? search.length : term.length; + do { + startIndex = searchText.indexOf(term, offset); + if (startIndex !== -1) { + const endIndex = startIndex + addForEnd; + const matchingText = newText.slice(startIndex, endIndex); + const highlightedTerm = highlight(matchingText); + newText = [newText.slice(0, startIndex), highlightedTerm, newText.slice(endIndex)].join(''); + searchText = newText.toLowerCase(); + offset = startIndex + highlightedTerm.length; + if (firstFoundIndex === undefined || startIndex < firstFoundIndex) { + firstFoundIndex = startIndex; + truncateStart = firstFoundIndex - before > 0 ? firstFoundIndex - before : 0; + } + if (startIndex - truncateStart - extraLength < length) { + extraLength += highlightedTerm.length - addForEnd; + } + } + } while (startIndex !== -1); + } + + return newText.substr(truncateStart, length + extraLength); +} diff --git a/packages/search/test-node/getIdBlocksOfHtml.test.js b/packages/search/test-node/getIdBlocksOfHtml.test.js new file mode 100644 index 00000000..459ce6b8 --- /dev/null +++ b/packages/search/test-node/getIdBlocksOfHtml.test.js @@ -0,0 +1,69 @@ +import chai from 'chai'; +import { getIdBlocksOfHtml } from '../src/getIdBlocksOfHtml.js'; + +const { expect } = chai; + +describe('getIdBlocksOfHtml', () => { + it('extracts only content from main', async () => { + const result = await getIdBlocksOfHtml({ html: '

ignore

foo
', url: 'test' }); + expect(result).to.deep.equal([ + { + url: 'test', + headline: '', + text: 'foo', + }, + ]); + }); + + it('separates multiple content tags with a space', async () => { + const result = await getIdBlocksOfHtml({ + html: '

one

two

', + url: 'test', + }); + expect(result).to.deep.equal([ + { + url: 'test', + headline: '', + text: 'one two', + }, + ]); + }); + + it('adds a block with url, headline, text', async () => { + const result = await getIdBlocksOfHtml({ + html: '

First

text in First

', + url: 'test', + }); + expect(result).to.deep.equal([ + { + url: 'test#first', + headline: 'First', + text: 'text in First', + }, + ]); + }); + + it('adds a block for each headline with an id', async () => { + const result = await getIdBlocksOfHtml({ + html: ` +
+

First

text in

First
+

Second

text in second

+
+ `, + url: 'test', + }); + expect(result).to.deep.equal([ + { + url: 'test#first', + headline: 'First', + text: 'text in First', + }, + { + url: 'test#second', + headline: 'Second', + text: 'text in second', + }, + ]); + }); +}); diff --git a/packages/search/test-node/renderResults.test.js b/packages/search/test-node/renderResults.test.js new file mode 100644 index 00000000..10edddfd --- /dev/null +++ b/packages/search/test-node/renderResults.test.js @@ -0,0 +1,49 @@ +import chai from 'chai'; +import { renderResults, renderResult } from '../src/renderResults.js'; +import chalk from 'chalk'; + +const { expect } = chai; + +const defaultResult = { + id: '/_site-dev/docs/#content-top', + terms: ['more'], + title: 'Documentation', + headline: 'Read more', + body: 'Here you will read more about it.', + section: 'docs', +}; + +describe('renderResults', () => { + before(() => { + // ignore colors in tests as most CIs won't support it + chalk.level = 0; + }); + + it('renders a single result', async () => { + const result = renderResult({ result: defaultResult, search: 'more' }); + expect(result).to.deep.equal([ + ' 📖 ntation > Read more', + ' you will read more about it.', + ' http://localhost:8080/_site-dev/docs/#content-top', + '', + ]); + }); + + it('renders results', async () => { + const result = renderResults({ term: 'launch', results: [defaultResult] }); + expect(result).to.deep.equal([ + '\u001b[2J\u001b[3J\u001b[H', // clear command + 'Searching for: launch█', + '', + ' 📖 ntation > Read more', + ' you will read more about it.', + ' http://localhost:8080/_site-dev/docs/#content-top', + '', + '', + 'Legend:', + ' 📜 Guides 📖 Docs 📝 Blog ❓ Others', + '', + 'Press Strg+C to quit search.', + ]); + }); +}); diff --git a/packages/search/test-web/fixtures/generate.js b/packages/search/test-web/fixtures/generate.js new file mode 100644 index 00000000..0043be39 --- /dev/null +++ b/packages/search/test-web/fixtures/generate.js @@ -0,0 +1,29 @@ +import MiniSearch from 'minisearch'; +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const searchInstance = new MiniSearch({ + fields: ['title', 'headline', 'body', 'section'], // fields to index for full-text search + storeFields: ['title', 'headline', 'body', 'section'], // fields to return with search results + searchOptions: { + boost: { headline: 3, title: 2 }, + fuzzy: 0.2, + }, +}); + +searchInstance.addAll([ + { + id: 'http://localhost/first-page/', + title: 'First Search Page', + headline: 'First Search Headline', + body: 'First Search Body', + section: 'docs', + }, +]); + +const json = JSON.stringify(searchInstance); + +fs.writeFileSync(path.join(__dirname, 'one-result.json'), json); diff --git a/packages/search/test-web/fixtures/one-result.json b/packages/search/test-web/fixtures/one-result.json new file mode 100644 index 00000000..d8b1f5c8 --- /dev/null +++ b/packages/search/test-web/fixtures/one-result.json @@ -0,0 +1 @@ +{"index":{"_tree":{"first":{"":{"0":{"df":1,"ds":{"0":1}},"1":{"df":1,"ds":{"0":1}},"2":{"df":1,"ds":{"0":1}}}},"search":{"":{"0":{"df":1,"ds":{"0":1}},"1":{"df":1,"ds":{"0":1}},"2":{"df":1,"ds":{"0":1}}}},"page":{"":{"0":{"df":1,"ds":{"0":1}}}},"headline":{"":{"1":{"df":1,"ds":{"0":1}}}},"body":{"":{"2":{"df":1,"ds":{"0":1}}}},"docs":{"":{"3":{"df":1,"ds":{"0":1}}}}},"_prefix":""},"documentCount":1,"nextId":1,"documentIds":{"0":"http://localhost/first-page/"},"fieldIds":{"title":0,"headline":1,"body":2,"section":3},"fieldLength":{"0":{"0":3,"1":3,"2":3,"3":1}},"averageFieldLength":{"0":3,"1":3,"2":3,"3":1},"storedFields":{"0":{"title":"First Search Page","headline":"First Search Headline","body":"First Search Body","section":"docs"}}} \ No newline at end of file diff --git a/packages/search/test-web/rocket-search.test.js b/packages/search/test-web/rocket-search.test.js new file mode 100644 index 00000000..7025357a --- /dev/null +++ b/packages/search/test-web/rocket-search.test.js @@ -0,0 +1,78 @@ +import { expect, fixture as _fixture, html } from '@open-wc/testing'; +import { setViewport } from '@web/test-runner-commands'; +import { stubMethod } from 'hanbi'; + +import '../rocket-search.js'; + +/** + * @param {function} method + * @param {string} errorMessage + */ +async function expectThrowsAsync(method, errorMessage) { + let error = null; + try { + await method(); + } catch (err) { + error = err; + } + expect(error).to.be.an('Error', 'No error was thrown'); + if (errorMessage) { + expect(error.message).to.equal(errorMessage); + } +} + +/** + * @typedef {import('../src/RocketSearch').RocketSearch} RocketSearch + * @typedef {import('lit-html').TemplateResult} TemplateResult + */ +const fixture = /** @type {(arg: TemplateResult) => Promise} */ (_fixture); + +const fixtureOneResultUrl = new URL('./fixtures/one-result.json', import.meta.url).href; + +describe('rocket-search', () => { + before(async () => { + await setViewport({ width: 1200, height: 640 }); + }); + + it('throws if no jsonUrl is provided', async () => { + const el = await fixture(html``); + await expectThrowsAsync( + () => el.setupSearch(), + 'You need to provide a url to your json index. use for example: ', + ); + }); + + it('throws if invalid jsonUrl is provided', async () => { + const el = await fixture(html``); + await expectThrowsAsync( + () => el.setupSearch(), + 'The given json-url "404-url" could not be fetched.', + ); + }); + + it('initializes the search only on demand', async () => { + const el = await fixture(html``); + expect(el.miniSearch).to.be.null; + await el.setupSearch(); + expect(el.miniSearch).to.not.be.null; + }); + + it('initialize the search on focus', async () => { + const el = await fixture(html``); + expect(el.miniSearch).to.be.null; + + const stub = stubMethod(el, 'setupSearch'); + el.combobox.focus(); + expect(stub.callCount).to.equal(1); + }); + + it('has search results', async () => { + const el = await fixture(html``); + await el.setupSearch(); + + expect(el.results).to.deep.equal([]); + el.search = 'first'; + await el.updateComplete; + expect(el.results).to.have.a.lengthOf(1); + }); +}); diff --git a/packages/search/test-web/utils-shared.test.js b/packages/search/test-web/utils-shared.test.js new file mode 100644 index 00000000..b924af2c --- /dev/null +++ b/packages/search/test-web/utils-shared.test.js @@ -0,0 +1,118 @@ +import { expect } from '@open-wc/testing'; +import { joinTitleHeadline, highlightSearchTerms } from '../src/utils-shared.js'; + +describe('utils-shared: joinTitleHeadline', () => { + it('joins title and headline with a ">"', async () => { + const joined = joinTitleHeadline('Launch Preset: Inline Notification', 'Danger'); + expect(joined).to.equal('Launch Preset: Inline Notification > Danger'); + }); + + it('shows only title if headline is the same', async () => { + const joined = joinTitleHeadline( + 'Launch Preset: Inline Notification', + 'Launch Preset: Inline Notification', + ); + expect(joined).to.equal('Launch Preset: Inline Notification'); + }); +}); + +describe('utils-shared: highlightSearchTerms', () => { + it('highlights a term found', async () => { + const highlighted = highlightSearchTerms({ + search: 'more', + terms: ['more'], + text: 'Read more ...', + }); + expect(highlighted).to.equal('Read more ...'); + }); + + it('highlights a search term found regardless of casing', async () => { + const highlighted = highlightSearchTerms({ + search: 'more', + terms: ['more'], + text: 'Read More ...', + }); + expect(highlighted).to.equal('Read More ...'); + }); + + it('highlights a term found regardless of casing', async () => { + const highlighted = highlightSearchTerms({ + search: 'fore', + terms: ['more'], + text: 'Read More ...', + }); + expect(highlighted).to.equal('Read More ...'); + }); + + it('highlights all terms found', async () => { + const highlighted = highlightSearchTerms({ + search: 'fore', + terms: ['more'], + text: 'Read more ... more you want to read', + }); + expect(highlighted).to.equal( + 'Read more ... more you want to read', + ); + }); + + it('highlights only the matching part if term and search do have the same beginning', async () => { + const highlighted = highlightSearchTerms({ + search: 'lau', + terms: ['launch'], + text: 'You should launch that product.', + }); + expect(highlighted).to.equal('You should launch that product.'); + }); + + it('truncates the text to 100 characters + highlight code', async () => { + const highlighted = highlightSearchTerms({ + search: 'launch', + terms: ['launch'], + text: [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ut dapibus arcu, a sodales orci. Mauris ante lectus, dictum vel nulla non.', + 'You should launch that product.', + 'Fusce vehicula ligula at scelerisque luctus. Etiam in porta augue. Integer ac nunc dapibus, feugiat metus sit.', + ].join(' '), + }); + expect(highlighted.length).to.equal(117); // 100 + 17 (the length of "" to highlight the term) + }); + + it('truncates the text to 100 characters + highlight code only for the turncated text', async () => { + const highlighted = highlightSearchTerms({ + search: 'l', + terms: ['l'], + text: [ + 'What lovely lego launch product you have laying around this lake of lonely lovers. Would be a shame if it would be lost.', + ].join(' '), + }); + expect(highlighted.length).to.equal(270); // 100 + 10*17 (the length of "" to highlight the term) + expect(highlighted).to.equal( + 'What lovely lego launch product you have laying around this lake of lonely lovers. Would be a shame ', + ); + }); + + it('truncates the text around to the first found term', async () => { + const highlighted = highlightSearchTerms({ + search: 'launch', + terms: ['launch'], + text: [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ut dapibus arcu, a sodales orci. Mauris ante lectus, dictum vel nulla non.', + 'You should launch that product.', + 'Fusce vehicula ligula at scelerisque luctus. Etiam in porta augue. Integer ac nunc dapibus, feugiat metus sit.', + ].join(' '), + }); + expect(highlighted).to.equal( + 'on. You should launch that product. Fusce vehicula ligula at scelerisque luctus. Etiam in porta augu', + ); + }); + + it('handles found terms right at the start of the text', async () => { + const highlighted = highlightSearchTerms({ + search: 'launch', + terms: ['launch'], + text: 'launch that product.', + }); + expect(highlighted.length).to.equal(37); // 20 + 17 (textlength + length of "") + expect(highlighted).to.equal('launch that product.'); + }); +}); diff --git a/packages/search/tsconfig.json b/packages/search/tsconfig.json new file mode 100644 index 00000000..4245e4bb --- /dev/null +++ b/packages/search/tsconfig.json @@ -0,0 +1,16 @@ +// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts + +{ + "extends": "../../tsconfig.node-base.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "./dist", + "rootDir": "./", + "composite": true, + "allowJs": true, + "checkJs": true + }, + "references": [], + "include": ["src", "preset", "node.js"], + "exclude": ["src/browser", "tests", "dist"] +} diff --git a/packages/search/web.js b/packages/search/web.js new file mode 100644 index 00000000..f847159e --- /dev/null +++ b/packages/search/web.js @@ -0,0 +1 @@ +export { RocketSearch } from './src/RocketSearch.js'; diff --git a/rocket.config.js b/rocket.config.js new file mode 100644 index 00000000..42310818 --- /dev/null +++ b/rocket.config.js @@ -0,0 +1,11 @@ +import { rocketLaunch } from '@rocket/launch'; +import { rocketBlog } from '@rocket/blog'; +import { rocketSearch } from '@rocket/search'; +import { absoluteBaseUrlNetlify } from '@rocket/core/helpers'; + +export default { + presets: [rocketLaunch(), rocketBlog(), rocketSearch()], + absoluteBaseUrl: absoluteBaseUrlNetlify('http://localhost:8080'), + + // emptyOutputDir: false, +}; diff --git a/scripts/generate-ts-configs.mjs b/scripts/generate-ts-configs.mjs new file mode 100644 index 00000000..9db99c26 --- /dev/null +++ b/scripts/generate-ts-configs.mjs @@ -0,0 +1,115 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { packages } from '../workspace-packages.mjs'; +import merge from 'deepmerge'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const TSCONFIG_COMMENT = `// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts\n\n`; + +const packagesRoot = path.join(__dirname, '..', 'packages'); + +const packageJSONMap = new Map(); +const packageDirnameMap = new Map(); +const internalDependencyMap = new Map(); + +// collect package json for all packages +packages.forEach(pkg => { + const packageJSONPath = path.join(packagesRoot, pkg.name, 'package.json'); + if (!fs.existsSync(packageJSONPath)) { + console.error(); + console.error(`Could not find package.json: ${packageJSONPath}`); + console.error(); + process.exit(1); + } + + const packageJSONData = JSON.parse(fs.readFileSync(packageJSONPath).toString()); + const packageName = packageJSONData.name; + packageDirnameMap.set(packageName, pkg.name); + packageJSONMap.set(packageName, packageJSONData); +}); + +// collect initial cross package dependencies info +packageDirnameMap.forEach((_packageDirname, packageName) => { + const { dependencies, devDependencies } = packageJSONMap.get(packageName); + + const internalDependencies = [ + ...(dependencies ? Object.keys(dependencies) : []), + ...(devDependencies ? Object.keys(devDependencies) : []), + ].filter(dep => packageDirnameMap.has(dep)); + + internalDependencyMap.set(packageName, internalDependencies); +}); + +function resolveInternalDependencies(dependencies) { + const childDeps = []; + + for (const idep of dependencies) { + const deps = internalDependencyMap.get(idep); + const res = resolveInternalDependencies(deps); + for (const jdep of res) { + childDeps.push(jdep); + } + } + const resolved = childDeps.concat(dependencies); + // remove all duplicated after the first appearance + return resolved.filter((item, idx) => resolved.indexOf(item) === idx); +} + +packageDirnameMap.forEach((packageDirname, packageName) => { + const pkg = packages.find(pkg => pkg.name === packageDirname); + const pkgDir = path.join(packagesRoot, packageDirname); + + const tsconfigPath = path.join(pkgDir, 'tsconfig.json'); + + let tsConfigOverride = {}; + const tsConfigOverridePath = path.join(pkgDir, 'tsconfig.override.json'); + + if (fs.existsSync(tsConfigOverridePath)) { + tsConfigOverride = JSON.parse(fs.readFileSync(tsConfigOverridePath)); + } + const overwriteMerge = (destinationArray, sourceArray) => sourceArray; + + const internalDependencies = resolveInternalDependencies(internalDependencyMap.get(packageName)); + const tsconfigData = merge( + { + extends: `../../tsconfig.${pkg.environment === 'browser' ? 'browser' : 'node'}-base.json`, + compilerOptions: { + module: + pkg.environment === 'browser' || pkg.environment === 'node-esm' ? 'ESNext' : 'commonjs', + outDir: './dist-types', + rootDir: '.', + composite: true, + allowJs: true, + strict: pkg.strict, + checkJs: pkg.type === 'js' ? true : undefined, + emitDeclarationOnly: pkg.type === 'js' ? true : undefined, + }, + references: internalDependencies.map(dep => { + return { path: `../${packageDirnameMap.get(dep)}/tsconfig.json` }; + }), + include: ['src', '*.js', 'types'], + exclude: ['dist', 'dist-types'], + }, + tsConfigOverride, + { arrayMerge: overwriteMerge }, + ); + fs.writeFileSync(tsconfigPath, TSCONFIG_COMMENT + JSON.stringify(tsconfigData, null, ' ')); +}); + +const projectLevelTsconfigPath = path.join(__dirname, '..', 'tsconfig.json'); + +const projectLevelTsconfigData = { + extends: './tsconfig.node-base.json', + files: [], + references: resolveInternalDependencies(Array.from(packageDirnameMap.keys())).map( + packageName => ({ + path: `./packages/${packageDirnameMap.get(packageName)}/tsconfig.json`, + }), + ), +}; + +fs.writeFileSync( + projectLevelTsconfigPath, + TSCONFIG_COMMENT + JSON.stringify(projectLevelTsconfigData, null, ' '), +); diff --git a/scripts/lint-versions.js b/scripts/lint-versions.js new file mode 100644 index 00000000..9172e9ba --- /dev/null +++ b/scripts/lint-versions.js @@ -0,0 +1,83 @@ +/* eslint-disable */ +import { readdirSync, existsSync, readFileSync } from 'fs'; + +const getDirectories = source => + readdirSync(source, { withFileTypes: true }) + .filter(pathMeta => pathMeta.isDirectory()) + .map(pathMeta => pathMeta.name); + +function readPackageJsonDeps(filePath) { + if (existsSync(filePath)) { + const jsonData = JSON.parse(readFileSync(filePath, 'utf-8')); + const merged = { ...jsonData.dependencies, ...jsonData.devDependencies }; + const result = {}; + Object.keys(merged).forEach(dep => { + if (merged[dep] && !merged[dep].includes('file:')) { + result[dep] = merged[dep]; + } + }); + return result; + } + return {}; +} + +function readPackageJsonNameVersion(filePath) { + if (existsSync(filePath)) { + const jsonData = JSON.parse(readFileSync(filePath, 'utf-8')); + const result = {}; + result[jsonData.name] = `^${jsonData.version}`; + return result; + } + return {}; +} + +function compareVersions(versionsA, versionsB) { + let output = ''; + const newVersions = { ...versionsA }; + Object.keys(versionsB).forEach(dep => { + if (versionsA[dep] && versionsB[dep] && versionsA[dep] !== versionsB[dep]) { + output += ` - "${dep}" should be "${versionsA[dep]}" but is "${versionsB[dep]}"\n`; + } + if (!newVersions[dep]) { + newVersions[dep] = versionsB[dep]; + } + }); + + return { + output, + newVersions, + }; +} + +let currentVersions = readPackageJsonDeps('./package.json'); +let endReturn = 0; + +// find all versions in the monorepo +['./packages'].forEach(rootDir => { + getDirectories(rootDir).forEach(subPackage => { + const filePath = `${rootDir}/${subPackage}/package.json`; + currentVersions = { ...currentVersions, ...readPackageJsonNameVersion(filePath) }; + }); +}); + +// lint all versions in packages +['./packages'].forEach(rootDir => { + getDirectories(rootDir).forEach(subPackage => { + const filePath = `${rootDir}/${subPackage}/package.json`; + const subPackageVersions = readPackageJsonDeps(filePath); + const { output, newVersions } = compareVersions(currentVersions, subPackageVersions); + currentVersions = { ...newVersions }; + if (output) { + console.log(`Version mismatches found in "${filePath}":`); + console.log(output); + console.log(); + endReturn = 1; + } + }); +}); + +if (endReturn === 0) { + console.log('All versions are aligned 💪'); +} + +process.exit(endReturn); diff --git a/scripts/runWindowsTests.mjs b/scripts/runWindowsTests.mjs new file mode 100644 index 00000000..5e1d13b7 --- /dev/null +++ b/scripts/runWindowsTests.mjs @@ -0,0 +1,6 @@ +import { runWorkspacesScripts } from './runWorkspacesScripts.mjs'; + +runWorkspacesScripts({ + script: 'test:ci', + concurrency: 1, +}); diff --git a/scripts/runWorkspacesScripts.mjs b/scripts/runWorkspacesScripts.mjs new file mode 100644 index 00000000..722d26c9 --- /dev/null +++ b/scripts/runWorkspacesScripts.mjs @@ -0,0 +1,67 @@ +import fs from 'fs'; +import { join, dirname, basename } from 'path'; +import { fileURLToPath } from 'url'; +import concurrently from 'concurrently'; +import chalk from 'chalk'; + +export function runWorkspacesScripts({ script, concurrency, filteredPackages = [] }) { + const moduleDir = dirname(fileURLToPath(import.meta.url)); + + function findPackagesWithScript(directory) { + const packages = []; + + for (const name of fs.readdirSync(directory)) { + if (!filteredPackages.includes(name)) { + const pkgPath = join(directory, name); + const pkgJsonPath = join(pkgPath, 'package.json'); + + if (fs.existsSync(pkgJsonPath)) { + const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')); + + if (pkgJson && pkgJson.scripts && pkgJson.scripts[script]) { + packages.push(pkgPath); + } + } + } + } + + return packages; + } + + const packagesDir = join(moduleDir, '..', 'packages'); + const packagesWithScript = findPackagesWithScript(packagesDir); + + const commands = packagesWithScript.map(pkgPath => ({ + name: basename(pkgPath), + command: `cd ${pkgPath} && yarn ${script}`, + })); + + concurrently(commands, { maxProcesses: concurrency }) + .then(() => { + console.log( + chalk.green( + `Successfully executed command ${chalk.yellow(script)} for packages: ${chalk.yellow( + commands.map(c => c.name).join(', '), + )}`, + ), + ); + console.log(); + }) + .catch(error => { + if (error instanceof Error) { + console.error(error); + } else if (Array.isArray(error)) { + const count = error.filter(error => error !== 0).length; + console.log(''); + console.log( + chalk.red( + `Failed to execute command ${chalk.yellow( + script, + )} for ${count} packages. But we don't know which ones, because concurrently doesn't say.`, + ), + ); + console.log(); + } + process.exit(1); + }); +} diff --git a/scripts/update-dependency.js b/scripts/update-dependency.js new file mode 100644 index 00000000..b20a2e3a --- /dev/null +++ b/scripts/update-dependency.js @@ -0,0 +1,73 @@ +/* eslint-disable */ +const fs = require('fs-extra'); +const path = require('path'); + +/** + * Script to update a single dependency on the monorepo. Example: + * + * yarn update-dependency rollup ^1.2.3 + */ + +const isDefined = _ => !!_; +const dependencyFields = ['dependencies', 'devDependencies', 'peerDependencies']; + +const [, , pkg, version] = process.argv; + +if (!pkg || !version) { + throw new Error( + 'Package and version must be specified. For example: yarn update-dependency rollup ^1.2.3', + ); +} + +function forEachParallel(items, callback) { + return Promise.all(items.map(callback)); +} + +async function run() { + const basedir = path.resolve(__dirname, '..'); + const dirs = [ + ...(await fs.readdir(path.join(basedir, 'packages'))).map(dir => path.join('packages', dir)), + ...(await fs.readdir(path.join(basedir, 'demo', 'projects'))).map(dir => + path.join('demo', 'projects', dir), + ), + ]; + + const rootPackageJsonPath = path.join(basedir, 'package.json'); + const readRootPackageJsonTask = fs.readJSON(rootPackageJsonPath, 'utf-8'); + + // read all project package.json + let packageJsons = await Promise.all( + dirs.map(async dir => { + const packageJsonPath = path.join(basedir, dir, 'package.json'); + if (!(await fs.pathExists(packageJsonPath))) return null; + const content = await fs.readJSON(packageJsonPath, 'utf-8'); + return { content, path: packageJsonPath }; + }), + ); + packageJsons = packageJsons.filter(isDefined); + + // read root package json + const rootPackageJson = await readRootPackageJsonTask; + packageJsons.push({ content: rootPackageJson, path: rootPackageJsonPath }); + + // update package.json files + await forEachParallel(packageJsons, async ({ content: packageJson, path: packageJsonPath }) => { + let changed = false; + + for (const field of dependencyFields) { + if (packageJson[field] && pkg in packageJson[field]) { + packageJson[field][pkg] = version; + changed = true; + } + } + + if (changed) { + console.log('updating package.json in ', packageJsonPath); + await fs.writeJSON(packageJsonPath, packageJson, { spaces: 2 }); + } + }); +} + +run().catch(e => { + console.error(e); +}); diff --git a/scripts/update-esm-entrypoints.mjs b/scripts/update-esm-entrypoints.mjs new file mode 100644 index 00000000..c45a8e6f --- /dev/null +++ b/scripts/update-esm-entrypoints.mjs @@ -0,0 +1,26 @@ +import fs from 'fs'; +import path from 'path'; +import { createRequire } from 'module'; +import { packages } from '../workspace-packages.mjs'; + +const require = createRequire(import.meta.url); + +for (const pkg of packages) { + if (pkg.type === 'ts' && pkg.environment === 'node') { + const pkgPath = path.join(process.cwd(), 'packages', pkg.name); + const cjsModule = require(path.join(pkgPath, 'dist', 'index.js')); + const namedExports = Object.keys(cjsModule) + .filter(name => name !== 'default' && !name.startsWith('_')) + .join(', '); + const esmEntrypoint = `// this file is autogenerated with the update-esm-entrypoints script +import cjsEntrypoint from './dist/index.js'; + +const { ${namedExports} } = cjsEntrypoint; + +export { ${namedExports} }`; + const esmEntrypointDts = "export * from './dist/index.js'"; + + fs.writeFileSync(path.join(pkgPath, 'index.mjs'), esmEntrypoint); + fs.writeFileSync(path.join(pkgPath, 'index.d.ts'), esmEntrypointDts); + } +} diff --git a/scripts/update-package-configs.mjs b/scripts/update-package-configs.mjs new file mode 100644 index 00000000..b4394ac4 --- /dev/null +++ b/scripts/update-package-configs.mjs @@ -0,0 +1,113 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { packages } from '../workspace-packages.mjs'; +import merge from 'deepmerge'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const TSCONFIG_COMMENT = `// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts\n\n`; + +const packagesRoot = path.join(__dirname, '..', 'packages'); + +const packageJSONMap = new Map(); +const packageDirnameMap = new Map(); +const internalDependencyMap = new Map(); + +// collect package json for all packages +packages.forEach(pkg => { + const packageJSONPath = path.join(packagesRoot, pkg.name, 'package.json'); + if (!fs.existsSync(packageJSONPath)) { + console.error(); + console.error(`Could not find package.json: ${packageJSONPath}`); + console.error(); + process.exit(1); + } + + const packageJSONData = JSON.parse(fs.readFileSync(packageJSONPath).toString()); + const packageName = packageJSONData.name; + packageDirnameMap.set(packageName, pkg.name); + packageJSONMap.set(packageName, packageJSONData); +}); + +// collect initial cross package dependencies info +packageDirnameMap.forEach((_packageDirname, packageName) => { + const { dependencies, devDependencies } = packageJSONMap.get(packageName); + + const internalDependencies = [ + ...(dependencies ? Object.keys(dependencies) : []), + ...(devDependencies ? Object.keys(devDependencies) : []), + ].filter(dep => packageDirnameMap.has(dep)); + + internalDependencyMap.set(packageName, internalDependencies); +}); + +function resolveInternalDependencies(dependencies) { + const childDeps = []; + + for (const idep of dependencies) { + const deps = internalDependencyMap.get(idep); + const res = resolveInternalDependencies(deps); + for (const jdep of res) { + childDeps.push(jdep); + } + } + const resolved = childDeps.concat(dependencies); + // remove all duplicated after the first appearance + return resolved.filter((item, idx) => resolved.indexOf(item) === idx); +} + +packageDirnameMap.forEach((packageDirname, packageName) => { + const pkg = packages.find(pkg => pkg.name === packageDirname); + const pkgDir = path.join(packagesRoot, packageDirname); + + const tsconfigPath = path.join(pkgDir, 'tsconfig.json'); + + let tsConfigOverride = {}; + const tsConfigOverridePath = path.join(pkgDir, 'tsconfig.override.json'); + + if (fs.existsSync(tsConfigOverridePath)) { + tsConfigOverride = JSON.parse(fs.readFileSync(tsConfigOverridePath)); + } + const overwriteMerge = (destinationArray, sourceArray) => sourceArray; + + const internalDependencies = resolveInternalDependencies(internalDependencyMap.get(packageName)); + const tsconfigData = merge( + { + extends: `../../tsconfig.${pkg.environment === 'browser' ? 'browser' : 'node'}-base.json`, + compilerOptions: { + module: pkg.environment === 'browser' ? 'ESNext' : 'commonjs', + outDir: './dist', + rootDir: './src', + composite: true, + allowJs: true, + checkJs: pkg.type === 'js' ? true : undefined, + emitDeclarationOnly: pkg.type === 'js' ? true : undefined, + }, + references: internalDependencies.map(dep => { + return { path: `../${packageDirnameMap.get(dep)}/tsconfig.json` }; + }), + include: ['src'], + exclude: ['src/browser', 'tests', 'dist'], + }, + tsConfigOverride, + { arrayMerge: overwriteMerge }, + ); + fs.writeFileSync(tsconfigPath, TSCONFIG_COMMENT + JSON.stringify(tsconfigData, null, ' ')); +}); + +const projectLevelTsconfigPath = path.join(__dirname, '..', 'tsconfig.json'); + +const projectLevelTsconfigData = { + extends: './tsconfig.node-base.json', + files: [], + references: resolveInternalDependencies(Array.from(packageDirnameMap.keys())).map( + packageName => ({ + path: `./packages/${packageDirnameMap.get(packageName)}/tsconfig.json`, + }), + ), +}; + +fs.writeFileSync( + projectLevelTsconfigPath, + TSCONFIG_COMMENT + JSON.stringify(projectLevelTsconfigData, null, ' '), +); diff --git a/scripts/workspaces-scripts-bin.mjs b/scripts/workspaces-scripts-bin.mjs new file mode 100644 index 00000000..2a0703b8 --- /dev/null +++ b/scripts/workspaces-scripts-bin.mjs @@ -0,0 +1,4 @@ +import { runWorkspacesScripts } from './runWorkspacesScripts.mjs'; + +const script = process.argv[process.argv.length - 1]; +runWorkspacesScripts({ script, concurrency: 5 }); diff --git a/tsconfig.browser-base.json b/tsconfig.browser-base.json new file mode 100644 index 00000000..2135721b --- /dev/null +++ b/tsconfig.browser-base.json @@ -0,0 +1,66 @@ +{ + "compilerOptions": { + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ES2018" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./dist" /* Redirect output structure to the directory. */, + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + "downlevelIteration": true /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */, + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "typeRoots": ["@types", "./types"], + "types": ["mocha", "chai"] /* Type declaration files to be included in compilation. */, + "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..6466bb08 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,35 @@ +// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts + +{ + "extends": "./tsconfig.node-base.json", + "files": [], + "references": [ + { + "path": "./packages/mdjs-preview/tsconfig.json" + }, + { + "path": "./packages/mdjs-story/tsconfig.json" + }, + { + "path": "./packages/plugins-manager/tsconfig.json" + }, + { + "path": "./packages/mdjs-core/tsconfig.json" + }, + { + "path": "./packages/core/tsconfig.json" + }, + { + "path": "./packages/eleventy-plugin-mdjs-unified/tsconfig.json" + }, + { + "path": "./packages/eleventy-rocket-nav/tsconfig.json" + }, + { + "path": "./packages/drawer/tsconfig.json" + }, + { + "path": "./packages/navigation/tsconfig.json" + } + ] +} \ No newline at end of file diff --git a/tsconfig.node-base.json b/tsconfig.node-base.json new file mode 100644 index 00000000..e881307c --- /dev/null +++ b/tsconfig.node-base.json @@ -0,0 +1,75 @@ +{ + "compilerOptions": { + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ES2017" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./dist" /* Redirect output structure to the directory. */, + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + "downlevelIteration": true /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */, + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "typeRoots": ["@types", "./types"], + "types": ["node", "mocha", "chai"] /* Type declaration files to be included in compilation. */, + "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + "skipLibCheck": true, + /* Advanced Options */ + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + "lib": [ + "DOM", + "DOM.Iterable", + "ES6", + "ES2017", + // Allows array.flatMap. import `array-flat-polyfill` to cover node10 + "ES2019.array", + "ScriptHost" + ] + } +} diff --git a/web-test-runner-chrome.config.mjs b/web-test-runner-chrome.config.mjs new file mode 100644 index 00000000..2c02cc7e --- /dev/null +++ b/web-test-runner-chrome.config.mjs @@ -0,0 +1,7 @@ +import { playwrightLauncher } from '@web/test-runner-playwright'; +import defaultConfig from './web-test-runner.config.mjs'; + +const config = { ...defaultConfig }; +config.browsers = [playwrightLauncher({ product: 'chromium' })]; + +export default config; diff --git a/web-test-runner-firefox.config.mjs b/web-test-runner-firefox.config.mjs new file mode 100644 index 00000000..7d42e2d8 --- /dev/null +++ b/web-test-runner-firefox.config.mjs @@ -0,0 +1,7 @@ +import { playwrightLauncher } from '@web/test-runner-playwright'; +import defaultConfig from './web-test-runner.config.mjs'; + +const config = { ...defaultConfig }; +config.browsers = [playwrightLauncher({ product: 'firefox' })]; + +export default config; diff --git a/web-test-runner-webkit.config.mjs b/web-test-runner-webkit.config.mjs new file mode 100644 index 00000000..a2f13d86 --- /dev/null +++ b/web-test-runner-webkit.config.mjs @@ -0,0 +1,7 @@ +import { playwrightLauncher } from '@web/test-runner-playwright'; +import defaultConfig from './web-test-runner.config.mjs'; + +const config = { ...defaultConfig }; +config.browsers = [playwrightLauncher({ product: 'webkit' })]; + +export default config; diff --git a/web-test-runner.config.mjs b/web-test-runner.config.mjs new file mode 100644 index 00000000..c3f27b1a --- /dev/null +++ b/web-test-runner.config.mjs @@ -0,0 +1,25 @@ +import fs from 'fs'; +import { playwrightLauncher } from '@web/test-runner-playwright'; + +const packages = fs + .readdirSync('packages') + .filter( + dir => + fs.statSync(`packages/${dir}`).isDirectory() && fs.existsSync(`packages/${dir}/test-web`), + ); + +export default { + files: 'packages/*/test-web/**/*.test.{js,ts}', + nodeResolve: true, + browsers: [ + playwrightLauncher({ product: 'firefox' }), + playwrightLauncher({ product: 'chromium' }), + // playwrightLauncher({ product: 'webkit' }), + ], + groups: packages.map(pkg => { + return { + name: pkg, + files: `packages/${pkg}/test-web/**/*.test.js`, + }; + }), +}; diff --git a/workspace-packages.mjs b/workspace-packages.mjs new file mode 100644 index 00000000..dde4c36e --- /dev/null +++ b/workspace-packages.mjs @@ -0,0 +1,14 @@ +const packages = [ + // { name: 'cli', type: 'js', environment: 'node-esm' }, + { name: 'plugins-manager', type: 'js', environment: 'node-esm' }, + { name: 'core', type: 'js', environment: 'node' }, + { name: 'eleventy-plugin-mdjs-unified', type: 'js', environment: 'node' }, + { name: 'eleventy-rocket-nav', type: 'js', environment: 'node' }, + { name: 'drawer', type: 'js', environment: 'browser' }, + { name: 'navigation', type: 'js', environment: 'browser' }, + { name: 'mdjs-core', type: 'js', environment: 'node' }, + { name: 'mdjs-preview', type: 'js', environment: 'browser' }, + { name: 'mdjs-story', type: 'js', environment: 'browser' }, +]; + +export { packages }; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..faa34e6e --- /dev/null +++ b/yarn.lock @@ -0,0 +1,8920 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@11ty/dependency-tree@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@11ty/dependency-tree/-/dependency-tree-1.0.0.tgz#b1fa53da49aafe0ab3fe38bc6b6058b704aa59a1" + integrity sha512-2FWYlkphQ/83MG7b9qqBJfJJ0K9zupNz/6n4EdDuNLw6hQHGp4Sp4UMDRyBvA/xCTYDBaPSuSjHuu45tSujegg== + +"@11ty/eleventy@^0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@11ty/eleventy/-/eleventy-0.11.1.tgz#2820c4d920756c25b068265a3faea18dae280dbc" + integrity sha512-90iTOifuiRN92gttDFMeGsAuG0/5XwsKvCn/9d5CHYUO80Okq0biSJxr69abYmOstg9jHfkaVxuPkcs4feRb8Q== + dependencies: + "@11ty/dependency-tree" "^1.0.0" + browser-sync "^2.26.13" + chalk "^3.0.0" + chokidar "^3.4.0" + debug "^4.1.1" + dependency-graph "^0.9.0" + ejs "^2.7.4" + fast-glob "^3.2.2" + fs-extra "^8.1.0" + gray-matter "^4.0.2" + hamljs "^0.6.2" + handlebars "^4.7.6" + javascript-stringify "^2.0.1" + liquidjs "^6.4.3" + lodash "^4.17.15" + luxon "^1.24.1" + markdown-it "^10.0.0" + minimist "^1.2.5" + moo "^0.5.1" + multimatch "^4.0.0" + mustache "^2.3.2" + normalize-path "^3.0.0" + nunjucks "^3.2.1" + parse-filepath "^1.0.2" + please-upgrade-node "^3.2.0" + pretty "^2.0.0" + pug "^2.0.4" + recursive-copy "^2.0.10" + semver "^7.3.2" + slugify "^1.4.0" + time-require "^0.1.2" + valid-url "^1.0.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" + integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== + +"@babel/core@^7.11.1", "@babel/core@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.10" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.10", "@babel/generator@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" + integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== + dependencies: + "@babel/types" "^7.12.11" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" + integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-compilation-targets@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" + integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== + dependencies: + "@babel/compat-data" "^7.12.5" + "@babel/helper-validator-option" "^7.12.1" + browserslist "^4.14.5" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" + integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-regexp-features-plugin@^7.12.1": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" + integrity sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + regexpu-core "^4.7.1" + +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" + +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" + integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" + integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/types" "^7.12.11" + +"@babel/helper-get-function-arity@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" + integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.12.1", "@babel/helper-member-expression-to-functions@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" + integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== + dependencies: + "@babel/types" "^7.12.7" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== + dependencies: + "@babel/types" "^7.12.5" + +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" + integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-remap-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" + integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/types" "^7.12.1" + +"@babel/helper-replace-supers@^7.12.1": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz#ea511658fc66c7908f923106dd88e08d1997d60d" + integrity sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.7" + "@babel/helper-optimise-call-expression" "^7.12.10" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.11" + +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a" + integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== + dependencies: + "@babel/types" "^7.12.11" + +"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f" + integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw== + +"@babel/helper-wrap-function@^7.10.4": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" + integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" + integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== + +"@babel/plugin-proposal-async-generator-functions@^7.12.1": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz#04b8f24fd4532008ab4e79f788468fd5a8476566" + integrity sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-dynamic-import@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" + integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-namespace-from@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" + integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" + integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" + integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" + integrity sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" + integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" + integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" + integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" + integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" + integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" + integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" + integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" + integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + +"@babel/plugin-transform-block-scoped-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" + integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.12.11": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz#d93a567a152c22aea3b1929bb118d1d0a175cdca" + integrity sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-classes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" + integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" + integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-destructuring@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" + integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" + integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-duplicate-keys@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" + integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-exponentiation-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" + integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-for-of@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" + integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-function-name@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" + integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" + integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" + integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-modules-amd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" + integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" + integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.12.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" + integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== + dependencies: + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-identifier" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" + integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" + integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + +"@babel/plugin-transform-new-target@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" + integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-object-super@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" + integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + +"@babel/plugin-transform-parameters@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" + integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-property-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" + integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" + integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" + integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-shorthand-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" + integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" + integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" + integrity sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-template-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" + integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typeof-symbol@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz#de01c4c8f96580bd00f183072b0d0ecdcf0dec4b" + integrity sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-escapes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" + integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" + integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9" + integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw== + dependencies: + "@babel/compat-data" "^7.12.7" + "@babel/helper-compilation-targets" "^7.12.5" + "@babel/helper-module-imports" "^7.12.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.11" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.7" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.11" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.7" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.10" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.11" + core-js-compat "^3.8.0" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.10.4", "@babel/runtime@^7.11.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4", "@babel/template@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" + integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" + integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== + dependencies: + "@babel/code-frame" "^7.12.11" + "@babel/generator" "^7.12.11" + "@babel/helper-function-name" "^7.12.11" + "@babel/helper-split-export-declaration" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/types" "^7.12.12" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.4": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" + integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@blakeembrey/deque@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@blakeembrey/deque/-/deque-1.0.5.tgz#f4fa17fc5ee18317ec01a763d355782c7b395eaf" + integrity sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg== + +"@blakeembrey/template@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@blakeembrey/template/-/template-1.0.0.tgz#bf8828bc3ae8004d97904d78f64e3cc2cd216438" + integrity sha512-J6WGZqCLdRMHUkyRG6fBSIFJ0rL60/nsQNh5rQvsYZ5u0PsKw6XQcJcA3DWvd9cN3j/IQx5yB1fexhCafwwUUw== + +"@bundled-es-modules/message-format@6.0.4": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/message-format/-/message-format-6.0.4.tgz#232da6877adb960f6c8f598c72588a84352de147" + integrity sha512-NGUoPxqsBzDwvRhY3A3L/AhS1hzS9OWappfyDOyCwE7G3W4ua28gau7QwvJz7QzA6ArbAdeb8c1mLjvd1WUFAA== + +"@changesets/apply-release-plan@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-4.1.0.tgz#ec67c9a0f507c19740d9344766e37dd51fc981ee" + integrity sha512-NKMg0In+945eCGxPQJa6haKMDIr6WFngnsqRICaTH28WJy0NZoURoTUcAUSdgvur1J+9rWuVgWAfISyRpLErzg== + dependencies: + "@babel/runtime" "^7.10.4" + "@changesets/config" "^1.2.0" + "@changesets/get-version-range-type" "^0.3.2" + "@changesets/git" "^1.0.5" + "@changesets/types" "^3.1.0" + "@manypkg/get-packages" "^1.0.1" + detect-indent "^6.0.0" + fs-extra "^7.0.1" + lodash.startcase "^4.4.0" + outdent "^0.5.0" + prettier "^1.19.1" + resolve-from "^5.0.0" + semver "^5.4.1" + +"@changesets/assemble-release-plan@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-4.0.1.tgz#37906bd89226274c6a67ba2598de001b617e01ab" + integrity sha512-1UqJpX5Tj2kGtcI3anG3vsLFfX6na5fLsPaxwgS7T/zt1jJ1hv0cMC+iP6fd9BuCHvcFn22GT74bcRaVnAvm3Q== + dependencies: + "@babel/runtime" "^7.10.4" + "@changesets/errors" "^0.1.4" + "@changesets/get-dependents-graph" "^1.1.3" + "@changesets/types" "^3.1.0" + "@manypkg/get-packages" "^1.0.1" + semver "^5.4.1" + +"@changesets/cli@^2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.12.0.tgz#26124b051e6ce6dcc5aa4595588c8cb2ce3e4363" + integrity sha512-dGdFkg75zsaEObsG8gwMLglS6sJVjXWwgVTAzEIjqIoWVnKwqZqccTb4gn0noq47uCwy7SqxiAJqGibIy9UOKw== + dependencies: + "@babel/runtime" "^7.10.4" + "@changesets/apply-release-plan" "^4.0.0" + "@changesets/assemble-release-plan" "^4.0.0" + "@changesets/config" "^1.4.0" + "@changesets/errors" "^0.1.4" + "@changesets/get-dependents-graph" "^1.1.3" + "@changesets/get-release-plan" "^2.0.1" + "@changesets/git" "^1.0.6" + "@changesets/logger" "^0.0.5" + "@changesets/pre" "^1.0.4" + "@changesets/read" "^0.4.6" + "@changesets/types" "^3.2.0" + "@changesets/write" "^0.1.3" + "@manypkg/get-packages" "^1.0.1" + "@types/semver" "^6.0.0" + boxen "^1.3.0" + chalk "^2.1.0" + enquirer "^2.3.0" + external-editor "^3.1.0" + fs-extra "^7.0.1" + human-id "^1.0.2" + is-ci "^2.0.0" + meow "^6.0.0" + outdent "^0.5.0" + p-limit "^2.2.0" + preferred-pm "^3.0.0" + semver "^5.4.1" + spawndamnit "^2.0.0" + term-size "^2.1.0" + tty-table "^2.8.10" + +"@changesets/config@^1.2.0", "@changesets/config@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@changesets/config/-/config-1.4.0.tgz#c157a4121f198b749f2bbc2e9015b6e976ece7d6" + integrity sha512-eoTOcJ6py7jBDY8rUXwEGxR5UtvUX+p//0NhkVpPGcnvIeITHq+DOIsuWyGzWcb+1FaYkof3CCr32/komZTu4Q== + dependencies: + "@changesets/errors" "^0.1.4" + "@changesets/get-dependents-graph" "^1.1.3" + "@changesets/logger" "^0.0.5" + "@changesets/types" "^3.2.0" + "@manypkg/get-packages" "^1.0.1" + fs-extra "^7.0.1" + micromatch "^4.0.2" + +"@changesets/errors@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@changesets/errors/-/errors-0.1.4.tgz#f79851746c43679a66b383fdff4c012f480f480d" + integrity sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q== + dependencies: + extendable-error "^0.1.5" + +"@changesets/get-dependents-graph@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-1.1.3.tgz#da959c43ce98f3a990a6b8d9c1f894bcc1b629c7" + integrity sha512-cTbySXwSv9yWp4Pp5R/b5Qv23wJgFaFCqUbsI3IJ2pyPl0vMaODAZS8NI1nNK2XSxGIg1tw+dWNSR4PlrKBSVQ== + dependencies: + "@changesets/types" "^3.0.0" + "@manypkg/get-packages" "^1.0.1" + chalk "^2.1.0" + fs-extra "^7.0.1" + semver "^5.4.1" + +"@changesets/get-release-plan@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-2.0.1.tgz#b95d8f1a3cc719ff4b42b9b9aae72458d8787c13" + integrity sha512-+x5N9/Iaka+c0Kq7+3JsboMNyffKYlWPmdm+VeafDcMwJFhBDkxm84qaCJ93ydmnzQOTig6gYVqw0k8BbHExyQ== + dependencies: + "@babel/runtime" "^7.10.4" + "@changesets/assemble-release-plan" "^4.0.0" + "@changesets/config" "^1.2.0" + "@changesets/pre" "^1.0.4" + "@changesets/read" "^0.4.6" + "@changesets/types" "^3.1.0" + "@manypkg/get-packages" "^1.0.1" + +"@changesets/get-version-range-type@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz#8131a99035edd11aa7a44c341cbb05e668618c67" + integrity sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg== + +"@changesets/git@^1.0.5", "@changesets/git@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@changesets/git/-/git-1.0.6.tgz#057e627e5d3fcb74bf6c18d7284e130ba5a7632e" + integrity sha512-e0M06XuME3W5lGhz+CO0vLc60u+hLk/pYjOx/6GXEWuQrwtGgeycFIfRgRt8qTs664o1oKtVHBbd7ItpoWgFfA== + dependencies: + "@babel/runtime" "^7.10.4" + "@changesets/errors" "^0.1.4" + "@changesets/types" "^3.1.1" + "@manypkg/get-packages" "^1.0.1" + is-subdir "^1.1.1" + spawndamnit "^2.0.0" + +"@changesets/logger@^0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.0.5.tgz#68305dd5a643e336be16a2369cb17cdd8ed37d4c" + integrity sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw== + dependencies: + chalk "^2.1.0" + +"@changesets/parse@^0.3.6": + version "0.3.7" + resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.3.7.tgz#1368136e2b83d5cff11b4d383a3032723530db99" + integrity sha512-8yqKulslq/7V2VRBsJqPgjnZMoehYqhJm5lEOXJPZ2rcuSdyj8+p/2vq2vRDBJT2m0rP+C9G8DujsGYQIFZezw== + dependencies: + "@changesets/types" "^3.0.0" + js-yaml "^3.13.1" + +"@changesets/pre@^1.0.4": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-1.0.5.tgz#91e5e3b31b4a85ce37de72f6511a786f62f29b51" + integrity sha512-p43aAQY3aijhDnBLCriPao5YArlRjD4mSHRJq9PsBhljVLWqQQXcn6seSd77d+bD1tATLhB8tQ2eYoxMtMydXQ== + dependencies: + "@babel/runtime" "^7.4.4" + "@changesets/errors" "^0.1.4" + "@changesets/types" "^3.0.0" + "@manypkg/get-packages" "^1.0.1" + fs-extra "^7.0.1" + +"@changesets/read@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.4.6.tgz#1c03e709a870a070fc95490ffa696297d23458f7" + integrity sha512-rOd8dsF/Lgyy2SYlDalb3Ts/meDI2AcKPXYhSXIW3k6+ZLlj6Pt+nmgV5Ut8euyH7loibklNTDemfvMffF4xig== + dependencies: + "@babel/runtime" "^7.4.4" + "@changesets/git" "^1.0.5" + "@changesets/logger" "^0.0.5" + "@changesets/parse" "^0.3.6" + "@changesets/types" "^3.0.0" + chalk "^2.1.0" + fs-extra "^7.0.1" + p-filter "^2.1.0" + +"@changesets/types@^3.0.0", "@changesets/types@^3.1.0", "@changesets/types@^3.1.1", "@changesets/types@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@changesets/types/-/types-3.2.0.tgz#d8306d7219c3b19b6d860ddeb9d7374e2dd6b035" + integrity sha512-rAmPtOyXpisEEE25CchKNUAf2ApyAeuZ/h78YDoqKZaCk5tUD0lgYZGPIRV9WTPoqNjJULIym37ogc6pkax5jg== + +"@changesets/write@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.1.3.tgz#00ae575af50274773d7493e77fb96838a08ad8ad" + integrity sha512-q79rbwlVmTNKP9O6XxcMDj81CEOn/kQHbTFdRleW0tFUv98S1EyEAE9vLPPzO6WnQipHnaozxB1zMhHy0aQn8Q== + dependencies: + "@babel/runtime" "^7.4.4" + "@changesets/types" "^3.0.0" + fs-extra "^7.0.1" + human-id "^1.0.2" + prettier "^1.18.2" + +"@eslint/eslintrc@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@hapi/address@^2.1.2": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/formula@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-1.2.0.tgz#994649c7fea1a90b91a0a1e6d983523f680e10cd" + integrity sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA== + +"@hapi/hoek@^8.2.4", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + +"@hapi/joi@^16.1.8": + version "16.1.8" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.8.tgz#84c1f126269489871ad4e2decc786e0adef06839" + integrity sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg== + dependencies: + "@hapi/address" "^2.1.2" + "@hapi/formula" "^1.2.0" + "@hapi/hoek" "^8.2.4" + "@hapi/pinpoint" "^1.0.2" + "@hapi/topo" "^3.1.3" + +"@hapi/pinpoint@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-1.0.2.tgz#025b7a36dbbf4d35bf1acd071c26b20ef41e0d13" + integrity sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ== + +"@hapi/topo@^3.1.3": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + +"@lion/combobox@^0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@lion/combobox/-/combobox-0.1.16.tgz#f36a6ffab0c00eaf55b801c02b7be224391bba27" + integrity sha512-txkiTEIkaRvuAPD4hIkaZzUTQwfMVwbC/dozHJt3sps1M7LOm3KMnj2Tc4dCVWGx11TbOEdbjPbaeHktwefu0w== + dependencies: + "@lion/core" "0.13.6" + "@lion/form-core" "0.6.14" + "@lion/listbox" "0.3.12" + "@lion/overlays" "0.22.8" + +"@lion/core@0.13.6": + version "0.13.6" + resolved "https://registry.yarnpkg.com/@lion/core/-/core-0.13.6.tgz#de769c53842e6c67b70e48d487c6cd1220627e4d" + integrity sha512-AuK6gOmWjf149l0gz5ry05v6rewlsHbXY6BkiLBgu2Fg9DRd/PGomFv9FVEDdHR2xv593jKgQVnGWmmhPU0UUQ== + dependencies: + "@open-wc/dedupe-mixin" "^1.2.18" + "@open-wc/scoped-elements" "^1.3.2" + lit-element "~2.4.0" + lit-html "^1.3.0" + +"@lion/form-core@0.6.14": + version "0.6.14" + resolved "https://registry.yarnpkg.com/@lion/form-core/-/form-core-0.6.14.tgz#55bfb407c415a57d8fc97cabcb564dba9442a532" + integrity sha512-1IwlE9FN0Dvr5ebpzIlqVeONMgWtWDlb598kUBZBZuJrytP6KCMKn/3ftAU4AZWA4zhhHx7SMxfyzw6Bizp0vw== + dependencies: + "@lion/core" "0.13.6" + "@lion/localize" "0.15.3" + +"@lion/listbox@0.3.12": + version "0.3.12" + resolved "https://registry.yarnpkg.com/@lion/listbox/-/listbox-0.3.12.tgz#50d48fc09e325b2aa69dbd7f3865a8f67d0f4a5e" + integrity sha512-v9tKhYHT3DmsszZmdXlKEncSNMGuDABGnVX/dpDTnc7Ob4+Q8REoKyzTAU2JmXhyLiXEvW65I3CoowbVFjDD5Q== + dependencies: + "@lion/core" "0.13.6" + "@lion/form-core" "0.6.14" + +"@lion/localize@0.15.3": + version "0.15.3" + resolved "https://registry.yarnpkg.com/@lion/localize/-/localize-0.15.3.tgz#86f33ebcacd7b60456280aa1e8325f84850819f2" + integrity sha512-byKVxo/Hd1/QUZSH4I2TgeGMXZCqeexJrCKujX0w/HDtsDS3i8sSt8Uus5PeA28F7P4wEQJgHZhy1s6Kz2TsZQ== + dependencies: + "@bundled-es-modules/message-format" "6.0.4" + "@lion/core" "0.13.6" + singleton-manager "1.2.0" + +"@lion/overlays@0.22.8", "@lion/overlays@^0.22.8": + version "0.22.8" + resolved "https://registry.yarnpkg.com/@lion/overlays/-/overlays-0.22.8.tgz#553c3c5e349667963a535097699d5b95a698a078" + integrity sha512-J/lRoUhlZfBjkaAmw1ALjTj4zO3zpA7QZlOHr3yWoSnrdbR3e3vSV4OwqMJrhuvdsWaIBNmEccE/qeVMyI0vPg== + dependencies: + "@lion/core" "0.13.6" + popper.js "^1.15.0" + singleton-manager "1.2.0" + +"@manypkg/find-root@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" + integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== + dependencies: + "@babel/runtime" "^7.5.5" + "@types/node" "^12.7.1" + find-up "^4.1.0" + fs-extra "^8.1.0" + +"@manypkg/get-packages@^1.0.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.1.tgz#7c7e72d0061ab2e61d2ce4da58ce91290a60ac8d" + integrity sha512-J6VClfQSVgR6958eIDTGjfdCrELy1eT+SHeoSMomnvRQVktZMnEA5edIr5ovRFNw5y+Bk/jyoevPzGYod96mhw== + dependencies: + "@babel/runtime" "^7.5.5" + "@manypkg/find-root" "^1.1.0" + fs-extra "^8.1.0" + globby "^11.0.0" + read-yaml-file "^1.1.0" + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@open-wc/chai-dom-equals@^0.12.36": + version "0.12.36" + resolved "https://registry.yarnpkg.com/@open-wc/chai-dom-equals/-/chai-dom-equals-0.12.36.tgz#ed0eb56b9e98c4d7f7280facce6215654aae9f4c" + integrity sha512-Gt1fa37h4rtWPQGETSU4n1L678NmMi9KwHM1sH+JCGcz45rs8DBPx7MUVeGZ+HxRlbEI5t9LU2RGGv6xT2OlyA== + dependencies: + "@open-wc/semantic-dom-diff" "^0.13.16" + "@types/chai" "^4.1.7" + +"@open-wc/dedupe-mixin@^1.2.18", "@open-wc/dedupe-mixin@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@open-wc/dedupe-mixin/-/dedupe-mixin-1.3.0.tgz#0df5d438285fc3482838786ee81895318f0ff778" + integrity sha512-UfdK1MPnR6T7f3svzzYBfu3qBkkZ/KsPhcpc3JYhsUY4hbpwNF9wEQtD4Z+/mRqMTJrKg++YSxIxE0FBhY3RIw== + +"@open-wc/scoped-elements@^1.2.4", "@open-wc/scoped-elements@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@open-wc/scoped-elements/-/scoped-elements-1.3.2.tgz#6ae54c49731bbe8c3e0b5383c989f983dcdfacf5" + integrity sha512-DoP3XA8r03tGx+IrlJwP/voLuDFkyS56kvwhmXIhpESo7M5jMt5e0zScNrawj7EMe4b5gDaJjorx2Jza8FLaLw== + dependencies: + "@open-wc/dedupe-mixin" "^1.3.0" + lit-html "^1.0.0" + +"@open-wc/semantic-dom-diff@^0.13.16": + version "0.13.21" + resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.13.21.tgz#718b9ec5f9a98935fc775e577ad094ae8d8b7dea" + integrity sha512-BONpjHcGX2zFa9mfnwBCLEmlDsOHzT+j6Qt1yfK3MzFXFtAykfzFjAgaxPetu0YbBlCfXuMlfxI4vlRGCGMvFg== + +"@open-wc/semantic-dom-diff@^0.19.3": + version "0.19.4" + resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.4.tgz#d6c880224cce52d14a8f8a116ec76611426463aa" + integrity sha512-jiqM40e8WKOPIzf48lFlf+2eHhNiIeumprFQ05xCrktRQtvUlBpYNIQ0427z/aGr+56p8KIiWzx1K/0lbLWaqw== + dependencies: + "@types/chai" "^4.2.11" + +"@open-wc/testing-helpers@^1.8.12": + version "1.8.12" + resolved "https://registry.yarnpkg.com/@open-wc/testing-helpers/-/testing-helpers-1.8.12.tgz#449865689b0283c117326c1e0975834406bb0855" + integrity sha512-+4exEHYvnFqI1RGDDIKFHPZ7Ws5NK1epvEku3zLaOYN3zc+huX19SndNc5+X++v8A+quN/iXbHlh80ROyNaYDA== + dependencies: + "@open-wc/scoped-elements" "^1.2.4" + lit-element "^2.2.1" + lit-html "^1.0.0" + +"@open-wc/testing@^2.5.32": + version "2.5.32" + resolved "https://registry.yarnpkg.com/@open-wc/testing/-/testing-2.5.32.tgz#8bbb65773f650deff06b06277df8cdacd4d6806f" + integrity sha512-vl8VwTG3CVLwLcd1mpts8D9xPptc6xPL/9AHEbQxX1IQsFBEiFQdARSp1+V/i7gK2+peXeotqrZ5NvoHxl/lLw== + dependencies: + "@open-wc/chai-dom-equals" "^0.12.36" + "@open-wc/semantic-dom-diff" "^0.19.3" + "@open-wc/testing-helpers" "^1.8.12" + "@types/chai" "^4.2.11" + "@types/chai-dom" "^0.0.9" + "@types/mocha" "^5.0.0" + "@types/sinon-chai" "^3.2.3" + chai "^4.2.0" + chai-a11y-axe "^1.3.1" + chai-dom "^1.8.1" + mocha "^6.2.2" + sinon-chai "^3.3.0" + +"@rollup/plugin-babel@^5.2.0", "@rollup/plugin-babel@^5.2.2": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.2.2.tgz#e5623a01dd8e37e004ba87f2de218c611727d9b2" + integrity sha512-MjmH7GvFT4TW8xFdIeFS3wqIX646y5tACdxkTO+khbHvS3ZcVJL6vkAHLw2wqPmkhwCfWHoNsp15VYNwW6JEJA== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-commonjs@^17.0.0": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-17.0.0.tgz#2ae2228354cf0fbba6cf9f06f30b2c66a974324c" + integrity sha512-/omBIJG1nHQc+bgkYDuLpb/V08QyutP9amOrJRUSlYJZP+b/68gM//D8sxJe3Yry2QnYIr3QjR3x4AlxJEN3GA== + dependencies: + "@rollup/pluginutils" "^3.1.0" + commondir "^1.0.1" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" + +"@rollup/plugin-json@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" + integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-node-resolve@^11.0.1": + version "11.0.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.0.1.tgz#d3765eec4bccf960801439a999382aed2dca959b" + integrity sha512-ltlsj/4Bhwwhb+Nb5xCz/6vieuEj2/BAkkqVIKmZwC7pIdl8srmgmglE4S0jFlZa32K4qvdQ6NHdmpRKD/LwoQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-node-resolve@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6" + integrity sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.17.0" + +"@rollup/plugin-replace@^2.3.3", "@rollup/plugin-replace@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.3.4.tgz#7dd84c17755d62b509577f2db37eb524d7ca88ca" + integrity sha512-waBhMzyAtjCL1GwZes2jaE9MjuQ/DQF2BatH3fRivUF3z0JBFrU0U6iBNC/4WR+2rLKhaAhPWDNPYp4mI6RqdQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/plugin-typescript@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-8.1.0.tgz#b7bbbbb4fd1324834f37844efd48b3844d912742" + integrity sha512-pyQlcGQYRsONUDwXK3ckGPHjPzmjlq4sinzr7emW8ZMb2oZjg9WLcdcP8wyHSvBjvHrLzMayyPy079RROqb4vw== + dependencies: + "@rollup/pluginutils" "^3.1.0" + resolve "^1.17.0" + +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/formatio@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089" + integrity sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^5.0.2" + +"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.0.tgz#1d2f0743dc54bf13fe9d508baefacdffa25d4329" + integrity sha512-hXpcfx3aq+ETVBwPlRFICld5EnrkexXuXDwqUNhDdr5L8VjvMeSRwyOa0qL7XFmR+jVWR4rUZtnxlG7RX72sBg== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@surma/rollup-plugin-off-main-thread@^1.4.1": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" + integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A== + dependencies: + ejs "^2.6.1" + magic-string "^0.25.0" + +"@types/accepts@*": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + +"@types/babel-types@*", "@types/babel-types@^7.0.0": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.9.tgz#01d7b86949f455402a94c788883fe4ba574cad41" + integrity sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA== + +"@types/babylon@^6.16.2": + version "6.16.5" + resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4" + integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w== + dependencies: + "@types/babel-types" "*" + +"@types/body-parser@*": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" + integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/chai-dom@^0.0.9": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@types/chai-dom/-/chai-dom-0.0.9.tgz#77379354efec2568284ca355fff6a4f85f5a66f4" + integrity sha512-jj4F2NJog2/GBYsyJ8+NvhnWUBbPY4MUAKLdPJE6+568rw12GGXvj0ycUuP5nndVrnJgozmJAoMTvxvjJATXWw== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.1.7", "@types/chai@^4.2.11", "@types/chai@^4.2.14": + version "4.2.14" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.14.tgz#44d2dd0b5de6185089375d976b4ec5caf6861193" + integrity sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ== + +"@types/command-line-args@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/command-line-args/-/command-line-args-5.0.0.tgz#484e704d20dbb8754a8f091eee45cdd22bcff28c" + integrity sha512-4eOPXyn5DmP64MCMF8ePDvdlvlzt2a+F8ZaVjqmh2yFCpGjc1kI3kGnCFYX9SCsGTjQcWIyVZ86IHCEyjy/MNg== + +"@types/connect@*": + version "3.4.34" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" + integrity sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" + integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== + +"@types/cookies@*": + version "0.7.6" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.6.tgz#71212c5391a976d3bae57d4b09fac20fc6bda504" + integrity sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/estree@*": + version "0.0.45" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" + integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/express-serve-static-core@*": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.17.tgz#6ba02465165b6c9c3d8db3a28def6b16fc9b70f5" + integrity sha512-YYlVaCni5dnHc+bLZfY908IG1+x5xuibKZMGv8srKkvtul3wUuanYvpIj9GXXoWkQbaAdR+kgX46IETKUALWNQ== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.9" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.9.tgz#f5f2df6add703ff28428add52bdec8a1091b0a78" + integrity sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/fs-extra@^9.0.6": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.6.tgz#488e56b77299899a608b8269719c1d133027a6ab" + integrity sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig== + dependencies: + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.1.tgz#b16872f2a6144c7025f296fb9636a667ebb79cd9" + integrity sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q== + dependencies: + "@types/unist" "*" + +"@types/http-assert@*": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" + integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== + +"@types/http-errors@*": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69" + integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA== + +"@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/json-schema@^7.0.3": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + +"@types/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + +"@types/koa-compose@*": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + +"@types/koa@*", "@types/koa@^2.11.6": + version "2.11.6" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.6.tgz#b7030caa6b44af801c2aea13ba77d74aff7484d5" + integrity sha512-BhyrMj06eQkk04C97fovEDQMpLpd2IxCB4ecitaXwOKGq78Wi2tooaDOWOFGajPk8IkQOAtMppApgSVkYe1F/A== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/mdast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + +"@types/mime@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== + +"@types/minimatch@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/minimist@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" + integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + +"@types/mocha@^5.0.0": + version "5.2.7" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" + integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== + +"@types/mocha@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" + integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== + +"@types/node@*", "@types/node@^14.14.16": + version "14.14.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.16.tgz#3cc351f8d48101deadfed4c9e4f116048d437b4b" + integrity sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw== + +"@types/node@^12.7.1": + version "12.19.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.11.tgz#9220ab4b20d91169eb78f456dbfcbabee89dfb50" + integrity sha512-bwVfNTFZOrGXyiQ6t4B9sZerMSShWNsGRw8tC5DY1qImUNczS9SjT4G6PnzjCnxsu5Ubj6xjL2lgwddkxtQl5w== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^5.0.0", "@types/parse5@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/puppeteer-core@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/puppeteer-core/-/puppeteer-core-2.1.0.tgz#453debf63b8e6654f41e2bb6075c223a29faa47e" + integrity sha512-q1s+x/3HuXQN1Xo9eVhCfRJ2SNfHA/a641iSZQRNnRH55t4jX7TsNWxQN0drLqwbz/Kp8nodJ5rTNYEIKX//gg== + dependencies: + "@types/puppeteer" "^2" + +"@types/puppeteer@^2": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-2.1.5.tgz#9137aa87dca21450820bfd6fa4fe747bc8176381" + integrity sha512-ZZKAcX5XVEtSK+CLxz6FhofPt8y1D3yDtjGZHDFBZ4bGe8v2aaS6qBDHY4crruvpb4jsO7HKrPEx39IIqsZAUg== + dependencies: + "@types/node" "*" + +"@types/qs@*": + version "6.9.5" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" + integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/semver@^6.0.0": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.2.tgz#5c27df09ca39e3c9beb4fae6b95f4d71426df0a9" + integrity sha512-RxAwYt4rGwK5GyoRwuP0jT6ZHAVTdz2EqgsHmX0PYNjGsko+OeT4WFXXTs/lM3teJUJodM+SNtAL5/pXIJ61IQ== + +"@types/serve-static@*": + version "1.13.8" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.8.tgz#851129d434433c7082148574ffec263d58309c46" + integrity sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/sinon-chai@^3.2.3": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48" + integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ== + dependencies: + "@types/chai" "*" + "@types/sinon" "*" + +"@types/sinon@*", "@types/sinon@^9.0.10": + version "9.0.10" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.10.tgz#7fb9bcb6794262482859cab66d59132fca18fcf7" + integrity sha512-/faDC0erR06wMdybwI/uR8wEKV/E83T0k4sepIpB7gXuy2gzx2xiOjmztq6a2Y6rIGJ04D+6UU0VBmWy+4HEMA== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae" + integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + +"@types/ws@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.0.tgz#499690ea08736e05a8186113dac37769ab251a0e" + integrity sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw== + dependencies: + "@types/node" "*" + +"@types/yauzl@^2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" + integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz#7579c6d17ad862154c10bc14b40e5427b729e209" + integrity sha512-fABclAX2QIEDmTMk6Yd7Muv1CzFLwWM4505nETzRHpP3br6jfahD9UUJkhnJ/g2m7lwfz8IlswcwGGPGiq9exw== + dependencies: + "@typescript-eslint/experimental-utils" "4.11.1" + "@typescript-eslint/scope-manager" "4.11.1" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz#2dad3535b878c25c7424e40bfa79d899f3f485bc" + integrity sha512-mAlWowT4A6h0TC9F+J5pdbEhjNiEMO+kqPKQ4sc3fVieKL71dEqfkKgtcFVSX3cjSBwYwhImaQ/mXQF0oaI38g== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.11.1" + "@typescript-eslint/types" "4.11.1" + "@typescript-eslint/typescript-estree" "4.11.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.11.1.tgz#981e18de2e019d6ca312596615f92e8f6f6598ed" + integrity sha512-BJ3jwPQu1jeynJ5BrjLuGfK/UJu6uwHxJ/di7sanqmUmxzmyIcd3vz58PMR7wpi8k3iWq2Q11KMYgZbUpRoIPw== + dependencies: + "@typescript-eslint/scope-manager" "4.11.1" + "@typescript-eslint/types" "4.11.1" + "@typescript-eslint/typescript-estree" "4.11.1" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz#72dc2b60b0029ab0888479b12bf83034920b4b69" + integrity sha512-Al2P394dx+kXCl61fhrrZ1FTI7qsRDIUiVSuN6rTwss6lUn8uVO2+nnF4AvO0ug8vMsy3ShkbxLu/uWZdTtJMQ== + dependencies: + "@typescript-eslint/types" "4.11.1" + "@typescript-eslint/visitor-keys" "4.11.1" + +"@typescript-eslint/types@4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.11.1.tgz#3ba30c965963ef9f8ced5a29938dd0c465bd3e05" + integrity sha512-5kvd38wZpqGY4yP/6W3qhYX6Hz0NwUbijVsX2rxczpY6OXaMxh0+5E5uLJKVFwaBM7PJe1wnMym85NfKYIh6CA== + +"@typescript-eslint/typescript-estree@4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz#a4416b4a65872a48773b9e47afabdf7519eb10bc" + integrity sha512-tC7MKZIMRTYxQhrVAFoJq/DlRwv1bnqA4/S2r3+HuHibqvbrPcyf858lNzU7bFmy4mLeIHFYr34ar/1KumwyRw== + dependencies: + "@typescript-eslint/types" "4.11.1" + "@typescript-eslint/visitor-keys" "4.11.1" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@4.11.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz#4c050a4c1f7239786e2dd4e69691436143024e05" + integrity sha512-IrlBhD9bm4bdYcS8xpWarazkKXlE7iYb1HzRuyBP114mIaj5DJPo11Us1HgH60dTt41TCZXMaTCAW+OILIYPOg== + dependencies: + "@typescript-eslint/types" "4.11.1" + eslint-visitor-keys "^2.0.0" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@web/browser-logs@^0.1.2", "@web/browser-logs@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@web/browser-logs/-/browser-logs-0.1.6.tgz#275c9e2e0aa5767d8a5649ba487378b9f6a61efb" + integrity sha512-AQ3y3W5CLC3b68PYWMnimTApjDsgk6qJt82bPTJTxzCp3HZaUxuZJeMxrtt7FrtmaPt6E56pJobu1pcaqn1jcA== + +"@web/config-loader@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@web/config-loader/-/config-loader-0.1.3.tgz#8325ea54f75ef2ee7166783e64e66936db25bff7" + integrity sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ== + dependencies: + semver "^7.3.4" + +"@web/dev-server-core@^0.3.0", "@web/dev-server-core@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@web/dev-server-core/-/dev-server-core-0.3.1.tgz#69cea537c59caa2e3a7a693f85eb5addcd638705" + integrity sha512-ZtWz01WLrPDEpgbRR+v/l9pSFbhnCe9pc8ujExOGGZ91qP3M8pbxItzT6loO8dpyPiZV3+m392eca2wfc/zoQQ== + dependencies: + "@types/koa" "^2.11.6" + "@types/ws" "^7.4.0" + "@web/parse5-utils" "^1.0.0" + chokidar "^3.4.3" + clone "^2.1.2" + es-module-lexer "^0.3.26" + get-stream "^6.0.0" + is-stream "^2.0.0" + isbinaryfile "^4.0.6" + koa "^2.13.0" + koa-etag "^4.0.0" + koa-send "^5.0.1" + koa-static "^5.0.0" + lru-cache "^6.0.0" + mime-types "^2.1.27" + parse5 "^6.0.1" + picomatch "^2.2.2" + ws "^7.4.1" + +"@web/dev-server-rollup@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@web/dev-server-rollup/-/dev-server-rollup-0.3.0.tgz#380ba8cd59a7920902136df5ab09045355c807de" + integrity sha512-Ubj4mf+uGahE1Fqds3O72C1ArzfS189o/+aNKanGWz68NledlZarlvavF/4iBjHX7C4n6ebpruz4NrqQAwZsfA== + dependencies: + "@web/dev-server-core" "^0.3.0" + chalk "^4.1.0" + parse5 "^6.0.1" + rollup "^2.35.1" + whatwg-url "^8.4.0" + +"@web/dev-server@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@web/dev-server/-/dev-server-0.1.2.tgz#f20d5ab687671cdebdc560a88b345f6dab41cba6" + integrity sha512-gx3yrrw8OtOuDffSGvuPHQl1su5NtdyJgDg9y+obOnIL5n66KWWO1AQWRigNy8CDxC0UyoITa0yO/c2qmdDXcQ== + dependencies: + "@babel/code-frame" "^7.12.11" + "@rollup/plugin-node-resolve" "^11.0.1" + "@types/command-line-args" "^5.0.0" + "@web/config-loader" "^0.1.3" + "@web/dev-server-core" "^0.3.1" + "@web/dev-server-rollup" "^0.3.0" + camelcase "^6.2.0" + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.1" + debounce "^1.2.0" + deepmerge "^4.2.2" + ip "^1.1.5" + open "^7.3.0" + portfinder "^1.0.28" + +"@web/parse5-utils@^1.0.0", "@web/parse5-utils@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@web/parse5-utils/-/parse5-utils-1.1.2.tgz#b53e7f62679170371da36023517b23bbb1f7c582" + integrity sha512-/JQHbK53BmYiFK2igr2B+Psl2Ivp2ju75Nx1InZweTbxLQNGG9yUBaudER85aqebIH6smkPkKwVtpdBXBiwy1A== + dependencies: + "@types/parse5" "^5.0.3" + parse5 "^6.0.1" + +"@web/polyfills-loader@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@web/polyfills-loader/-/polyfills-loader-1.0.1.tgz#cee51b6aa956a3c061c5018ce14424958b85946a" + integrity sha512-2c2UQpAYT2xSmo7mwf3RHsl9o7toB+dzVZbLEoDKCRhKX4T4jeiCSL828HrgHffckDI/PDIrsXtJ+SLvu4xGvg== + dependencies: + "@babel/core" "^7.11.1" + "@web/parse5-utils" "^1.1.2" + "@webcomponents/webcomponentsjs" "^2.5.0" + abortcontroller-polyfill "^1.4.0" + core-js-bundle "^3.6.0" + deepmerge "^4.2.2" + dynamic-import-polyfill "^0.1.1" + intersection-observer "^0.11.0" + parse5 "^6.0.0" + regenerator-runtime "^0.13.3" + resize-observer-polyfill "^1.5.1" + systemjs "^6.7.1" + terser "^5.3.8" + whatwg-fetch "^3.0.0" + +"@web/rollup-plugin-copy@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@web/rollup-plugin-copy/-/rollup-plugin-copy-0.2.0.tgz#425d32665fe06f39d81ae505ad0775c9354ba1ad" + integrity sha512-l3YInTLe/rbth6WuyoA7GY6DuXdt3iX6hQm6uoe5298fBzZfZPa3i0WVyUi3zPo6VttY0bjxPJyWK7JRQ37Cnw== + dependencies: + glob "^7.0.0" + +"@web/rollup-plugin-html@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@web/rollup-plugin-html/-/rollup-plugin-html-1.3.3.tgz#366f1a889a93ef6a26afd227611deb23c52cd232" + integrity sha512-SSgL72jIV0+N68wafDW7M40yry2RfJfcZsVOhTlir+U6RdEz0hdQPXkf/o9sHxIxo3w0sgL6tN+q7VlHMOWQGw== + dependencies: + "@web/parse5-utils" "^1.1.2" + glob "^7.1.6" + parse5 "^6.0.1" + +"@web/rollup-plugin-import-meta-assets@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@web/rollup-plugin-import-meta-assets/-/rollup-plugin-import-meta-assets-1.0.4.tgz#32d7c381a976c8d40b9c3db861bc2f8651af849c" + integrity sha512-Yu1U63aMZdWY6SSRNlukuNBMB5TdDq530Bs2cFQOJ+bwWnz1OHE0JyvPRvDmG48jf1XMsIOaormbIruaRsP+KA== + dependencies: + "@rollup/pluginutils" "^3.1.0" + estree-walker "^2.0.1" + magic-string "^0.25.7" + +"@web/rollup-plugin-polyfills-loader@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@web/rollup-plugin-polyfills-loader/-/rollup-plugin-polyfills-loader-1.0.3.tgz#26b162c20cf22100117c154793d6be232cbb979b" + integrity sha512-9DkZy0x5F+axj3gDx36x5mxvqg9ugVIS85hCZT2uDEBJ1VBVdSG0pzI5R5zHaLAq/Xk88D999S0zLVRE7DKuHw== + dependencies: + "@web/polyfills-loader" "^1.0.1" + +"@web/test-runner-chrome@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@web/test-runner-chrome/-/test-runner-chrome-0.8.0.tgz#da582736390267f75c51bfca34ebf36479492ac5" + integrity sha512-Ffg6HhxIX2IaWWKRj0qPZ+7//7CV0hnGeZs8aUKOZLP9PIdj1Lm3xJRHz/RgRHxjW1JU8kopxS0EZDz/1LxPhg== + dependencies: + "@types/puppeteer-core" "^2.0.0" + "@web/test-runner-core" "^0.9.0" + "@web/test-runner-coverage-v8" "^0.3.0" + chrome-launcher "^0.13.4" + puppeteer-core "^5.5.0" + +"@web/test-runner-commands@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@web/test-runner-commands/-/test-runner-commands-0.3.0.tgz#0cf40886b455e6c2588a2ea7799b1e5c9fcce71e" + integrity sha512-tjcJySl0ZjKSVsNPwcLJuNLCobazbbTnkxI0LbjjCZCmXuYlKVhMSrQTZOdpZ6SlSOwVUzOMJ7NIbQyzT4h4WA== + dependencies: + "@web/test-runner-core" "^0.9.0" + +"@web/test-runner-core@^0.9.0", "@web/test-runner-core@^0.9.3": + version "0.9.3" + resolved "https://registry.yarnpkg.com/@web/test-runner-core/-/test-runner-core-0.9.3.tgz#f4fa664ac392e08d7ceeeacba392a8398ff4fc8d" + integrity sha512-bmMGYe3x4z0T625C/BSexQ3Wa0a7s9po72S8lTKrKglGgYJcXw4bYWlTD/W4nt8Vhelb75o6a6D+GukHEH8t1A== + dependencies: + "@babel/code-frame" "^7.12.11" + "@web/browser-logs" "^0.1.6" + "@web/dev-server-core" "^0.3.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + co-body "^6.1.0" + debounce "^1.2.0" + dependency-graph "^0.9.0" + globby "^11.0.1" + ip "^1.1.5" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-reports "^3.0.2" + log-update "^4.0.0" + picomatch "^2.2.2" + uuid "^8.3.2" + +"@web/test-runner-coverage-v8@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@web/test-runner-coverage-v8/-/test-runner-coverage-v8-0.3.0.tgz#dcaeecb3a4179a6e19ea7bd746a29a7d8b5a458b" + integrity sha512-y7RCXj2zlqFVeE317MK0kSAezNRMsMYebghIROSi5T96WNBXWG8Ss51edVTd0hEIkbydABcSZYhMWf/s5fm5JQ== + dependencies: + "@web/test-runner-core" "^0.9.0" + istanbul-lib-coverage "^3.0.0" + v8-to-istanbul "^7.0.0" + +"@web/test-runner-mocha@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@web/test-runner-mocha/-/test-runner-mocha-0.6.0.tgz#82f85ac2d425707c797700e97c562d5ca3b7471d" + integrity sha512-KmUkcgu8PHHrinyIDhDy0xb4mnT79qFkwx0yn1Wn0d3Y4PaD5cTpmHwYprgQGiSGcKEJQzHR8+eaTsP6H0+MVw== + dependencies: + "@types/mocha" "^8.2.0" + "@web/test-runner-core" "^0.9.0" + +"@web/test-runner-playwright@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@web/test-runner-playwright/-/test-runner-playwright-0.7.0.tgz#4d9f9eb1ef0905dec3fc216e09ab06422ba4204d" + integrity sha512-dCUVzXJXxFEcGDGwqBhouUhwXFy5XM7+vPUCsMALWGNcMljwE7vNsanQqkDahOgs5B9kFXJ8Xt0kBb2cOskjig== + dependencies: + "@web/test-runner-core" "^0.9.0" + "@web/test-runner-coverage-v8" "^0.3.0" + playwright "^1.7.0" + +"@web/test-runner@^0.11.5": + version "0.11.5" + resolved "https://registry.yarnpkg.com/@web/test-runner/-/test-runner-0.11.5.tgz#641cc16860b0242e8f4bb8687e36071474d66537" + integrity sha512-oWP4e5e1m9RjmKRmqmERpg08WUS3O4TEAd7xREI1GC+1TTQpNE1GWZRJmIb0XZrwMcvLdz9y72FSkkyyrQ3t4Q== + dependencies: + "@web/browser-logs" "^0.1.2" + "@web/config-loader" "^0.1.3" + "@web/dev-server" "^0.1.2" + "@web/test-runner-chrome" "^0.8.0" + "@web/test-runner-commands" "^0.3.0" + "@web/test-runner-core" "^0.9.3" + "@web/test-runner-mocha" "^0.6.0" + camelcase "^6.2.0" + chalk "^4.1.0" + command-line-args "^5.1.1" + convert-source-map "^1.7.0" + deepmerge "^4.2.2" + diff "^5.0.0" + globby "^11.0.1" + portfinder "^1.0.28" + source-map "^0.7.3" + +"@webcomponents/webcomponentsjs@^2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.5.0.tgz#61b27785a6ad5bfd68fa018201fe418b118cb38d" + integrity sha512-C0l51MWQZ9kLzcxOZtniOMohpIFdCLZum7/TEHv3XWFc1Fvt5HCpbSX84x8ltka/JuNKcuiDnxXFkiB2gaePcg== + +a-sync-waterfall@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7" + integrity sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abortcontroller-polyfill@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.5.0.tgz#2c562f530869abbcf88d949a2b60d1d402e87a7c" + integrity sha512-O6Xk757Jb4o0LMzMOMdWvxpHWrQzruYBaUruFaIOfAQRnWFxfdXYobw12jrVHGtoXk6WiiyYzc0QWN9aL62HQA== + +accepts@^1.3.5, accepts@~1.3.4: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= + dependencies: + acorn "^4.0.4" + +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + +acorn@^4.0.4, acorn@~4.0.2: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-colors@4.1.1, ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= + +any-promise@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0, arg@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array-back@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.1.tgz#9b80312935a52062e1a233a9c7abeb5481b30e90" + integrity sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg== + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= + +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +asap@^2.0.3, asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-each-series@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI= + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +axe-core@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.1.tgz#70a7855888e287f7add66002211a423937063eaf" + integrity sha512-5Kgy8Cz6LPC9DJcNb3yjAXTu3XihQgEdnIg50c//zOC/MyLP0Clg+Y8Sh9ZjjnvBrDZU4DgXS9C3T9r4/scGZQ== + +axios@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" + integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= + dependencies: + callsite "1.0.0" + +better-path-resolve@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" + integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== + dependencies: + is-windows "^1.0.0" + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +bl@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" + integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +boxen@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +breakword@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/breakword/-/breakword-1.0.5.tgz#fd420a417f55016736b5b615161cae1c8f819810" + integrity sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg== + dependencies: + wcwidth "^1.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browser-sync-client@^2.26.13: + version "2.26.13" + resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.26.13.tgz#ee5fa3ec36fe2a03f9887553cac6846751c8232d" + integrity sha512-p2VbZoYrpuDhkreq+/Sv1MkToHklh7T1OaIntDwpG6Iy2q/XkBcgwPcWjX+WwRNiZjN8MEehxIjEUh12LweLmQ== + dependencies: + etag "1.8.1" + fresh "0.5.2" + mitt "^1.1.3" + rxjs "^5.5.6" + +browser-sync-ui@^2.26.13: + version "2.26.13" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.26.13.tgz#7a0622df2c1cc4fb0dd8edd511f90737f84239b4" + integrity sha512-6NJ/pCnhCnBMzaty1opWo7ipDmFAIk8U71JMQGKJxblCUaGfdsbF2shf6XNZSkXYia1yS0vwKu9LIOzpXqQZCA== + dependencies: + async-each-series "0.1.1" + connect-history-api-fallback "^1" + immutable "^3" + server-destroy "1.0.1" + socket.io-client "^2.0.4" + stream-throttle "^0.1.3" + +browser-sync@^2.26.13: + version "2.26.13" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.26.13.tgz#a74541c104aec7eda318a5d8abdb3317ae9eda3d" + integrity sha512-JPYLTngIzI+Dzx+StSSlMtF+Q9yjdh58HW6bMFqkFXuzQkJL8FCvp4lozlS6BbECZcsM2Gmlgp0uhEjvl18X4w== + dependencies: + browser-sync-client "^2.26.13" + browser-sync-ui "^2.26.13" + bs-recipes "1.3.4" + bs-snippet-injector "^2.0.1" + chokidar "^3.4.1" + connect "3.6.6" + connect-history-api-fallback "^1" + dev-ip "^1.0.1" + easy-extender "^2.3.4" + eazy-logger "3.1.0" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "3.0.1" + http-proxy "^1.18.1" + immutable "^3" + localtunnel "^2.0.0" + micromatch "^4.0.2" + opn "5.3.0" + portscanner "2.1.1" + qs "6.2.3" + raw-body "^2.3.2" + resp-modifier "6.0.2" + rx "4.1.0" + send "0.16.2" + serve-index "1.9.1" + serve-static "1.13.2" + server-destroy "1.0.1" + socket.io "2.1.1" + ua-parser-js "^0.7.18" + yargs "^15.4.1" + +browserslist@^4.14.5, browserslist@^4.15.0, browserslist@^4.16.0: + version "4.16.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.0.tgz#410277627500be3cb28a1bfe037586fbedf9488b" + integrity sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ== + dependencies: + caniuse-lite "^1.0.30001165" + colorette "^1.2.1" + electron-to-chromium "^1.3.621" + escalade "^3.1.1" + node-releases "^1.1.67" + +bs-recipes@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + integrity sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU= + +bs-snippet-injector@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5" + integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU= + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer@^5.2.1, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-lite@^1.0.30001165: + version "1.0.30001170" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz#0088bfecc6a14694969e391cc29d7eb6362ca6a7" + integrity sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA== + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai-a11y-axe@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/chai-a11y-axe/-/chai-a11y-axe-1.3.1.tgz#1889d2b639612ff4e9b9e40ff528442fd0191798" + integrity sha512-O+JJ+fELEvK/5SwFe9ltIk+qYz9p+zjnw/iUC1qNrlpgEPvTxScvyvQSU7eP73ixxHkCH1oNFAqkiM+MopbCEw== + dependencies: + axe-core "^4.0.2" + +chai-dom@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/chai-dom/-/chai-dom-1.8.2.tgz#e06353baeafa8fddaaabda96a67f859c111a3c7c" + integrity sha512-kk2SnCuJliouO5M58OjA7M8VXN338WAxHOm+LbpjeL09pJgRpXugSC5aj8uwFm/6Lmpcdtq7hf+DldTdBm5/Sw== + +chai@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +chalk@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + integrity sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8= + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-html4@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" + integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-parser@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" + integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= + dependencies: + is-regex "^1.0.3" + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@3.4.3, chokidar@^3.3.0, chokidar@^3.3.1, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-launcher@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.13.4.tgz#4c7d81333c98282899c4e38256da23e00ed32f73" + integrity sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A== + dependencies: + "@types/node" "*" + escape-string-regexp "^1.0.5" + is-wsl "^2.2.0" + lighthouse-logger "^1.0.0" + mkdirp "^0.5.3" + rimraf "^3.0.2" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +clean-css@^4.1.11: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +clipboard@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" + integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +co-body@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" + integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== + dependencies: + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +command-line-args@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a" + integrity sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg== + dependencies: + array-back "^3.0.1" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.1.tgz#c908e28686108917758a49f45efb4f02f76bc03f" + integrity sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA== + dependencies: + array-back "^4.0.1" + chalk "^2.4.2" + table-layout "^1.0.1" + typical "^5.2.0" + +commander@^2.19.0, commander@^2.2.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concurrently@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz#7500de6410d043c912b2da27de3202cb489b1e7b" + integrity sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ== + dependencies: + chalk "^2.4.2" + date-fns "^2.0.1" + lodash "^4.17.15" + read-pkg "^4.0.1" + rxjs "^6.5.2" + spawn-command "^0.0.2-1" + supports-color "^6.1.0" + tree-kill "^1.2.2" + yargs "^13.3.0" + +condense-newlines@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" + integrity sha1-PemFVTE5R10yUCyDsC9gaE0kxV8= + dependencies: + extend-shallow "^2.0.1" + is-whitespace "^0.3.0" + kind-of "^3.0.2" + +config-chain@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +connect-history-api-fallback@^1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@3.6.6: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + +constantinople@^3.0.1, constantinople@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" + integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw== + dependencies: + "@types/babel-types" "^7.0.0" + "@types/babylon" "^6.16.2" + babel-types "^6.26.0" + babylon "^6.18.0" + +content-disposition@~0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookies@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" + integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== + dependencies: + depd "~2.0.0" + keygrip "~1.1.0" + +copyfiles@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" + integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== + dependencies: + glob "^7.0.5" + minimatch "^3.0.3" + mkdirp "^1.0.4" + noms "0.0.0" + through2 "^2.0.1" + untildify "^4.0.0" + yargs "^16.1.0" + +core-js-bundle@^3.6.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/core-js-bundle/-/core-js-bundle-3.8.1.tgz#a4445eff5da56e316f68365ec89648be1027a808" + integrity sha512-bkulwU0ZPkG9aZ79JCRL5ltTSvxP9YsKfyZ6ZpGolJ8BEDGK3BFPPmQ2LlWSuhSshcIxIQzArCSXBYacyGf+aQ== + +core-js-compat@^3.8.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.1.tgz#8d1ddd341d660ba6194cbe0ce60f4c794c87a36e" + integrity sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ== + dependencies: + browserslist "^4.15.0" + semver "7.0.0" + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +csv-generate@^3.2.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.3.0.tgz#0e25658f1bb9806d94fec7b270896a35c7eedf1a" + integrity sha512-EXSru4QwEWKwM7wwsJbhrZC+mHEJrhQFoXlohHs80CAU8Qhlv9gaw1sjzNiC3Hr3oUx5skDmEiAlz+tnKWV0RA== + +csv-parse@^4.8.8: + version "4.14.2" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.14.2.tgz#c1329cff95a99b8773a92c4e62f8bff114b34726" + integrity sha512-YE2xlTKtM035/94llhgsp9qFQxGi47EkQJ1pZ+mLT/98GpIsbjkMGAb7Rmu9hNxVfYFOLf10hP+rPVqnoccLgw== + +csv-stringify@^5.3.6: + version "5.6.0" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.0.tgz#3dcde51da7561f5052220f1847bfd4db7618fcfa" + integrity sha512-E0LNLevBrwaJ1WKsl4HUPOmK96WyhizTfY79mJgfr2dsIb6zyJd3B9+lToO7gSkTaKi8CIo0Pd0vDGfa0whozg== + +csv@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/csv/-/csv-5.3.2.tgz#50b344e25dfbb8c62684a1bcec18c22468b2161e" + integrity sha512-odDyucr9OgJTdGM2wrMbJXbOkJx3nnUX3Pt8SFOwlAMOpsUQlz1dywvLMXJWX/4Ib0rjfOsaawuuwfI5ucqBGQ== + dependencies: + csv-generate "^3.2.4" + csv-parse "^4.8.8" + csv-stringify "^5.3.6" + stream-transform "^2.0.1" + +date-fns@^2.0.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b" + integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ== + +date-time@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-0.1.1.tgz#ed2f6d93d9790ce2fd66d5b5ff3edd5bbcbf3b07" + integrity sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc= + +debounce@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" + integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== + +debug@2.6.9, debug@^2.2.0, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + +debug@=3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +del@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +demo-wc-card@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/demo-wc-card/-/demo-wc-card-0.1.0.tgz#f53ad9bb956c784579697e5b676c844d0ddf59cb" + integrity sha512-iY9xeqiTzX2721txu2fUyCpJKZEgMftGCaYKdypvbZPhD9jvWSFjkY7rAIb87XQq6nBx8IykHKwQG4YhP2THeQ== + dependencies: + lit-element "^2.0.1" + +depd@^1.1.2, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dependency-graph@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.9.0.tgz#11aed7e203bc8b00f48356d92db27b265c445318" + integrity sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w== + +destroy@^1.0.4, destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-indent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + +dev-ip@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + integrity sha1-p2o+0YVb56ASu4rBbLgPPADcKPA= + +devtools-protocol@0.0.818844: + version "0.0.818844" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.818844.tgz#d1947278ec85b53e4c8ca598f607a28fa785ba9e" + integrity sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg== + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diff@4.0.2, diff@^4.0.1, diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +doctypes@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" + integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= + +dynamic-import-polyfill@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dynamic-import-polyfill/-/dynamic-import-polyfill-0.1.1.tgz#e1f9eb1876ee242bd56572f8ed4df768e143083f" + integrity sha512-m953zv0w5oDagTItWm6Auhmk/pY7EiejaqiVbnzSS3HIjh1FCUeK7WzuaVtWPNs58A+/xpIE+/dVk6pKsrua8g== + +easy-extender@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" + integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== + dependencies: + lodash "^4.17.10" + +eazy-logger@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.1.0.tgz#b169eb56df714608fa114f164c8a2956bec9f0f3" + integrity sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ== + dependencies: + tfunk "^4.0.0" + +editorconfig@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1, ejs@^2.7.4: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.621: + version "1.3.633" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.633.tgz#16dd5aec9de03894e8d14a1db4cda8a369b9b7fe" + integrity sha512-bsVCsONiVX1abkWdH7KtpuDAhsQ3N3bjPYhROSAXE78roJKet0Y5wznA14JE9pzbwSZmSMAW6KiKYf1RvbTJkA== + +emitter-mixin@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/emitter-mixin/-/emitter-mixin-0.0.3.tgz#5948cb286f2e48edc3b251a7cfc1f7883396d65c" + integrity sha1-WUjLKG8uSO3DslGnz8H3iDOW1lw= + +"emoji-regex@>=6.0.0 <=6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" + integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +encodeurl@^1.0.2, encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-client@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" + integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~3.3.1" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-client@~3.4.0: + version "3.4.4" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.4.tgz#77d8003f502b0782dd792b073a4d2cf7ca5ab967" + integrity sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ== + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io-parser@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.4" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2" + integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w== + dependencies: + accepts "~1.3.4" + base64id "1.0.0" + cookie "0.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~3.3.1" + +enquirer@^2.3.0, enquirer@^2.3.5, enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + +errno@^0.1.2: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-module-lexer@^0.3.26: + version "0.3.26" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.3.26.tgz#7b507044e97d5b03b01d4392c74ffeb9c177a83b" + integrity sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA== + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild@^0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.8.26.tgz#a85491617ebd2bd35ca4bf479239487eb6819d71" + integrity sha512-u3MMHOOumdWoAKF+073GHPpzvVB2cM+y9VD4ZwYs1FAQ6atRPISya35dbrbOu/mM68mQ42P+nwPzQVBTfQhkvQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz#5402eb559aa94b894effd6bddfa0b1ca051c858f" + integrity sha512-9sm5/PxaFG7qNJvJzTROMM1Bk1ozXVTKI0buKOyb0Bsr1hrwi0H/TzxF/COtf1uxikIK8SwhX7K6zg78jAzbeA== + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.16.0.tgz#a761605bf9a7b32d24bb7cde59aeb0fd76f06092" + integrity sha512-iVWPS785RuDA4dWuhhgXTNrGxHHK3a8HLSMBgbbU59ruJDubUraXN8N5rn7kb8tG6sjg74eE0RA3YWT51eusEw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.19" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extendable-error@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" + integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== + +external-editor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extract-zip@^2.0.0, extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1, fast-glob@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" + integrity sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA== + dependencies: + reusify "^1.0.4" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-versions@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" + integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== + dependencies: + semver-regex "^2.0.0" + +find-yarn-workspace-root2@1.2.16: + version "1.2.16" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" + integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== + dependencies: + micromatch "^4.0.2" + pkg-dir "^4.2.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== + dependencies: + is-buffer "~2.0.3" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" + integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +follow-redirects@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" + integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== + +fresh@0.5.2, fresh@^0.5.2, fresh@~0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-intrinsic@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" + integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + +github-markdown-css@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/github-markdown-css/-/github-markdown-css-4.0.0.tgz#be9f4caf7a389228d4c368336260ffc909061f35" + integrity sha512-mH0bcIKv4XAN0mQVokfTdKo2OD5K8WJE9+lbMdM32/q0Ie5tXgVN/2o+zvToRMxSTUuiTRcLg5hzkFfOyBYreg== + +github-slugger@^1.0.0, github-slugger@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.3.0.tgz#9bd0a95c5efdfc46005e82a906ef8e2a059124c9" + integrity sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q== + dependencies: + emoji-regex ">=6.0.0 <=6.1.1" + +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + 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" + +glob@7.1.6, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.3, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@^11.0.0, globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + 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" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= + dependencies: + delegate "^3.1.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +gray-matter@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.2.tgz#9aa379e3acaf421193fce7d2a28cebd4518ac454" + integrity sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw== + dependencies: + js-yaml "^3.11.0" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +hamljs@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/hamljs/-/hamljs-0.6.2.tgz#7b7116cf6dbe7278e42b3f6ef8725a33e177c8e3" + integrity sha1-e3EWz22+cnjkKz9u+HJaM+F3yOM= + +hanbi@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/hanbi/-/hanbi-0.4.1.tgz#6ac3a1ea662fc70b1d4b1c03e362497e94e70168" + integrity sha512-z5UYPq/+PfDDT7uZ/IrO4e5BhWcNnR73oP6CUaDUERbskABmBqrDzfePktI0BIPAV4xfyAhue8ZTmyCOh7rZ3g== + +handlebars@^4.7.6: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8= + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-has-property@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz#9f137565fad6082524b382c1e7d7d33ca5059f36" + integrity sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg== + +hast-util-heading-rank@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hast-util-heading-rank/-/hast-util-heading-rank-1.0.1.tgz#28dfd8b0724cfb0da48308e2a794b1d9f24fd80d" + integrity sha512-P6Hq7RCky9syMevlrN90QWpqWDXCxwIVOfQR2rK6P4GpY4bqjKEuCzoWSRORZ7vz+VgRpLnXimh+mkwvVFjbyQ== + +hast-util-is-element@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" + integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.2.tgz#0954c44e2e1c03dc5bb44c40ef5eee3185ebeabe" + integrity sha512-m7IlmqO8cytmG3EIMDMXUG8LjO2uyApWcxwL6apsGvikIClgykFg3UYps4rnt4kUpY3j8Mc7ANJ8zW6KPPLb+w== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-sanitize@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-3.0.2.tgz#b0b783220af528ba8fe6999f092d138908678520" + integrity sha512-+2I0x2ZCAyiZOO/sb4yNLFmdwPBnyJ4PBkVTUMKMqBwYNA+lXSgOmoRXlJFazoyid9QPogRRKgKhVEodv181sA== + dependencies: + xtend "^4.0.0" + +hast-util-to-html@^7.0.0, hast-util-to-html@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-7.1.2.tgz#db677f0ee483658cea0eecc9dec30aba42b67111" + integrity sha512-pu73bvORzdF6XZgwl9eID/0RjBb/jtRfoGRRSykpR1+o9rCdiAHpgkSukZsQBRlIqMg6ylAcd7F0F7myJUb09Q== + dependencies: + ccount "^1.0.0" + comma-separated-tokens "^1.0.0" + hast-util-is-element "^1.0.0" + hast-util-whitespace "^1.0.0" + html-void-elements "^1.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + stringify-entities "^3.0.1" + unist-util-is "^4.0.0" + xtend "^4.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-string@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz#9b24c114866bdb9478927d7e9c36a485ac728378" + integrity sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w== + +hast-util-whitespace@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" + integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== + +hastscript@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" + integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +http-assert@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878" + integrity sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw== + dependencies: + deep-equal "~1.0.1" + http-errors "~1.7.2" + +http-errors@1.7.3, http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@^1.6.3, http-errors@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" + integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== + dependencies: + agent-base "5" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-id@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" + integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +husky@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.6.tgz#ebd9dd8b9324aa851f1587318db4cccb7665a13c" + integrity sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag== + dependencies: + chalk "^4.0.0" + ci-info "^2.0.0" + compare-versions "^3.6.0" + cosmiconfig "^7.0.0" + find-versions "^3.2.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^4.2.0" + please-upgrade-node "^3.2.0" + slash "^3.0.0" + which-pm-runs "^1.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +immutable@^3: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +inflation@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" + integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +intersection-observer@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.11.0.tgz#f4ea067070326f68393ee161cc0a2ca4c0040c6f" + integrity sha512-KZArj2QVnmdud9zTpKf279m2bbGfG+4/kn16UU0NL3pTVl52ZHiJ9IRNSsnn6jaHrL9EGLFM5eWjTx2fz/+zoQ== + +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumeric@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" + integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ= + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0, is-buffer@^2.0.2, is-buffer@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-decimal@^1.0.0, is-decimal@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + +is-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" + integrity sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8= + dependencies: + acorn "~4.0.2" + object-assign "^4.0.1" + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b" + integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +is-negative-zero@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-like@^1.0.3: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== + dependencies: + lodash.isfinite "^3.3.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-promise@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-reference@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-regex@^1.0.3, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-subdir@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-subdir/-/is-subdir-1.1.1.tgz#423e66902f9c5f159b9cc4826c820df083059538" + integrity sha512-VYpq0S7gPBVkkmfwkvGnx1EL9UVIo87NQyNcgMiNUdQCws3CJm5wj2nB+XPL7zigvjxhuZgp3bl2yBcKkSIj1w== + dependencies: + better-path-resolve "1.0.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-whitespace@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" + integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38= + +is-windows@^1.0.0, is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" + integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +javascript-stringify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz#6ef358035310e35d667c675ed63d3eb7c1aa19e5" + integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow== + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jpeg-js@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.2.tgz#8b345b1ae4abde64c2da2fe67ea216a114ac279d" + integrity sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw== + +js-beautify@^1.6.12: + version "1.13.0" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.0.tgz#a056d5d3acfd4918549aae3ab039f9f3c51eebb2" + integrity sha512-/Tbp1OVzZjbwzwJQFIlYLm9eWQ+3aYbBXLSaqb1mEJzhcQAfrqMMQYtjb6io+U6KpD0ID4F+Id3/xcjH3l/sqA== + dependencies: + config-chain "^1.1.12" + editorconfig "^0.15.3" + glob "^7.1.3" + mkdirp "^1.0.4" + nopt "^5.0.0" + +js-stringify@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" + integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.11.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jstransformer@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" + integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= + dependencies: + is-promise "^2.0.0" + promise "^7.0.1" + +junk@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/junk/-/junk-1.0.3.tgz#87be63488649cbdca6f53ab39bec9ccd2347f592" + integrity sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI= + +just-extend@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.1.tgz#158f1fdb01f128c411dc8b286a7b4837b3545282" + integrity sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA== + +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" + integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + dependencies: + tsscmp "1.0.6" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +koa-compose@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" + integrity sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec= + dependencies: + any-promise "^1.1.0" + +koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== + +koa-convert@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" + integrity sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA= + dependencies: + co "^4.6.0" + koa-compose "^3.0.0" + +koa-etag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/koa-etag/-/koa-etag-4.0.0.tgz#2c2bb7ae69ca1ac6ced09ba28dcb78523c810414" + integrity sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg== + dependencies: + etag "^1.8.1" + +koa-send@^5.0.0, koa-send@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79" + integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ== + dependencies: + debug "^4.1.1" + http-errors "^1.7.3" + resolve-path "^1.4.0" + +koa-static@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" + integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ== + dependencies: + debug "^3.1.0" + koa-send "^5.0.0" + +koa@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.0.tgz#25217e05efd3358a7e5ddec00f0a380c9b71b501" + integrity sha512-i/XJVOfPw7npbMv67+bOeXr3gPqOAw6uh5wFyNs3QvJ47tUx3M3V9rIE0//WytY42MKz4l/MXKyGkQ2LQTfLUQ== + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.8.0" + debug "~3.1.0" + delegates "^1.0.0" + depd "^1.1.2" + destroy "^1.0.4" + encodeurl "^1.0.2" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^1.2.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lighthouse-logger@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz#b76d56935e9c137e86a04741f6bb9b2776e886ca" + integrity sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw== + dependencies: + debug "^2.6.8" + marky "^1.2.0" + +limiter@^1.0.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +linkify-it@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== + dependencies: + uc.micro "^1.0.1" + +lint-staged@^10.5.3: + version "10.5.3" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.3.tgz#c682838b3eadd4c864d1022da05daa0912fb1da5" + integrity sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg== + dependencies: + chalk "^4.1.0" + cli-truncate "^2.1.0" + commander "^6.2.0" + cosmiconfig "^7.0.0" + debug "^4.2.0" + dedent "^0.7.0" + enquirer "^2.3.6" + execa "^4.1.0" + listr2 "^3.2.2" + log-symbols "^4.0.0" + micromatch "^4.0.2" + normalize-path "^3.0.0" + please-upgrade-node "^3.2.0" + string-argv "0.3.1" + stringify-object "^3.3.0" + +liquidjs@^6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/liquidjs/-/liquidjs-6.4.3.tgz#c7caf7a3f6c87dc6a22a5a351328cf8f7298c243" + integrity sha512-m1xSB10Ncu22NR3X0xdaqu/GvP1xadDCFYGqGgd6me8DAWjyA68BKE5DHJmSxw1CGsWPsX+Hj2v/87J2w/LvMQ== + +listr2@^3.2.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.2.3.tgz#ef9e0d790862f038dde8a9837be552b1adfd1c07" + integrity sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w== + dependencies: + chalk "^4.1.0" + cli-truncate "^2.1.0" + figures "^3.2.0" + indent-string "^4.0.0" + log-update "^4.0.0" + p-map "^4.0.0" + rxjs "^6.6.3" + through "^2.3.8" + +lit-element@^2.0.1, lit-element@^2.2.1, lit-element@^2.4.0, lit-element@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-2.4.0.tgz#b22607a037a8fc08f5a80736dddf7f3f5d401452" + integrity sha512-pBGLglxyhq/Prk2H91nA0KByq/hx/wssJBQFiYqXhGDvEnY31PRGYf1RglVzyLeRysu0IHm2K0P196uLLWmwFg== + dependencies: + lit-html "^1.1.1" + +lit-html@^1.0.0, lit-html@^1.1.1, lit-html@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.3.0.tgz#c80f3cc5793a6dea6c07172be90a70ab20e56034" + integrity sha512-0Q1bwmaFH9O14vycPHw8C/IeHMk/uSDldVLIefu/kfbTBGIc44KGH6A8p1bDfxUfHdc8q6Ct7kQklWoHgr4t1Q== + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +load-yaml-file@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" + integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== + dependencies: + graceful-fs "^4.1.5" + js-yaml "^3.13.0" + pify "^4.0.1" + strip-bom "^3.0.0" + +localtunnel@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.0.tgz#2ea71174fa80e34cce91b2a7ce416e6a57d9ff7c" + integrity sha512-g6E0aLgYYDvQDxIjIXkgJo2+pHj3sGg4Wz/XP3h2KtZnRsWPbOQY+hw1H8Z91jep998fkcVE9l+kghO+97vllg== + dependencies: + axios "0.19.0" + debug "4.1.1" + openurl "1.1.1" + yargs "13.3.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.isfinite@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + integrity sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg= + +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +log-symbols@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@4.0.0, log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +longest-streak@^2.0.0, longest-streak@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +lru-cache@^4.0.1, lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +luxon@^1.24.1: + version "1.25.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.25.0.tgz#d86219e90bc0102c0eb299d65b2f5e95efe1fe72" + integrity sha512-hEgLurSH8kQRjY6i4YLey+mcKVAWXbDNlZRmM6AgWDJ1cY3atl8Ztf5wEY7VBReFbmGnwQPz7KYJblL8B2k0jQ== + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +markdown-it@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" + integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== + dependencies: + argparse "^1.0.7" + entities "~2.0.0" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +markdown-table@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + +marky@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.1.tgz#a3fcf82ffd357756b8b8affec9fdbf3a30dc1b02" + integrity sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ== + +maximatch@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/maximatch/-/maximatch-0.1.0.tgz#86cd8d6b04c9f307c05a6b9419906d0360fb13a2" + integrity sha1-hs2NawTJ8wfAWmuUGZBtA2D7E6I= + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +mdast-util-compact@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz#d531bb7667b5123abf20859be086c4d06c894593" + integrity sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg== + dependencies: + unist-util-visit "^1.1.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-from-markdown@^0.8.0: + version "0.8.4" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.4.tgz#2882100c1b9fc967d3f83806802f303666682d32" + integrity sha512-jj891B5pV2r63n2kBTFh8cRI2uR9LQHsXG1zSDqfhXkIlDzrTcIlbB5+5aaYEkl8vOPIOPLf8VT7Ere1wWTMdw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-hast@^10.0.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.1.1.tgz#4dce367abdc57311a87cf95da54a4d115b9d25da" + integrity sha512-+hvJrYiUgK2aY0Q1h1LaHQ4h0P7VVumWdAcUuG9k49lYglyU9GtTrA4O8hMh5gRnyT22wC15takM2qrrlpvNxQ== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-markdown@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.2.tgz#8fe6f42a2683c43c5609dfb40407c095409c85b4" + integrity sha512-iRczns6WMvu0hUw02LXsPDJshBIwtUPbvHBWo19IQeU0YqmzlA8Pd30U8V7uiI0VPkxzS7A/NXBXH6u+HS87Zg== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" + integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdurl@^1.0.0, mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +meow@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" + integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "^4.0.2" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromark@~2.11.0: + version "2.11.2" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.2.tgz#e8b6a05f54697d2d3d27fc89600c6bc40dd05f35" + integrity sha512-IXuP76p2uj8uMg4FQc1cRE7lPCLsfAXuEfdjtdO55VRiFO1asrCSQ5g43NmPqFtRwzEnEhafRVzn2jg0UiKArQ== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.1.18, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@^2.4.6: + version "2.4.7" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.7.tgz#962aed9be0ed19c91fd7dc2ece5d7f4e89a90d74" + integrity sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minisearch@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-3.0.2.tgz#fa470114ffc7c4bcc0786b2adb7010d4b773bc32" + integrity sha512-7rTrJEzovKNi5LSwiIr5aCfJNNo6Lk4O9HTVzjFTMdp+dSr6UisUnEqdwj4rBgNcAcaWW5ClpXnpgTurv8PGqA== + +mitt@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + +mixme@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.4.0.tgz#a1aee27f0d63cc905e1cc6ddc98abf94d414435e" + integrity sha512-B4Sm1CDC5+ov5AYxSkyeT5HLtiDgNOLKwFlq34wr8E2O3zRdTvQiLzo599Jt9cir6VJrSenOlgvdooVYCQJIYw== + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" + integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== + dependencies: + minimist "^1.2.5" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mocha@^6.2.2: + version "6.2.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.3.tgz#e648432181d8b99393410212664450a4c1e31912" + integrity sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" + minimatch "3.0.4" + mkdirp "0.5.4" + ms "2.1.1" + node-environment-flags "1.0.5" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + +mocha@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.2.1.tgz#f2fa68817ed0e53343d989df65ccd358bc3a4b39" + integrity sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.4.3" + debug "4.2.0" + diff "4.0.2" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "3.14.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.2" + nanoid "3.1.12" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "7.2.0" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.0.2" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "2.0.0" + +moo@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" + integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multimatch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" + integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + +mustache@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" + integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== + +nanoid@3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" + integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" + integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^6.0.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + +node-emoji@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" + integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + dependencies: + lodash.toarray "^4.4.0" + +node-environment-flags@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" + integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-releases@^1.1.67: + version "1.1.67" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" + integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== + +noms@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" + integrity sha1-2o69nzr51nYJGbJ9nNyAkqczKFk= + dependencies: + inherits "^2.0.1" + readable-stream "~1.0.31" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nunjucks@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/nunjucks/-/nunjucks-3.2.2.tgz#45f915fef0f89fbab38c489dc85025f64859f466" + integrity sha512-KUi85OoF2NMygwODAy28Lh9qHmq5hO3rBlbkYoC8v377h4l8Pt5qFjILl0LWpMbOrZ18CzfVVUvIHUIrtED3sA== + dependencies: + a-sync-waterfall "^1.0.0" + asap "^2.0.3" + commander "^5.1.0" + optionalDependencies: + chokidar "^3.3.0" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= + +object-inspect@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.assign@^4.1.0, object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" + integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +on-finished@^2.3.0, on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onchange@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/onchange/-/onchange-7.1.0.tgz#a6f0f7733e4d47014b4cd70aa1ad36c2b4cf3804" + integrity sha512-ZJcqsPiWUAUpvmnJri5TPBooqJOPmC0ttN65juhN15Q8xA+Nbg3BaxBHXQ45EistKKlKElb0edmbPWnKSBkvMg== + dependencies: + "@blakeembrey/deque" "^1.0.5" + "@blakeembrey/template" "^1.0.0" + arg "^4.1.3" + chokidar "^3.3.1" + cross-spawn "^7.0.1" + ignore "^5.1.4" + tree-kill "^1.2.2" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +only@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= + +open@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" + integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opencollective-postinstall@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c= + +opn@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== + dependencies: + is-wsl "^1.1.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + 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" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +outdent@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" + integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== + +p-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^1.0.2, parse-entities@^1.1.0, parse-entities@^1.1.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-filepath@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-ms@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-0.1.2.tgz#dd3fa25ed6c2efc7bdde12ad9b46c163aa29224e" + integrity sha1-3T+iXtbC78e93hKtm0bBY6opIk4= + +parse5@^6.0.0, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + +parseurl@^1.3.2, parseurl@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@1.0.1, path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +playwright@^1.7.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.7.1.tgz#841638811bc39eb2fed792ffaacbcc959a0aaf5e" + integrity sha512-dOSWME42wDedJ/PXv8k0zG0Kxd6d6R2OKA51/05++Z2ISdA4N58gHlWqlVKPDkBog1MI6lu/KNt7QDn19AybWQ== + dependencies: + debug "^4.1.1" + extract-zip "^2.0.1" + https-proxy-agent "^5.0.0" + jpeg-js "^0.4.2" + mime "^2.4.6" + pngjs "^5.0.0" + progress "^2.0.3" + proper-lockfile "^4.1.1" + proxy-from-env "^1.1.0" + rimraf "^3.0.2" + ws "^7.3.1" + +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + +popper.js@^1.15.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +portscanner@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" + integrity sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y= + dependencies: + async "1.5.2" + is-number-like "^1.0.3" + +preferred-pm@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.2.tgz#bbdbef1014e34a7490349bf70d6d244b8d57a5e1" + integrity sha512-yGIxyBkK/OWOppgCXfOeOXOeNrddyK1DzqS6XpOokRZb2ogXTpHRhKDTO7d0pjF/2p2sV9pEkKL4e0tNZI1y2A== + dependencies: + find-up "^5.0.0" + find-yarn-workspace-root2 "1.2.16" + path-exists "^4.0.0" + which-pm "2.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-plugin-package@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-package/-/prettier-plugin-package-1.3.0.tgz#b42d12eda16b67c9fcf95054d799fe3f542aef54" + integrity sha512-KPNHR/Jm2zTevBp1SnjzMnooO1BOQW2bixVbOp8flOJoW+dxdDwEncObfsKZdkjwrv6AIH4oWqm5EO/etDmK9Q== + +prettier@^1.18.2, prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +prettier@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.5.0.tgz#0cecda50a74a941589498011cf23275aa82b339e" + integrity sha512-p+T744ZyjjiaFlMUZZv6YPC5JrkNj8maRmPaQCWFJFplUAzpIUTRaTcS+7wmZtUoFXHtESJb23ISliaWyz3SHA== + +pretty-ms@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-0.2.2.tgz#da879a682ff33a37011046f13d627f67c73b84f6" + integrity sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY= + dependencies: + parse-ms "^0.1.0" + +pretty@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" + integrity sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU= + dependencies: + condense-newlines "^0.2.1" + extend-shallow "^2.0.1" + js-beautify "^1.6.12" + +prismjs@~1.17.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be" + integrity sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q== + optionalDependencies: + clipboard "^2.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0, progress@^2.0.1, progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise@^7.0.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +proper-lockfile@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.1.tgz#284cf9db9e30a90e647afad69deb7cb06881262c" + integrity sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg== + dependencies: + graceful-fs "^4.1.11" + retry "^0.12.0" + signal-exit "^3.0.2" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +pug-attrs@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336" + integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ== + dependencies: + constantinople "^3.0.1" + js-stringify "^1.0.1" + pug-runtime "^2.0.5" + +pug-code-gen@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.2.tgz#ad0967162aea077dcf787838d94ed14acb0217c2" + integrity sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw== + dependencies: + constantinople "^3.1.2" + doctypes "^1.1.0" + js-stringify "^1.0.1" + pug-attrs "^2.0.4" + pug-error "^1.3.3" + pug-runtime "^2.0.5" + void-elements "^2.0.1" + with "^5.0.0" + +pug-error@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6" + integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ== + +pug-filters@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz#ab2cc82db9eeccf578bda89130e252a0db026aa7" + integrity sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg== + dependencies: + clean-css "^4.1.11" + constantinople "^3.0.1" + jstransformer "1.0.0" + pug-error "^1.3.3" + pug-walk "^1.1.8" + resolve "^1.1.6" + uglify-js "^2.6.1" + +pug-lexer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz#531cde48c7c0b1fcbbc2b85485c8665e31489cfd" + integrity sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA== + dependencies: + character-parser "^2.1.1" + is-expression "^3.0.0" + pug-error "^1.3.3" + +pug-linker@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz#f5bf218b0efd65ce6670f7afc51658d0f82989fb" + integrity sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg== + dependencies: + pug-error "^1.3.3" + pug-walk "^1.1.8" + +pug-load@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz#d38c85eb85f6e2f704dea14dcca94144d35d3e7b" + integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg== + dependencies: + object-assign "^4.1.0" + pug-walk "^1.1.8" + +pug-parser@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz#03e7ada48b6840bd3822f867d7d90f842d0ffdc9" + integrity sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA== + dependencies: + pug-error "^1.3.3" + token-stream "0.0.1" + +pug-runtime@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a" + integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw== + +pug-strip-comments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8" + integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw== + dependencies: + pug-error "^1.3.3" + +pug-walk@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a" + integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA== + +pug@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz#ee7682ec0a60494b38d48a88f05f3b0ac931377d" + integrity sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw== + dependencies: + pug-code-gen "^2.0.2" + pug-filters "^3.1.1" + pug-lexer "^4.1.0" + pug-linker "^3.0.6" + pug-load "^2.0.12" + pug-parser "^5.0.1" + pug-runtime "^2.0.5" + pug-strip-comments "^1.0.4" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +puppeteer-core@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-5.5.0.tgz#dfb6266efe5a933cbf1a368d27025a6fd4f5a884" + integrity sha512-tlA+1n+ziW/Db03hVV+bAecDKse8ihFRXYiEypBe9IlLRvOCzYFG6qrCMBYK34HO/Q/Ecjc+tvkHRAfLVH+NgQ== + dependencies: + debug "^4.1.0" + devtools-protocol "0.0.818844" + extract-zip "^2.0.0" + https-proxy-agent "^4.0.0" + node-fetch "^2.6.1" + pkg-dir "^4.2.0" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^3.0.2" + tar-fs "^2.0.0" + unbzip2-stream "^1.3.3" + ws "^7.2.3" + +puppeteer@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-5.5.0.tgz#331a7edd212ca06b4a556156435f58cbae08af00" + integrity sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg== + dependencies: + debug "^4.1.0" + devtools-protocol "0.0.818844" + extract-zip "^2.0.0" + https-proxy-agent "^4.0.0" + node-fetch "^2.6.1" + pkg-dir "^4.2.0" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^3.0.2" + tar-fs "^2.0.0" + unbzip2-stream "^1.3.3" + ws "^7.2.3" + +qs@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4= + +qs@^6.5.2: + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@^2.3.2, raw-body@^2.3.3: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" + integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= + dependencies: + normalize-package-data "^2.3.2" + parse-json "^4.0.0" + pify "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +read-yaml-file@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" + integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== + dependencies: + graceful-fs "^4.1.5" + js-yaml "^3.6.1" + pify "^4.0.1" + strip-bom "^3.0.0" + +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +recursive-copy@^2.0.10: + version "2.0.11" + resolved "https://registry.yarnpkg.com/recursive-copy/-/recursive-copy-2.0.11.tgz#7ed3c0f4b6bb0ffda7cab62bf865a82f5a391c39" + integrity sha512-DqL2kO10mUne7XK5BPcwRtOJJZKhddD7IrW4UmHmKrwdV3HLPWcw6Jr4Jh12ooddfJOVz7ynFoFYYnPM7De0Og== + dependencies: + del "^2.2.0" + emitter-mixin "0.0.3" + errno "^0.1.2" + graceful-fs "^4.1.4" + junk "^1.0.1" + maximatch "^0.1.0" + mkdirp "^0.5.1" + pify "^2.3.0" + promise "^7.0.1" + slash "^1.0.0" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + +refractor@^2.6.2: + version "2.10.1" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.10.1.tgz#166c32f114ed16fd96190ad21d5193d3afc7d34e" + integrity sha512-Xh9o7hQiQlDbxo5/XkOX6H+x/q8rmlmZKr97Ie1Q8ZM32IRRd3B/UxuA/yXDW79DBSXGWxm2yRTbcTVmAciJRw== + dependencies: + hastscript "^5.0.0" + parse-entities "^1.1.2" + prismjs "~1.17.0" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +rehype-autolink-headings@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/rehype-autolink-headings/-/rehype-autolink-headings-5.0.1.tgz#7482bd8ffdae522a1295d8df598028ff89f9111d" + integrity sha512-B6dmUVhtGdXLxJr3qynjRR10+f/iPJbSOtW5YyWieMvcwAm1XW5/yIYaW/9Qqr/Sd5h/Jym3dDCLJ4y6rPluWg== + dependencies: + extend "^3.0.0" + hast-util-has-property "^1.0.0" + hast-util-heading-rank "^1.0.0" + unist-util-visit "^2.0.0" + +rehype-prism-template@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/rehype-prism-template/-/rehype-prism-template-0.4.1.tgz#14696e28adb18e17d4cc2f397b1410ee334b36b7" + integrity sha512-A/3ZJ2Lj4q9DjKDwJaVNJdr1Sqkjlh4z52tHM/a0eBrSst9h3QbTG/cSb+umY16IcbsvJOtTap3kZlFVyQ2JUg== + dependencies: + hast-util-to-string "^1.0.0" + refractor "^2.6.2" + underscore "^1.9.1" + unist-util-visit "^1.1.3" + +rehype-raw@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-5.0.0.tgz#3688e3e1132e958761e677a1b9b2ba358a465af8" + integrity sha512-q/MOBj4fs1WF/LSCh5uOtNhnm5OESuDcSvq1mDQP4/2t6Q52E9MHeVoLeMy9vOn93BEcgVBm4FCokcK2iXRDvA== + dependencies: + hast-util-raw "^6.0.0" + +rehype-slug@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rehype-slug/-/rehype-slug-4.0.1.tgz#313274501cffa997bd52dd57bf2da5851959747a" + integrity sha512-KIlJALf9WfHFF21icwTd2yI2IP+RQRweaxH9ChVGQwRYy36+hiomG4ZSe0yQRyCt+D/vE39LbAcOI/h4O4GPhA== + dependencies: + github-slugger "^1.1.1" + hast-util-has-property "^1.0.0" + hast-util-heading-rank "^1.0.0" + hast-util-to-string "^1.0.0" + unist-util-visit "^2.0.0" + +rehype-stringify@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-8.0.0.tgz#9b6afb599bcf3165f10f93fc8548f9a03d2ec2ba" + integrity sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g== + dependencies: + hast-util-to-html "^7.1.1" + +remark-autolink-headings@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/remark-autolink-headings/-/remark-autolink-headings-6.0.1.tgz#074470b8ec7714a0f06fa151e293152bf9723df9" + integrity sha512-LTV5G5NMjypHEr14tMNJ36yrP+xwT7mejJelZOPXKiF5WvRH9o36zXnr2QGqfms2yVASNpDaC9NBOwKlJJKuQw== + dependencies: + extend "^3.0.0" + unist-util-visit "^2.0.0" + +remark-emoji@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.1.0.tgz#69165d1181b98a54ad5d9ef811003d53d7ebc7db" + integrity sha512-lDddGsxXURV01WS9WAiS9rO/cedO1pvr9tahtLhr6qCGFhHG4yZSJW3Ha4Nw9Uk1hLNmUBtPC0+m45Ms+xEitg== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.2" + +remark-html@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/remark-html/-/remark-html-13.0.1.tgz#d5b2d8be01203e61fc37403167ca7584879ad675" + integrity sha512-K5KQCXWVz+harnyC+UVM/J9eJWCgjYRqFeZoZf2NgP0iFbuuw/RgMZv3MA34b/OEpGnstl3oiOUtZzD3tJ+CBw== + dependencies: + hast-util-sanitize "^3.0.0" + hast-util-to-html "^7.0.0" + mdast-util-to-hast "^10.0.0" + +remark-parse@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-7.0.2.tgz#41e7170d9c1d96c3d32cf1109600a9ed50dba7cf" + integrity sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA== + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +remark-rehype@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.0.0.tgz#5a8afc8262a59d205fba21dafb27a673fb3b92fa" + integrity sha512-gVvOH02TMFqXOWoL6iXU7NXMsDJguNkNuMrzfkQeA4V6WCyHQnOKptn+IQBVVPuIH2sMJBwo8hlrmtn1MLTh9w== + dependencies: + mdast-util-to-hast "^10.0.0" + +remark-slug@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.0.0.tgz#2b54a14a7b50407a5e462ac2f376022cce263e2c" + integrity sha512-ln67v5BrGKHpETnm6z6adlJPhESFJwfuZZ3jrmi+lKTzeZxh2tzFzUfDD4Pm2hRGOarHLuGToO86MNMZ/hA67Q== + dependencies: + github-slugger "^1.0.0" + mdast-util-to-string "^1.0.0" + unist-util-visit "^2.0.0" + +remark-stringify@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-7.0.4.tgz#3de1e3f93853288d3407da1cd44f2212321dd548" + integrity sha512-qck+8NeA1D0utk1ttKcWAoHRrJxERYQzkHDyn+pF5Z4whX1ug98uCNPPSeFgLSaNERRxnD6oxIug6DzZQth6Pg== + dependencies: + ccount "^1.0.0" + is-alphanumeric "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + longest-streak "^2.0.1" + markdown-escapes "^1.0.0" + markdown-table "^1.1.0" + mdast-util-compact "^1.0.0" + parse-entities "^1.0.2" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + stringify-entities "^2.0.0" + unherit "^1.0.4" + xtend "^4.0.1" + +remark-stringify@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" + integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== + dependencies: + mdast-util-to-markdown "^0.6.0" + +remark@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/remark/-/remark-11.0.2.tgz#12b90ea100ac3362b1976fa87a6e4e0ab5968202" + integrity sha512-bh+eJgn8wgmbHmIBOuwJFdTVRVpl3fcVP6HxmpPWO0ULGP9Qkh6INJh0N5Uy7GqlV7DQYGoqaKiEIpM5LLvJ8w== + dependencies: + remark-parse "^7.0.0" + remark-stringify "^7.0.0" + unified "^8.2.0" + +repeat-string@^1.0.0, repeat-string@^1.5.2, repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +resp-modifier@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08= + dependencies: + debug "^2.2.0" + minimatch "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= + dependencies: + align-text "^0.1.1" + +rimraf@^2.2.8: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-terser@^7.0.0, rollup-plugin-terser@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +rollup-plugin-workbox@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-workbox/-/rollup-plugin-workbox-6.1.0.tgz#120cde36547769fc8cc45eae97a338c4017ed936" + integrity sha512-BqeEBj53fiqNLjiiyVvuBlic3Apg2Us1mpTkn3zgqaipJoAOC3soi+W9vrOQcm190lHLo9WNvi1wQg/M7olJHg== + dependencies: + "@rollup/plugin-node-resolve" "^11.0.1" + "@rollup/plugin-replace" "^2.3.4" + pretty-bytes "^5.4.1" + rollup-plugin-terser "^7.0.2" + workbox-build "^6.0.2" + +rollup@^2.25.0, rollup@^2.35.1: + version "2.35.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.35.1.tgz#e6bc8d10893556a638066f89e8c97f422d03968c" + integrity sha512-q5KxEyWpprAIcainhVy6HfRttD9kutQpHbeqDTWnqAFNJotiojetK6uqmcydNMymBEtC4I8bCYR+J3mTMqeaUA== + optionalDependencies: + fsevents "~2.1.2" + +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + +rx@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= + +rxjs@^5.5.6: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +rxjs@^6.5.2, rxjs@^6.6.3: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax-wasm@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sax-wasm/-/sax-wasm-2.0.0.tgz#be6d2d53bb1785fcb3e2f29624554cc7a4bea566" + integrity sha512-u2LwHmhmF0r8PlwRk4QPWRwAtdR4tH8NCYP1gsNRPOn1x137tf+DIoGfvBebL0BDYHP19exDmVGYoWBkv1mInw== + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serve-index@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +server-destroy@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +singleton-manager@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/singleton-manager/-/singleton-manager-1.2.0.tgz#5f80f89bda3a49b926ce6f721c14abdd8bff067a" + integrity sha512-CJvFjCjO6rhAB+N10CJ3nlb6EbuoZv+TEA5y+91oGRHk0egtQJMTbDEUQBg6gw7ksrTgjMhg4RRngE1Km6diAQ== + +sinon-chai@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.5.0.tgz#c9a78304b0e15befe57ef68e8a85a00553f5c60e" + integrity sha512-IifbusYiQBpUxxFJkR3wTU68xzBN0+bxCScEaKMjBvAQERg6FnTTc1F17rseLb1tjmkJ23730AXpFI0c47FgAg== + +sinon@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.2.tgz#b83cf5d43838f99cfa3644453f4c7db23e7bd535" + integrity sha512-9Owi+RisvCZpB0bdOVFfL314I6I4YoRlz6Isi4+fr8q8YQsDPoCe5UnmNtKHRThX3negz2bXHWIuiPa42vM8EQ== + dependencies: + "@sinonjs/commons" "^1.8.1" + "@sinonjs/fake-timers" "^6.0.1" + "@sinonjs/formatio" "^5.0.1" + "@sinonjs/samsam" "^5.3.0" + diff "^4.0.2" + nise "^4.0.4" + supports-color "^7.1.0" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slugify@^1.4.0: + version "1.4.6" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.6.tgz#ef288d920a47fb01c2be56b3487b6722f5e34ace" + integrity sha512-ZdJIgv9gdrYwhXqxsH9pv7nXxjUEyQ6nqhngRxoAAOlmMGA28FDq5O4/5US4G2/Nod7d1ovNcgURQJ7kHq50KQ== + +smartwrap@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-1.2.5.tgz#45ee3e09ac234e5f7f17c16e916f511834f3cd23" + integrity sha512-bzWRwHwu0RnWjwU7dFy7tF68pDAx/zMSu3g7xr9Nx5J0iSImYInglwEVExyHLxXljy6PWMjkSAbwF7t2mPnRmg== + dependencies: + breakword "^1.0.5" + grapheme-splitter "^1.0.4" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + yargs "^15.1.0" + +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-client@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" + integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~3.1.0" + engine.io-client "~3.2.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.2.0" + to-array "0.1.4" + +socket.io-client@^2.0.4: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.1.tgz#91a4038ef4d03c19967bb3c646fec6e0eaa78cff" + integrity sha512-YXmXn3pA8abPOY//JtYxou95Ihvzmg8U6kQyolArkIyLd0pgVhrfor/iMsox8cn07WCOOvvuJ6XKegzIucPutQ== + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "~1.3.0" + debug "~3.1.0" + engine.io-client "~3.4.0" + has-binary2 "~1.0.2" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" + integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.1.tgz#f07d9c8cb3fb92633aa93e76d98fd3a334623199" + integrity sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +socket.io@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" + integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== + dependencies: + debug "~3.1.0" + engine.io "~3.2.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.1.1" + socket.io-parser "~3.2.0" + +source-map-support@^0.5.17, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + +spawndamnit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" + integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== + dependencies: + cross-spawn "^5.1.0" + signal-exit "^3.0.2" + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stream-throttle@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + integrity sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM= + dependencies: + commander "^2.2.0" + limiter "^1.0.5" + +stream-transform@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.0.4.tgz#911ff7556d1e25c237e95d783f6739d9e0b4a61c" + integrity sha512-LQXH1pUksoef5Ijo6+2ihnjLLZtZuoqu1vhut6a7xZ77nrLA/shbbx2FAzVC/nkb6wwrPzOO98700mv4HDQcWg== + dependencies: + mixme "^0.4.0" + +string-argv@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.padend@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz#824c84265dbac46cade2b957b38b6a5d8d1683c5" + integrity sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string.prototype.trimend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-2.0.0.tgz#fa7ca6614b355fb6c28448140a20c4ede7462827" + integrity sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A== + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.2" + is-hexadecimal "^1.0.0" + +stringify-entities@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" + integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + xtend "^4.0.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE= + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@7.2.0, supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= + +systemjs@^6.7.1: + version "6.8.2" + resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-6.8.2.tgz#6200ce215ee5eb8d6c2815b9470c52015cb3c867" + integrity sha512-YknH4S+Xq7Rlwdnvyj4QKHWm5YQGPJnnkVXFQLC/Wl/O21nZ+NrV9IjwUQQ0Pl0Jh0Wgf91IeGzSHGELsv5kkA== + +table-layout@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.1.tgz#8411181ee951278ad0638aea2f779a9ce42894f9" + integrity sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + +table@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d" + integrity sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw== + dependencies: + ajv "^6.12.4" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa" + integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +term-size@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== + +terser@^5.0.0, terser@^5.3.8: + version "5.5.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" + integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +tfunk@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-4.0.0.tgz#de9399feaf2060901d590b7faad80fcd5443077e" + integrity sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ== + dependencies: + chalk "^1.1.3" + dlv "^1.1.3" + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +time-require@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/time-require/-/time-require-0.1.2.tgz#f9e12cb370fc2605e11404582ba54ef5ca2b2d98" + integrity sha1-+eEss3D8JgXhFARYK6VO9corLZg= + dependencies: + chalk "^0.4.0" + date-time "^0.1.1" + pretty-ms "^0.2.1" + text-table "^0.2.0" + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +token-stream@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" + integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo= + +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tty-table@^2.8.10: + version "2.8.13" + resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-2.8.13.tgz#d484a416381973eaebbdf19c79136b390e5c6d70" + integrity sha512-eVV/+kB6fIIdx+iUImhXrO22gl7f6VmmYh0Zbu6C196fe1elcHXd7U6LcLXu0YoVPc2kNesWiukYcdK8ZmJ6aQ== + dependencies: + chalk "^3.0.0" + csv "^5.3.1" + smartwrap "^1.2.3" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + yargs "^15.1.0" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@^1.6.16: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" + integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== + +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.0.0, typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + +ua-parser-js@^0.7.18: + version "0.7.23" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.23.tgz#704d67f951e13195fbcd3d78818577f5bc1d547b" + integrity sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA== + +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +uglify-js@^2.6.1: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@^3.1.4: + version "3.12.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.3.tgz#bb26c4abe0e68c55e9776bca9bed99a4df73facf" + integrity sha512-feZzR+kIcSVuLi3s/0x0b2Tx4Iokwqt+8PJM7yRHKuldg4MLdam4TCFeICv+lgDtuYiCtdmrtIP+uN9LWvDasw== + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +unbzip2-stream@^1.3.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +underscore@^1.9.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.0.tgz#4814940551fc80587cef7840d1ebb0f16453be97" + integrity sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +unified@^8.2.0, unified@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz#13ad58b4a437faa2751a4a4c6a16f680c500fff1" + integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + +unist-util-is@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50" + integrity sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" + integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A== + dependencies: + unist-util-visit "^1.1.0" + +unist-util-remove@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.0.1.tgz#fa13c424ff8e964f3aa20d1098b9a690c6bfaa39" + integrity sha512-YtuetK6o16CMfG+0u4nndsWpujgsHDHHLyE0yGpJLLn5xSjKeyGyzEBOI2XbmoUHCYabmNgX52uxlWoQhcvR7Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@^1.1.0, unist-util-visit@^1.1.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" + +unist-util-visit@^2.0.0, unist-util-visit@^2.0.2, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + +v8-to-istanbul@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz#5b95cef45c0f83217ec79f8fc7ee1c8b486aee07" + integrity sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +valid-url@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vfile-location@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" + integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== + +vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +void-elements@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-fetch@^3.0.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" + integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== + +whatwg-url@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" + integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + +which-pm@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" + integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== + dependencies: + load-yaml-file "^0.2.0" + path-exists "^4.0.0" + +which@1.3.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + +with@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" + integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4= + dependencies: + acorn "^3.1.0" + acorn-globals "^3.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wordwrapjs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.0.tgz#9aa9394155993476e831ba8e59fb5795ebde6800" + integrity sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.0.0" + +workbox-background-sync@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.0.2.tgz#9205f5ef7fbf68203b925bdc85bdaa31a34fbbe6" + integrity sha512-KQU2ntvbvFoBvCRm+EDpWAaykt4u/oaF5j3C6io0dZVWhFc/ZwgYDii8fb34LTenug3VPWQELdw9dNBCoP4b0w== + dependencies: + workbox-core "^6.0.2" + +workbox-broadcast-update@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.0.2.tgz#fc034277e631e4193dcee9f6b0a77e415b4ddefb" + integrity sha512-yCXYEln7nU8FkMDysYQPirpgFXtsdBtxruHbvZzRsxMHvAELf3j/o6Ufae1zjl8XanLF696sqSNxehpCGSD6tw== + dependencies: + workbox-core "^6.0.2" + +workbox-build@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.0.2.tgz#a23eebd6556cf473fedda77c08421b2d093efc32" + integrity sha512-Dukbt+p62Yzb12SXAmycTYvHngJ8aRtXy3hymsC8B6gxTCZmCZ0u5JuKhu7lNLbDwDkYE78lhFvT9SF+MXFz5A== + dependencies: + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@hapi/joi" "^16.1.8" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^9.0.0" + "@rollup/plugin-replace" "^2.3.3" + "@surma/rollup-plugin-off-main-thread" "^1.4.1" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.25.0" + rollup-plugin-terser "^7.0.0" + source-map "^0.7.3" + source-map-url "^0.4.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "^6.0.2" + workbox-broadcast-update "^6.0.2" + workbox-cacheable-response "^6.0.2" + workbox-core "^6.0.2" + workbox-expiration "^6.0.2" + workbox-google-analytics "^6.0.2" + workbox-navigation-preload "^6.0.2" + workbox-precaching "^6.0.2" + workbox-range-requests "^6.0.2" + workbox-recipes "^6.0.2" + workbox-routing "^6.0.2" + workbox-strategies "^6.0.2" + workbox-streams "^6.0.2" + workbox-sw "^6.0.2" + workbox-window "^6.0.2" + +workbox-cacheable-response@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.0.2.tgz#00b1133c4c846a2874f32ae14206c0636bacfd87" + integrity sha512-OrgFiYWkmFXDIbNRYSu+fchcfoZqyJ4yZbdc8WKUjr9v/MghKHfR9u7UI077xBkjno5J3YNpbwx73/no3HkrzA== + dependencies: + workbox-core "^6.0.2" + +workbox-core@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.0.2.tgz#2f865cfe633890b4210fd6d6fdb049a6daed0914" + integrity sha512-Ksl6qeikGb+BOCILoCUJGxwlEQOeeqdpOnpOr9UDt3NtacPYbfYBmpYpKArw5DFWK+5geBsFqgUUlXThlCYfKQ== + +workbox-expiration@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.0.2.tgz#ac01e8d17f48daa31dc0872c09ee6f4d2cf28ccb" + integrity sha512-6+nbR18cklAdI3BPT675ytftXPwnVbXGR8mPWNWTJtl5y2urRYv56ZOJLD7FBFVkZ8EjWiRhNP/A0fkxgdKtWQ== + dependencies: + workbox-core "^6.0.2" + +workbox-google-analytics@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.0.2.tgz#7e3641adb30a3acb25006b244035631cf6f65019" + integrity sha512-xmYJurR1M6Pzc2SBM/E7AgwmBszhu/YYDzBnU+HJPZFLbTG97ASIJyTXV1vcczA/dNaS0miIf0cFqneozVlDRw== + dependencies: + workbox-background-sync "^6.0.2" + workbox-core "^6.0.2" + workbox-routing "^6.0.2" + workbox-strategies "^6.0.2" + +workbox-navigation-preload@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.0.2.tgz#bfd9c61096be921b830153a3004b7212220748dc" + integrity sha512-7+ojLrjXmTFZBfGmUQIcBWB+xrFgXLMJGNQAtxT7Ta9A23rEWo8jqAgeuwAylebcORUlM+ztgYTV7eGp+AD+Yg== + dependencies: + workbox-core "^6.0.2" + +workbox-precaching@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.0.2.tgz#cb45f290b0604bef1d9fc96bf42df82385d54e54" + integrity sha512-sqKWL2emzmGnfJpna+9RjUkUiqQO++AKfwljCbgkHg8wBbVLy/rnui3eelKgAI7D8R31LJFfiZkY/kXmwkjtlQ== + dependencies: + workbox-core "^6.0.2" + workbox-routing "^6.0.2" + workbox-strategies "^6.0.2" + +workbox-range-requests@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.0.2.tgz#3b50cbe8ddaaed7e3bfaa2dfdcd6a22e02fe7770" + integrity sha512-qCrDbH9AzDbCErde71Nys2iNZO9I9M9Jgl/9/Q67dGQVwFsEq73SuIzS2DGIBKqtIdC5QUigC3d7XJONajclUQ== + dependencies: + workbox-core "^6.0.2" + +workbox-recipes@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.0.2.tgz#ad4b3f26a71a7396004c4f617af318f3fd072208" + integrity sha512-ewZIHO4jYE6bnEeUIYS6joQy3l+MydpOsVr2F6EpE8ps++z1ScbSdLtJU+yu6WuO3lH44HFZLeFxYQqYm50QAA== + dependencies: + workbox-cacheable-response "^6.0.2" + workbox-core "^6.0.2" + workbox-expiration "^6.0.2" + workbox-precaching "^6.0.2" + workbox-routing "^6.0.2" + workbox-strategies "^6.0.2" + +workbox-routing@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.0.2.tgz#8380bc322a2b1c44978df8ff6ae4e4d723f4e3f8" + integrity sha512-iQ9ch3fL1YpztDLfHNURaHQ0ispgPCdzWmZZhtSHUyy/+YkTlIiDVTbOQCIpHIrWlKQiim6X3K2ItIy1FW9+wA== + dependencies: + workbox-core "^6.0.2" + +workbox-strategies@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.0.2.tgz#f4383e2e5d46c1546e6e08048c9f5c9a7beb5137" + integrity sha512-HjLnYCVS60U7OKhl5NIq8NAQXrotJQRDakmIONnRlQIlP2If/kAiQSUP3QCHMq4EeXGiF+/CdlR1/bhYBHZzZg== + dependencies: + workbox-core "^6.0.2" + +workbox-streams@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.0.2.tgz#07c19025af309ad3475e737018a05ed538bffacd" + integrity sha512-bckftu/iMlg5LFXPZ6NX/FUc/w4illgxSuwtsZkQAO6Uen1EeegjfLyenO01/dwoyc3D/AlZepMdhv87XhE7HQ== + dependencies: + workbox-core "^6.0.2" + workbox-routing "^6.0.2" + +workbox-sw@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.0.2.tgz#cd1b8b02ceaaf1abe5804936158a87ec605d271e" + integrity sha512-EoOjbyy5bpoBoSqt2PIeDOZ/JJ41f+WJjb979PkfIUWw4F+F/w2uKJJrMA5fk+nWnVge83Fwy8nF3dWNsqOrdg== + +workbox-window@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.0.2.tgz#9b47fdb7c088aa4e8b7d0c6cfda17c8bfca6bf7f" + integrity sha512-I/X+qUh1AwN9x/MxFbXsPn7DA27BMtzkXo55w1tBD8V54fv8nUCeC5E4RpXt/mlgdSwBztnURCQTWsdhTrSUjg== + dependencies: + workbox-core "^6.0.2" + +workerpool@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.2.tgz#e241b43d8d033f1beb52c7851069456039d1d438" + integrity sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^7.2.3, ws@^7.3.1, ws@^7.4.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.1.tgz#a333be02696bd0e54cea0434e21dcc8a9ac294bb" + integrity sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ== + +ws@~3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +ws@~6.1.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== + dependencies: + async-limiter "~1.0.0" + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@13.1.2, yargs-parser@^13.1.1, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2, yargs-parser@^18.1.3: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yargs@13.3.2, yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.1.0, yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.1.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +ylru@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" + integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==