diff --git a/packages/site-demo/package.json b/packages/site-demo/package.json index eff98536a..705eaa81d 100644 --- a/packages/site-demo/package.json +++ b/packages/site-demo/package.json @@ -28,6 +28,7 @@ "@mdx-js/react": "^1.6.19", "@reach/router": "^1.2.1", "classnames": "^2.3.2", + "codesandbox-import-utils": "^2.2.3", "focus-visible": "^5.2.0", "gatsby": "^2.24.87", "gatsby-image": "^2.4.21", diff --git a/packages/site-demo/plugins/lumx-mdx-preprocessor/generate-codesandbox.js b/packages/site-demo/plugins/lumx-mdx-preprocessor/generate-codesandbox.js new file mode 100644 index 000000000..d26334e98 --- /dev/null +++ b/packages/site-demo/plugins/lumx-mdx-preprocessor/generate-codesandbox.js @@ -0,0 +1,104 @@ +const fs = require('fs'); +const path = require('path'); +const memoize = require('lodash/memoize'); +const { ROOT_PATH } = require('../../../../configs/path'); +const { getParameters } = require('codesandbox-import-utils/lib/api/define'); + +const REACT_VERSION = '18.2.0'; + +/** Base config for the LumX CodeSandbox */ +const BASE_SANDBOX_CONFIG = { + // Bootstrap app with LumX core and ReactDOM.createRoot + 'index.tsx': { + content: `import "@lumx/core/lumx.css"; +import ReactDOM from "react-dom/client"; +import { App } from "./App"; + +ReactDOM.createRoot(document.getElementById("root")).render();`, + }, + 'package.json': { + content: JSON.stringify({ + main: 'index.tsx', + dependencies: { + '@lumx/core': 'latest', + '@lumx/icons': 'latest', + '@lumx/react': 'latest', + react: REACT_VERSION, + 'react-dom': REACT_VERSION, + }, + devDependencies: { + '@types/react': REACT_VERSION, + '@types/react-dom': REACT_VERSION, + typescript: '4.4.2', + }, + }), + }, +}; + +// Extra demo components we do not ship in @lumx +const DEMO_COMPONENTS = { + '@lumx/demo/components/content/Placeholder': { + source: 'packages/site-demo/src/components/content/Placeholder/index.tsx', + fileName: 'Placeholder.tsx', + }, +}; + +/** Prepare files to load in the sandbox based on the demo code */ +function prepareFiles(pageImports, demoCode) { + const config = { ...BASE_SANDBOX_CONFIG }; + let content = demoCode; + + // JSX without imports or components + if (content.trim().startsWith('<')) { + // Wrap JSX code into a component + const component = `export const App = () => ( + <> + ${content.replaceAll('\n', '\n ')} + +);`; + + // Add page imports and then the component + content = `${pageImports}\n\n${component}`; + } + + // Replace path to demo components + for (let [originalPath, { source, fileName }] of Object.entries(DEMO_COMPONENTS)) { + if (content.includes(originalPath)) { + // Replace path (without extension) + content = content.replaceAll(originalPath, `./${fileName.replace('\..+$')}`); + // Put demo component file in the sandbox + const demoFileContent = fs.readFileSync(path.resolve(ROOT_PATH, source)).toString(); + config[fileName] = { content: demoFileContent }; + } + } + + // Add demo code in the sandbox + config['App.tsx'] = { content }; + + return config; +} + +/** List import code lines from the MDX page */ +const getPageImports = memoize((mdxString) => { + // Make sure to always have React + const lines = new Set(["import React from 'react';"]); + for (const line of mdxString.trim().split('\n')) { + let lineTrimmed = line.trim(); + if (!lineTrimmed || !lineTrimmed.startsWith('import')) break; + lines.add(lineTrimmed); + } + return Array.from(lines.values()).join('\n'); +}); + +/** + * Try to generate a CodeSandbox URL for the given demo code + */ +module.exports = function generateCodesandboxURL(mdxString, demoCode) { + // Get JS import from the page + const pageImports = getPageImports(mdxString); + // Generate sandbox files + const files = prepareFiles(pageImports, demoCode); + // Generate CodeSandbox URL parameters + const parameters = getParameters({ files }); + return `https://codesandbox.io/api/v1/sandboxes/define?parameters=${parameters}`; +}; diff --git a/packages/site-demo/plugins/lumx-mdx-preprocessor/mdx-demo-block.js b/packages/site-demo/plugins/lumx-mdx-preprocessor/mdx-demo-block.js index 4f564e8d9..69b6dd175 100644 --- a/packages/site-demo/plugins/lumx-mdx-preprocessor/mdx-demo-block.js +++ b/packages/site-demo/plugins/lumx-mdx-preprocessor/mdx-demo-block.js @@ -5,6 +5,7 @@ const fs = require('fs'); const CONTENT_DIR = path.resolve('./content'); const rewriteJSXComponents = require('../utils/rewriteJSXComponents'); const debug = require('../utils/debug'); +const generateCodesandboxURL = require('./generate-codesandbox') /** Read source code to string (or return null if source code not found). */ async function readSourceCode(sourcePath) { @@ -25,11 +26,13 @@ const removeIndent = (code) => { } /** Update props to import source code. */ -async function updateDemoBlock(resourceFolder, addImport, props) { +async function updateDemoBlock(resourceFolder, addImport, mdxString, props) { if (props.children) { // with children already have a demo inside them. // We copy the demo as string into the `codeString` prop. - props.codeString = JSON.stringify(removeIndent(props.children)); + let code = removeIndent(props.children); + props.codeString = JSON.stringify(code); + props.codesandboxURL = JSON.stringify(generateCodesandboxURL(mdxString, code)) return props; } @@ -48,6 +51,7 @@ async function updateDemoBlock(resourceFolder, addImport, props) { return props; } props.codeString = JSON.stringify(code.trim()); + props.codesandboxURL = JSON.stringify(generateCodesandboxURL(mdxString, code.trim())) // Import demo (will be added at the top). let relativePath = path.relative(CONTENT_DIR, sourcePath); @@ -73,7 +77,7 @@ module.exports = async (filePath, mdxString) => { mdxString = await rewriteJSXComponents( 'DemoBlock', mdxString, - partial(updateDemoBlock, resourceFolder, addImport) + partial(updateDemoBlock, resourceFolder, addImport, mdxString) ); if (imports.length) { diff --git a/packages/site-demo/src/components/content/CodeBlock/CodeBlock.scss b/packages/site-demo/src/components/content/CodeBlock/CodeBlock.scss index 871af14c0..4ea7b5fa2 100644 --- a/packages/site-demo/src/components/content/CodeBlock/CodeBlock.scss +++ b/packages/site-demo/src/components/content/CodeBlock/CodeBlock.scss @@ -6,8 +6,9 @@ ========================================================================== */ .code-block { + position: relative; display: block; - padding: $lumx-spacing-unit * 2; + padding: $lumx-spacing-unit-big; overflow-x: auto; font-size: 14px; color: #333; @@ -34,4 +35,10 @@ font-weight: inherit; background: none; } + + & &__edit-on-codesandbox { + position: absolute; + top: $lumx-spacing-unit-big; + right: $lumx-spacing-unit-big; + } } diff --git a/packages/site-demo/src/components/content/CodeBlock/CodeBlock.tsx b/packages/site-demo/src/components/content/CodeBlock/CodeBlock.tsx index 956571441..bedf71cf1 100644 --- a/packages/site-demo/src/components/content/CodeBlock/CodeBlock.tsx +++ b/packages/site-demo/src/components/content/CodeBlock/CodeBlock.tsx @@ -2,6 +2,8 @@ import classNames from 'classnames'; import isString from 'lodash/isString'; import Highlight, { defaultProps, Language } from 'prism-react-renderer'; import React from 'react'; +import { IconButton } from '@lumx/react'; +import { mdiSquareEditOutline } from '@lumx/icons'; import { theme } from './init-prism'; import { renderJSXLinesWithCollapsedImports } from './renderJSXLinesWithCollapsedImports'; import { renderLines } from './renderLines'; @@ -15,10 +17,18 @@ interface Props { codeString?: string; /** Code language (tsx, jsx, etc.) */ language?: Language | 'tsx'; + /** URL to the CodeSandbox. */ + codesandboxURL?: string; } /** Display syntax highlighted code */ -export const CodeBlock: React.FC = ({ className, codeString, language: propLanguage, children }) => { +export const CodeBlock: React.FC = ({ + className, + codeString, + language: propLanguage, + children, + codesandboxURL, +}) => { const language = propLanguage || className?.match(/language-(\w+)/)?.[1]; if (!language) { return
{children || codeString}
; @@ -29,6 +39,16 @@ export const CodeBlock: React.FC = ({ className, codeString, language: pr {({ className: prismClassName, ...renderParams }) => (
+                    {codesandboxURL && (
+                        
+                    )}
                     {language === 'jsx' || language === 'tsx'
                         ? renderJSXLinesWithCollapsedImports(renderParams)
                         : renderLines(renderParams)}
diff --git a/packages/site-demo/src/components/content/DemoBlock/DemoBlock.tsx b/packages/site-demo/src/components/content/DemoBlock/DemoBlock.tsx
index c33e3f1d8..3738ae7a1 100644
--- a/packages/site-demo/src/components/content/DemoBlock/DemoBlock.tsx
+++ b/packages/site-demo/src/components/content/DemoBlock/DemoBlock.tsx
@@ -23,6 +23,7 @@ import './DemoBlock.scss';
 interface DemoBlockProps extends FlexBoxProps {
     demo?: string;
     codeString?: string;
+    codesandboxURL?: string;
     withThemeSwitcher?: boolean;
     hasPlayButton?: boolean;
     backgroundColor?: { color: ColorPalette; variant: ColorVariant };
@@ -37,6 +38,7 @@ export const DemoBlock: React.FC = ({
     children,
     demo,
     codeString,
+    codesandboxURL,
     withThemeSwitcher = false,
     hasPlayButton = false,
     backgroundColor: propBackgroundColor,
@@ -103,6 +105,7 @@ export const DemoBlock: React.FC = ({
             
         
diff --git a/yarn.lock b/yarn.lock
index 9cb651108..902cbc19d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -9483,7 +9483,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"agent-base@npm:4, agent-base@npm:^4.3.0":
+"agent-base@npm:4, agent-base@npm:^4.1.0, agent-base@npm:^4.3.0":
   version: 4.3.0
   resolution: "agent-base@npm:4.3.0"
   dependencies:
@@ -9517,7 +9517,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"agentkeepalive@npm:^3.4.1":
+"agentkeepalive@npm:^3.3.0, agentkeepalive@npm:^3.4.1":
   version: 3.5.2
   resolution: "agentkeepalive@npm:3.5.2"
   dependencies:
@@ -10430,6 +10430,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"axios@npm:^0.18.1":
+  version: 0.18.1
+  resolution: "axios@npm:0.18.1"
+  dependencies:
+    follow-redirects: 1.5.10
+    is-buffer: ^2.0.2
+  checksum: 4a27cea1e3c674d89d9097fe13b62081b692280401b9c4216f37c42dfa8b433091baa15832336523ddad1df2f3f21e1e38a4cff207b4926ead3076c91a8ec5fe
+  languageName: node
+  linkType: hard
+
 "axios@npm:^0.19.0":
   version: 0.19.2
   resolution: "axios@npm:0.19.2"
@@ -11026,6 +11036,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"bl@npm:^1.0.0":
+  version: 1.2.3
+  resolution: "bl@npm:1.2.3"
+  dependencies:
+    readable-stream: ^2.3.5
+    safe-buffer: ^5.1.1
+  checksum: 123f097989ce2fa9087ce761cd41176aaaec864e28f7dfe5c7dab8ae16d66d9844f849c3ad688eb357e3c5e4f49b573e3c0780bb8bc937206735a3b6f8569a5f
+  languageName: node
+  linkType: hard
+
 "bl@npm:^4.0.0":
   version: 4.0.3
   resolution: "bl@npm:4.0.3"
@@ -11055,7 +11075,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"bluebird@npm:^3.0.5, bluebird@npm:^3.7.2":
+"bluebird@npm:^3.0.5, bluebird@npm:^3.5.0, bluebird@npm:^3.7.2":
   version: 3.7.2
   resolution: "bluebird@npm:3.7.2"
   checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef
@@ -11475,6 +11495,23 @@ __metadata:
   languageName: node
   linkType: hard
 
+"buffer-alloc-unsafe@npm:^1.1.0":
+  version: 1.1.0
+  resolution: "buffer-alloc-unsafe@npm:1.1.0"
+  checksum: c5e18bf51f67754ec843c9af3d4c005051aac5008a3992938dda1344e5cfec77c4b02b4ca303644d1e9a6e281765155ce6356d85c6f5ccc5cd21afc868def396
+  languageName: node
+  linkType: hard
+
+"buffer-alloc@npm:^1.2.0":
+  version: 1.2.0
+  resolution: "buffer-alloc@npm:1.2.0"
+  dependencies:
+    buffer-alloc-unsafe: ^1.1.0
+    buffer-fill: ^1.0.0
+  checksum: 560cd27f3cbe73c614867da373407d4506309c62fe18de45a1ce191f3785ec6ca2488d802ff82065798542422980ca25f903db078c57822218182c37c3576df5
+  languageName: node
+  linkType: hard
+
 "buffer-crc32@npm:~0.2.3":
   version: 0.2.13
   resolution: "buffer-crc32@npm:0.2.13"
@@ -11482,6 +11519,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"buffer-fill@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "buffer-fill@npm:1.0.0"
+  checksum: c29b4723ddeab01e74b5d3b982a0c6828f2ded49cef049ddca3dac661c874ecdbcecb5dd8380cf0f4adbeb8cff90a7de724126750a1f1e5ebd4eb6c59a1315b1
+  languageName: node
+  linkType: hard
+
 "buffer-from@npm:^1.0.0":
   version: 1.1.1
   resolution: "buffer-from@npm:1.1.1"
@@ -11621,6 +11665,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cacache@npm:^10.0.0":
+  version: 10.0.4
+  resolution: "cacache@npm:10.0.4"
+  dependencies:
+    bluebird: ^3.5.1
+    chownr: ^1.0.1
+    glob: ^7.1.2
+    graceful-fs: ^4.1.11
+    lru-cache: ^4.1.1
+    mississippi: ^2.0.0
+    mkdirp: ^0.5.1
+    move-concurrently: ^1.0.1
+    promise-inflight: ^1.0.1
+    rimraf: ^2.6.2
+    ssri: ^5.2.4
+    unique-filename: ^1.1.0
+    y18n: ^4.0.0
+  checksum: 787207714c7624f1569448db576fb7f595e5612b6c0a4d2eaa951d1bab70c01746e2d77942a7cbecd938222ce6cc55ef758c228aa9022741864aed8e097e487c
+  languageName: node
+  linkType: hard
+
 "cacache@npm:^12.0.0, cacache@npm:^12.0.2, cacache@npm:^12.0.3":
   version: 12.0.3
   resolution: "cacache@npm:12.0.3"
@@ -11722,6 +11787,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cacache@npm:^9.2.9":
+  version: 9.3.0
+  resolution: "cacache@npm:9.3.0"
+  dependencies:
+    bluebird: ^3.5.0
+    chownr: ^1.0.1
+    glob: ^7.1.2
+    graceful-fs: ^4.1.11
+    lru-cache: ^4.1.1
+    mississippi: ^1.3.0
+    mkdirp: ^0.5.1
+    move-concurrently: ^1.0.1
+    promise-inflight: ^1.0.1
+    rimraf: ^2.6.1
+    ssri: ^4.1.6
+    unique-filename: ^1.1.0
+    y18n: ^3.2.1
+  checksum: 0abfdb3a3a832cb1eca2a00eea24b0f9ca35a771c1d22aa3716f6484d5d72a635575b967099bd4bd46ed807172207c76b8f598098f68a217179c05d513b1aee7
+  languageName: node
+  linkType: hard
+
 "cache-base@npm:^1.0.1":
   version: 1.0.1
   resolution: "cache-base@npm:1.0.1"
@@ -12354,6 +12440,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"chownr@npm:^1.0.1":
+  version: 1.1.4
+  resolution: "chownr@npm:1.1.4"
+  checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d
+  languageName: node
+  linkType: hard
+
 "chownr@npm:^1.1.1, chownr@npm:^1.1.2":
   version: 1.1.3
   resolution: "chownr@npm:1.1.3"
@@ -12535,6 +12628,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cli-spinners@npm:^1.0.1":
+  version: 1.3.1
+  resolution: "cli-spinners@npm:1.3.1"
+  checksum: 4f95fd69a2cc886a79edea7c60173a66d21f5732f1cbdc3dfb6c02422769699b358190827a3886a51503a7a4daed84ae295db5df68bba9702a50df7aca51da55
+  languageName: node
+  linkType: hard
+
 "cli-spinners@npm:^2.5.0":
   version: 2.9.0
   resolution: "cli-spinners@npm:2.9.0"
@@ -12760,6 +12860,55 @@ __metadata:
   languageName: node
   linkType: hard
 
+"codesandbox-import-util-types@npm:^2.2.3, codesandbox-import-util-types@npm:^2.3.0":
+  version: 2.3.0
+  resolution: "codesandbox-import-util-types@npm:2.3.0"
+  checksum: e527fe1a0bc2de5a0a9842a70d42ad4c6de56a99a4a9e1427a81f4006ab91d85ff098e2e919cccbcd8703f9b3216b9c1f4ce5a40261051d8d1511287fbbf7d77
+  languageName: node
+  linkType: hard
+
+"codesandbox-import-utils@npm:^2.2.3":
+  version: 2.3.0
+  resolution: "codesandbox-import-utils@npm:2.3.0"
+  dependencies:
+    codesandbox-import-util-types: ^2.3.0
+    istextorbinary: ^2.2.1
+    lz-string: ^1.4.4
+  checksum: 977edf0d95706bf02e0b850679efb84ab04fa2d92d05faf183626fa996e2ff0c9f1350d69b0a8cf11c519f3edf15266f1109402810d0e6219b08a0b0589b072d
+  languageName: node
+  linkType: hard
+
+"codesandbox@npm:^2.2.3":
+  version: 2.2.3
+  resolution: "codesandbox@npm:2.2.3"
+  dependencies:
+    axios: ^0.18.1
+    chalk: ^2.4.1
+    codesandbox-import-util-types: ^2.2.3
+    codesandbox-import-utils: ^2.2.3
+    commander: ^2.9.0
+    datauri: ^3.0.0
+    filesize: ^3.6.1
+    fs-extra: ^3.0.1
+    git-branch: ^1.0.0
+    git-repo-name: ^0.6.0
+    git-username: ^0.5.0
+    humps: ^2.0.1
+    inquirer: ^6.2.2
+    lodash: ^4.17.5
+    lz-string: ^1.4.4
+    ms: ^2.0.0
+    open: ^6.3.0
+    ora: ^1.3.0
+    pacote: ^2.7.36
+    shortid: ^2.2.8
+    update-notifier: ^2.2.0
+  bin:
+    codesandbox: lib/index.js
+  checksum: 7ca68a6c449b1dca006c728663681511c8ee45a9a984b61eaa5981db4cab2f3ad6f7ed6a53d43f94188ecf9264263473256bcdba9f52e80e36a2c6a28fca5a1f
+  languageName: node
+  linkType: hard
+
 "collapse-white-space@npm:^1.0.0, collapse-white-space@npm:^1.0.2":
   version: 1.0.5
   resolution: "collapse-white-space@npm:1.0.5"
@@ -12948,7 +13097,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.20.3, commander@npm:~2.20.3":
+"commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.20.3, commander@npm:^2.9.0, commander@npm:~2.20.3":
   version: 2.20.3
   resolution: "commander@npm:2.20.3"
   checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e
@@ -14196,6 +14345,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cwd@npm:^0.9.1":
+  version: 0.9.1
+  resolution: "cwd@npm:0.9.1"
+  dependencies:
+    find-pkg: ^0.1.0
+  checksum: ef8659afbe04daa6704fe217214565db0b279cf6a1399077a275c60a009d950eb638c0d3ee580c9fba8cd3d5f50d23eeb41dba0f9aa733eebba3da0ecc0ba5d3
+  languageName: node
+  linkType: hard
+
 "cyclist@npm:^1.0.1":
   version: 1.0.1
   resolution: "cyclist@npm:1.0.1"
@@ -14270,6 +14428,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"datauri@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "datauri@npm:3.0.0"
+  dependencies:
+    image-size: 0.8.3
+    mimer: 1.1.0
+  checksum: a18cc9c4c0f31399749f5ad0a89c6fabb6e956754fb7ac2569f1b8e493f42841aafdb95046b82f2f1e7aadba2536b478b708c7632e32ca00de3678eca63c13c9
+  languageName: node
+  linkType: hard
+
 "date-fns@npm:^2.14.0":
   version: 2.16.1
   resolution: "date-fns@npm:2.16.1"
@@ -16997,6 +17165,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"expand-tilde@npm:^1.2.2":
+  version: 1.2.2
+  resolution: "expand-tilde@npm:1.2.2"
+  dependencies:
+    os-homedir: ^1.0.1
+  checksum: 18051cd104977bc06e2bb1347db9959b90504437beea0de6fd287a3c8c58b41e2330337bd189cfca2ee4be6bda9bf045f8c07daf23e622f85eb6ee1c420619a0
+  languageName: node
+  linkType: hard
+
 "expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2":
   version: 2.0.2
   resolution: "expand-tilde@npm:2.0.2"
@@ -17474,6 +17651,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"file-name@npm:^0.1.0":
+  version: 0.1.0
+  resolution: "file-name@npm:0.1.0"
+  checksum: 301e4928debcb963dfa60a1334ed1ead5eea007eb581bfa6fb102626ce2ea3661b94d86821035f471f90e956984c919a1ff2b5c1fdd6f7cdf9576e65124b27e2
+  languageName: node
+  linkType: hard
+
 "file-system-cache@npm:^2.0.0":
   version: 2.3.0
   resolution: "file-system-cache@npm:2.3.0"
@@ -17525,6 +17709,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"filesize@npm:^3.6.1":
+  version: 3.6.1
+  resolution: "filesize@npm:3.6.1"
+  checksum: 9ba47e9df90cd6bb6c0434418123facf9dafbe92c850f29ed50bfa42d60d00f8501a8a9b962f77ec7d1ba30190d5dbda5f6f56c5e56bce9e09729988bf0613c4
+  languageName: node
+  linkType: hard
+
 "fill-range@npm:^4.0.0":
   version: 4.0.0
   resolution: "fill-range@npm:4.0.0"
@@ -17627,6 +17818,25 @@ __metadata:
   languageName: node
   linkType: hard
 
+"find-file-up@npm:^0.1.2":
+  version: 0.1.3
+  resolution: "find-file-up@npm:0.1.3"
+  dependencies:
+    fs-exists-sync: ^0.1.0
+    resolve-dir: ^0.1.0
+  checksum: 95475fee7b727266ec65312527c580eb4f01884592620296cf7859e72cce7f4f6a667c964ad6feeec53fb72a7c3991805532ed7a53d8224e9a1ccd88479cabce
+  languageName: node
+  linkType: hard
+
+"find-pkg@npm:^0.1.0":
+  version: 0.1.2
+  resolution: "find-pkg@npm:0.1.2"
+  dependencies:
+    find-file-up: ^0.1.2
+  checksum: cd797bfa7dd419849559312cdd3aec767c39939e552daa92e53ff6b61108f331eb2c800d20a5973631eb894ea36c13dded01a868b10f457a685e0ae87a1746e1
+  languageName: node
+  linkType: hard
+
 "find-up@npm:^1.0.0":
   version: 1.1.2
   resolution: "find-up@npm:1.1.2"
@@ -17949,6 +18159,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fs-exists-sync@npm:^0.1.0":
+  version: 0.1.0
+  resolution: "fs-exists-sync@npm:0.1.0"
+  checksum: 850a0d6e4c03a7bd2fd25043f77cd9d6be9c3b48bb99308bcfe9c94f3f92f65f2cd3fa036e13a1b0ba7a46d2e58792f53e578f01d75fbdcd56baeb9eed63b705
+  languageName: node
+  linkType: hard
+
 "fs-extra@npm:11.1.1, fs-extra@npm:^11.1.0, fs-extra@npm:~11.1.0":
   version: 11.1.1
   resolution: "fs-extra@npm:11.1.1"
@@ -17983,6 +18200,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fs-extra@npm:^3.0.1":
+  version: 3.0.1
+  resolution: "fs-extra@npm:3.0.1"
+  dependencies:
+    graceful-fs: ^4.1.2
+    jsonfile: ^3.0.0
+    universalify: ^0.1.0
+  checksum: 8957f9ee33a032b12f786158077dbd2a6b3b843449b36ce37bb3922200bbf12f0412aaebe10e3ce3e46e1f0dd37904e4053b4cfa2a717c80eca3af6dc840ba8b
+  languageName: node
+  linkType: hard
+
 "fs-extra@npm:^8.1.0":
   version: 8.1.0
   resolution: "fs-extra@npm:8.1.0"
@@ -18850,6 +19078,13 @@ fsevents@~2.1.2:
   languageName: unknown
   linkType: soft
 
+"genfun@npm:^4.0.1":
+  version: 4.0.1
+  resolution: "genfun@npm:4.0.1"
+  checksum: ce344265de394090f50122c48231db4cfed7b5d3f716d2bb6f6805185dfc92d2227f9b08c4a18eef90824abd23e54c21a57bbc8c6f604c173aaf9c6ef3da8ead
+  languageName: node
+  linkType: hard
+
 "genfun@npm:^5.0.0":
   version: 5.0.0
   resolution: "genfun@npm:5.0.0"
@@ -19065,6 +19300,24 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"git-branch@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "git-branch@npm:1.0.0"
+  checksum: dd3d458d78da0999f915df6474924dcc753c031799495fd6c6a4e4e48b1ce2cf22734bedcff1964d8a2765e6cea53761b2ec1fbb6e4580cb8ebe5d095afc84d4
+  languageName: node
+  linkType: hard
+
+"git-config-path@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "git-config-path@npm:1.0.1"
+  dependencies:
+    extend-shallow: ^2.0.1
+    fs-exists-sync: ^0.1.0
+    homedir-polyfill: ^1.0.0
+  checksum: 13fda02984fa60122cd8ce3f61c63ca427aa41c35a88fe1ba91c508f9245da726d48eaa6a0158acd308b0271759b19dd922d6e8c0b069dc882bf8edc41aecaea
+  languageName: node
+  linkType: hard
+
 "git-raw-commits@npm:2.0.0":
   version: 2.0.0
   resolution: "git-raw-commits@npm:2.0.0"
@@ -19090,6 +19343,18 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"git-repo-name@npm:^0.6.0":
+  version: 0.6.0
+  resolution: "git-repo-name@npm:0.6.0"
+  dependencies:
+    cwd: ^0.9.1
+    file-name: ^0.1.0
+    lazy-cache: ^1.0.4
+    remote-origin-url: ^0.5.1
+  checksum: be6c290e90d72194b1f0a2a7efb747f524a899cd7ef7a171637163c20f32b84d82ee286a55ed7086ef039b4f3072c29f2df1fe8593138dd75de395866d1d28c0
+  languageName: node
+  linkType: hard
+
 "git-semver-tags@npm:^2.0.3":
   version: 2.0.3
   resolution: "git-semver-tags@npm:2.0.3"
@@ -19131,6 +19396,15 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"git-username@npm:^0.5.0":
+  version: 0.5.1
+  resolution: "git-username@npm:0.5.1"
+  dependencies:
+    remote-origin-url: ^0.4.0
+  checksum: 4f9a8dc4c18f77f4b8c4dad5b9701d884e511f18116d70aaa432acf9745cdb986bdc563cadafd0b79c275110781bcbcea9b759a8a0a362f9ffa4756f2c647394
+  languageName: node
+  linkType: hard
+
 "gitconfiglocal@npm:^1.0.0":
   version: 1.0.0
   resolution: "gitconfiglocal@npm:1.0.0"
@@ -19337,6 +19611,16 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"global-modules@npm:^0.2.3":
+  version: 0.2.3
+  resolution: "global-modules@npm:0.2.3"
+  dependencies:
+    global-prefix: ^0.1.4
+    is-windows: ^0.2.0
+  checksum: 3801788df54897d994c9c8f3d09f253d1379cd879ae61fcddbcc3ecdfdf6fe23a1edb983e8d4dd24cebf7e49823752e1cd29a2d33bdb4de587de8b4a85b17e24
+  languageName: node
+  linkType: hard
+
 "global-modules@npm:^2.0.0":
   version: 2.0.0
   resolution: "global-modules@npm:2.0.0"
@@ -19346,6 +19630,18 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"global-prefix@npm:^0.1.4":
+  version: 0.1.5
+  resolution: "global-prefix@npm:0.1.5"
+  dependencies:
+    homedir-polyfill: ^1.0.0
+    ini: ^1.3.4
+    is-windows: ^0.2.0
+    which: ^1.2.12
+  checksum: ea1b818a1851655ebb2341cdd5446da81c25f31ca6f0ac358a234cbed5442edc1bfa5628771466988d67d9fcc6ad09ca0e68a8d3d7e3d92f7de3aec87020e183
+  languageName: node
+  linkType: hard
+
 "global-prefix@npm:^1.0.1":
   version: 1.0.2
   resolution: "global-prefix@npm:1.0.2"
@@ -20392,7 +20688,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"homedir-polyfill@npm:^1.0.1":
+"homedir-polyfill@npm:^1.0.0, homedir-polyfill@npm:^1.0.1":
   version: 1.0.3
   resolution: "homedir-polyfill@npm:1.0.3"
   dependencies:
@@ -20408,6 +20704,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"hosted-git-info@npm:^2.4.2":
+  version: 2.8.9
+  resolution: "hosted-git-info@npm:2.8.9"
+  checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd
+  languageName: node
+  linkType: hard
+
 "hosted-git-info@npm:^3.0.6":
   version: 3.0.7
   resolution: "hosted-git-info@npm:3.0.7"
@@ -20604,7 +20907,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"http-cache-semantics@npm:3.8.1, http-cache-semantics@npm:^3.8.1":
+"http-cache-semantics@npm:3.8.1, http-cache-semantics@npm:^3.8.0, http-cache-semantics@npm:^3.8.1":
   version: 3.8.1
   resolution: "http-cache-semantics@npm:3.8.1"
   checksum: b1108d37be478fa9b03890d4185217aac2256e9d2247ce6c6bd90bc5432687d68dc7710ba908cea6166fb983a849d902195241626cf175a3c62817a494c0f7f6
@@ -20696,7 +20999,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"http-proxy-agent@npm:^2.1.0":
+"http-proxy-agent@npm:^2.0.0, http-proxy-agent@npm:^2.1.0":
   version: 2.1.0
   resolution: "http-proxy-agent@npm:2.1.0"
   dependencies:
@@ -20790,7 +21093,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"https-proxy-agent@npm:^2.2.3":
+"https-proxy-agent@npm:^2.1.0, https-proxy-agent@npm:^2.2.3":
   version: 2.2.4
   resolution: "https-proxy-agent@npm:2.2.4"
   dependencies:
@@ -20862,6 +21165,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"humps@npm:^2.0.1":
+  version: 2.0.1
+  resolution: "humps@npm:2.0.1"
+  checksum: 7d5a674cfca2f34c04562f6fd0d129b4c43a5caf85fcc1c9eacf5d0729554c9375db362c4232519b37369c94dd2560d85f96ad4091a8fbf4af4e625ab5214a30
+  languageName: node
+  linkType: hard
+
 "husky@npm:^5.0.4":
   version: 5.0.4
   resolution: "husky@npm:5.0.4"
@@ -20972,6 +21282,17 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"image-size@npm:0.8.3":
+  version: 0.8.3
+  resolution: "image-size@npm:0.8.3"
+  dependencies:
+    queue: 6.0.1
+  bin:
+    image-size: bin/image-size.js
+  checksum: e118dc6a738b26e9e9c17bf947205a93a734971970f0a8d1827faa019f414d20af088c1f3c92105c4ec4f596fbc105e1e33217881cb6791a5cc505183f2fac15
+  languageName: node
+  linkType: hard
+
 "image2uri@npm:~1.0.5":
   version: 1.0.5
   resolution: "image2uri@npm:1.0.5"
@@ -21170,6 +21491,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"ini@npm:^1.3.3":
+  version: 1.3.8
+  resolution: "ini@npm:1.3.8"
+  checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3
+  languageName: node
+  linkType: hard
+
 "ini@npm:^4.1.1":
   version: 4.1.1
   resolution: "ini@npm:4.1.1"
@@ -21244,7 +21572,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"inquirer@npm:^6.0.0, inquirer@npm:^6.2.0, inquirer@npm:^6.3.1":
+"inquirer@npm:^6.0.0, inquirer@npm:^6.2.0, inquirer@npm:^6.2.2, inquirer@npm:^6.3.1":
   version: 6.5.2
   resolution: "inquirer@npm:6.5.2"
   dependencies:
@@ -21401,6 +21729,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"ip@npm:^1.1.4":
+  version: 1.1.8
+  resolution: "ip@npm:1.1.8"
+  checksum: a2ade53eb339fb0cbe9e69a44caab10d6e3784662285eb5d2677117ee4facc33a64679051c35e0dfdb1a3983a51ce2f5d2cb36446d52e10d01881789b76e28fb
+  languageName: node
+  linkType: hard
+
 "ip@npm:^2.0.0":
   version: 2.0.0
   resolution: "ip@npm:2.0.0"
@@ -21567,6 +21902,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"is-buffer@npm:^2.0.2":
+  version: 2.0.5
+  resolution: "is-buffer@npm:2.0.5"
+  checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42
+  languageName: node
+  linkType: hard
+
 "is-builtin-module@npm:^3.0.0":
   version: 3.0.0
   resolution: "is-builtin-module@npm:3.0.0"
@@ -22473,6 +22815,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"is-windows@npm:^0.2.0":
+  version: 0.2.0
+  resolution: "is-windows@npm:0.2.0"
+  checksum: 3df25afda2fd9f3926b08cebacf1fc0a1fe7805a2cb73ef0f1b911c949e4e7648c4623979d74b4502bdd9af69471101eb6051b751595f7f88569148186cf7a7a
+  languageName: node
+  linkType: hard
+
 "is-windows@npm:^1.0.0, is-windows@npm:^1.0.1, is-windows@npm:^1.0.2":
   version: 1.0.2
   resolution: "is-windows@npm:1.0.2"
@@ -22651,7 +23000,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"istextorbinary@npm:^2.5.1":
+"istextorbinary@npm:^2.2.1, istextorbinary@npm:^2.5.1":
   version: 2.6.0
   resolution: "istextorbinary@npm:2.6.0"
   dependencies:
@@ -23535,6 +23884,18 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"jsonfile@npm:^3.0.0":
+  version: 3.0.1
+  resolution: "jsonfile@npm:3.0.1"
+  dependencies:
+    graceful-fs: ^4.1.6
+  dependenciesMeta:
+    graceful-fs:
+      optional: true
+  checksum: f2935da339462fe6489c3b8961b637e4eeebd42bcbbe1c8d88f4e937fe19d2d9bc222167281ada2e2f6ddc0324edb43b18107a9b12c743b350326d83ba4db5ef
+  languageName: node
+  linkType: hard
+
 "jsonfile@npm:^4.0.0":
   version: 4.0.0
   resolution: "jsonfile@npm:4.0.0"
@@ -23744,6 +24105,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"lazy-cache@npm:^1.0.4":
+  version: 1.0.4
+  resolution: "lazy-cache@npm:1.0.4"
+  checksum: e6650c22e5de1cc3f4a0c25d2b35fe9cd400473c1b3562be9fceadf8f368d708b54d24f5aa51b321b090da65b36426823a8f706b8dbdd68270db0daba812c5d3
+  languageName: node
+  linkType: hard
+
 "lazy-universal-dotenv@npm:^4.0.0":
   version: 4.0.0
   resolution: "lazy-universal-dotenv@npm:4.0.0"
@@ -24469,7 +24837,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"lru-cache@npm:^4.0.0, lru-cache@npm:^4.0.1":
+"lru-cache@npm:^4.0.0, lru-cache@npm:^4.0.1, lru-cache@npm:^4.1.1":
   version: 4.1.5
   resolution: "lru-cache@npm:4.1.5"
   dependencies:
@@ -24518,6 +24886,7 @@ fsevents@~2.1.2:
     "@types/reach__router": ^1.3.6
     "@types/react-helmet": ^6.1.0
     classnames: ^2.3.2
+    codesandbox: ^2.2.3
     focus-visible: ^5.2.0
     gatsby: ^2.24.87
     gatsby-image: ^2.4.21
@@ -24671,6 +25040,25 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"make-fetch-happen@npm:^2.4.13":
+  version: 2.6.0
+  resolution: "make-fetch-happen@npm:2.6.0"
+  dependencies:
+    agentkeepalive: ^3.3.0
+    cacache: ^10.0.0
+    http-cache-semantics: ^3.8.0
+    http-proxy-agent: ^2.0.0
+    https-proxy-agent: ^2.1.0
+    lru-cache: ^4.1.1
+    mississippi: ^1.2.0
+    node-fetch-npm: ^2.0.2
+    promise-retry: ^1.1.1
+    socks-proxy-agent: ^3.0.1
+    ssri: ^5.0.0
+  checksum: aa6b794b3d8a71f040517f5b40b017c178c02ebc9a88d4241b30a417552c3b217114e164faf57e46fcbff1cfb7b9dd57d110bd9feb487ed60d8aa09922fa5bc0
+  languageName: node
+  linkType: hard
+
 "make-fetch-happen@npm:^5.0.0":
   version: 5.0.2
   resolution: "make-fetch-happen@npm:5.0.2"
@@ -25342,6 +25730,15 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"mimer@npm:1.1.0":
+  version: 1.1.0
+  resolution: "mimer@npm:1.1.0"
+  bin:
+    mimer: ./bin/mimer
+  checksum: 186a3cf8a226a31b1b85c98e188be424a5f666a34cc5e3dbe6ff0e3d964f8f8353e5ac6d9dab380e93820a00e93dd722f55128a627662732f437453847feab45
+  languageName: node
+  linkType: hard
+
 "mimic-fn@npm:^1.0.0":
   version: 1.2.0
   resolution: "mimic-fn@npm:1.2.0"
@@ -25651,6 +26048,42 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"mississippi@npm:^1.2.0, mississippi@npm:^1.3.0":
+  version: 1.3.1
+  resolution: "mississippi@npm:1.3.1"
+  dependencies:
+    concat-stream: ^1.5.0
+    duplexify: ^3.4.2
+    end-of-stream: ^1.1.0
+    flush-write-stream: ^1.0.0
+    from2: ^2.1.0
+    parallel-transform: ^1.1.0
+    pump: ^1.0.0
+    pumpify: ^1.3.3
+    stream-each: ^1.1.0
+    through2: ^2.0.0
+  checksum: a110f53dfeb1902bf4a4e3ad789d3544ca04421605fd0cef4227b2806d198b06a3783ec2615e7968278d60e6bcc9e1f87549c9272bd2a69db634abafca75807e
+  languageName: node
+  linkType: hard
+
+"mississippi@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "mississippi@npm:2.0.0"
+  dependencies:
+    concat-stream: ^1.5.0
+    duplexify: ^3.4.2
+    end-of-stream: ^1.1.0
+    flush-write-stream: ^1.0.0
+    from2: ^2.1.0
+    parallel-transform: ^1.1.0
+    pump: ^2.0.1
+    pumpify: ^1.3.3
+    stream-each: ^1.1.0
+    through2: ^2.0.0
+  checksum: 441540c44c67bdf4fbb49ab9904b782ed2038a28f8ca91fa2e837d5cdf55a1f141364ea82c7913e881f0a09868619c64e755e4057b1a6b34bbd896aa9d88274a
+  languageName: node
+  linkType: hard
+
 "mississippi@npm:^3.0.0":
   version: 3.0.0
   resolution: "mississippi@npm:3.0.0"
@@ -25937,6 +26370,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"nanoid@npm:^2.1.0":
+  version: 2.1.11
+  resolution: "nanoid@npm:2.1.11"
+  checksum: 18cd14386816873849787eb4e65667021bfdeb019a8f14c74287c23594c67b7c0e8f42c7d69f6aedf05cd3d100f1ddc41184f9f9b6b17fbaea1c3ee3f0704eec
+  languageName: node
+  linkType: hard
+
 "nanoid@npm:^3.3.1, nanoid@npm:^3.3.6":
   version: 3.3.6
   resolution: "nanoid@npm:3.3.6"
@@ -26528,6 +26968,18 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"npm-package-arg@npm:^5.1.2":
+  version: 5.1.2
+  resolution: "npm-package-arg@npm:5.1.2"
+  dependencies:
+    hosted-git-info: ^2.4.2
+    osenv: ^0.1.4
+    semver: ^5.1.0
+    validate-npm-package-name: ^3.0.0
+  checksum: 9bf06740d65ddf9c91a071a5afc7a87a90ae15d8dda0b21ac883ef11441ec2d21d8b2496c8cf45d62cf322985107f1aa702751298213fb01561818c78d0c60d3
+  languageName: node
+  linkType: hard
+
 "npm-packlist@npm:^1.4.4":
   version: 1.4.6
   resolution: "npm-packlist@npm:1.4.6"
@@ -26538,6 +26990,16 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"npm-pick-manifest@npm:^1.0.4":
+  version: 1.0.4
+  resolution: "npm-pick-manifest@npm:1.0.4"
+  dependencies:
+    npm-package-arg: ^5.1.2
+    semver: ^5.3.0
+  checksum: 798dba89b2cce6de931e1ae5e96253f1e9f006a989e879f879b7ffdef4872f327982ef6be519e6291bfcca91cb3fa802af60556803eed6ca3f9e2e8466d81387
+  languageName: node
+  linkType: hard
+
 "npm-pick-manifest@npm:^3.0.0":
   version: 3.0.2
   resolution: "npm-pick-manifest@npm:3.0.2"
@@ -27104,6 +27566,18 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"ora@npm:^1.3.0":
+  version: 1.4.0
+  resolution: "ora@npm:1.4.0"
+  dependencies:
+    chalk: ^2.1.0
+    cli-cursor: ^2.1.0
+    cli-spinners: ^1.0.1
+    log-symbols: ^2.1.0
+  checksum: 2a935721404cfb3196865b05fa69a916c338e4cb98cd27958df07d218a24cf59131fa2be116b9a9ea2ce875ee83a4a848758a5b42f5ca4a8c27ae59aabafa090
+  languageName: node
+  linkType: hard
+
 "ora@npm:^5.4.1":
   version: 5.4.1
   resolution: "ora@npm:5.4.1"
@@ -27137,7 +27611,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"os-homedir@npm:^1.0.0":
+"os-homedir@npm:^1.0.0, os-homedir@npm:^1.0.1":
   version: 1.0.2
   resolution: "os-homedir@npm:1.0.2"
   checksum: af609f5a7ab72de2f6ca9be6d6b91a599777afc122ac5cad47e126c1f67c176fe9b52516b9eeca1ff6ca0ab8587fe66208bc85e40a3940125f03cdb91408e9d2
@@ -27168,7 +27642,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"osenv@npm:^0.1.5":
+"osenv@npm:^0.1.4, osenv@npm:^0.1.5":
   version: 0.1.5
   resolution: "osenv@npm:0.1.5"
   dependencies:
@@ -27485,6 +27959,35 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"pacote@npm:^2.7.36":
+  version: 2.7.38
+  resolution: "pacote@npm:2.7.38"
+  dependencies:
+    bluebird: ^3.5.0
+    cacache: ^9.2.9
+    glob: ^7.1.2
+    lru-cache: ^4.1.1
+    make-fetch-happen: ^2.4.13
+    minimatch: ^3.0.4
+    mississippi: ^1.2.0
+    normalize-package-data: ^2.4.0
+    npm-package-arg: ^5.1.2
+    npm-pick-manifest: ^1.0.4
+    osenv: ^0.1.4
+    promise-inflight: ^1.0.1
+    promise-retry: ^1.1.1
+    protoduck: ^4.0.0
+    safe-buffer: ^5.1.1
+    semver: ^5.3.0
+    ssri: ^4.1.6
+    tar-fs: ^1.15.3
+    tar-stream: ^1.5.4
+    unique-filename: ^1.1.0
+    which: ^1.2.12
+  checksum: c642f7fb981244b7873c193b0fb8eccff013db381d9b889ebf66a4e66fb9be6d194bcd19f4276132effa10643bca6a75aaf2772d2cca4b8012249b4f6ca51a9d
+  languageName: node
+  linkType: hard
+
 "pad-component@npm:0.0.1":
   version: 0.0.1
   resolution: "pad-component@npm:0.0.1"
@@ -27619,6 +28122,27 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"parse-git-config@npm:^0.2.0":
+  version: 0.2.0
+  resolution: "parse-git-config@npm:0.2.0"
+  dependencies:
+    ini: ^1.3.3
+  checksum: 7293dd602d3f2fc5618896274fd073a38ad561d8d6b611c8a187d9317cd05c1e3af38740e6929cad393beb4543ae5a5e0535c6171f38b3cf065294c9a0da2e9f
+  languageName: node
+  linkType: hard
+
+"parse-git-config@npm:^1.1.1":
+  version: 1.1.1
+  resolution: "parse-git-config@npm:1.1.1"
+  dependencies:
+    extend-shallow: ^2.0.1
+    fs-exists-sync: ^0.1.0
+    git-config-path: ^1.0.1
+    ini: ^1.3.4
+  checksum: 60534ff45b94ca8e1127e6b178711312df8bb5a43fa159fffa9e83a8e6ca84d673ea13eebfaee9e3950003b752446151a8bbf40e58dff46c5c879a92b8aa14b1
+  languageName: node
+  linkType: hard
+
 "parse-github-repo-url@npm:^1.3.0":
   version: 1.4.1
   resolution: "parse-github-repo-url@npm:1.4.1"
@@ -29212,6 +29736,15 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"protoduck@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "protoduck@npm:4.0.0"
+  dependencies:
+    genfun: ^4.0.1
+  checksum: 8107b00e05d2ebeb1d31ec61d483c387063378d178086394fa39773b32df3fa3ae82d965f2bec11dc344e6bbb0b4e00f4e5d4710012c058d105e15e6ed917041
+  languageName: node
+  linkType: hard
+
 "protoduck@npm:^5.0.1":
   version: 5.0.1
   resolution: "protoduck@npm:5.0.1"
@@ -29300,7 +29833,7 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
-"pump@npm:^2.0.0":
+"pump@npm:^2.0.0, pump@npm:^2.0.1":
   version: 2.0.1
   resolution: "pump@npm:2.0.1"
   dependencies:
@@ -29485,6 +30018,15 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"queue@npm:6.0.1":
+  version: 6.0.1
+  resolution: "queue@npm:6.0.1"
+  dependencies:
+    inherits: ~2.0.3
+  checksum: f39f70b030f9aebf4b32b0db5b7b11d2b799cdaedb190849532983fb31ba45a94d2ee48308e545e8452826b29a4ac996946579af7b42072f04ded3ce40c41703
+  languageName: node
+  linkType: hard
+
 "quick-lru@npm:^1.0.0":
   version: 1.1.0
   resolution: "quick-lru@npm:1.1.0"
@@ -30035,6 +30577,21 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"readable-stream@npm:^2.3.0":
+  version: 2.3.8
+  resolution: "readable-stream@npm:2.3.8"
+  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
+  checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42
+  languageName: node
+  linkType: hard
+
 "readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0":
   version: 3.6.0
   resolution: "readable-stream@npm:3.6.0"
@@ -30716,6 +31273,24 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"remote-origin-url@npm:^0.4.0":
+  version: 0.4.0
+  resolution: "remote-origin-url@npm:0.4.0"
+  dependencies:
+    parse-git-config: ^0.2.0
+  checksum: e1ca72db31578f0a1832755f54ea8d05a2774537716d6ddcea6afb7c042580ba3a604a77932ca32a29c673e6d76474058220dc571ec35cf0ee6d4a1db5facfe4
+  languageName: node
+  linkType: hard
+
+"remote-origin-url@npm:^0.5.1":
+  version: 0.5.3
+  resolution: "remote-origin-url@npm:0.5.3"
+  dependencies:
+    parse-git-config: ^1.1.1
+  checksum: c83ead152291f6af0c7c7948818bdfe1893ddff2aaa74db5165c9827ac2bcbd4a9941e2a4425cb08ee789fac33099de95499e483f1704ce746ea5d7724a17ba7
+  languageName: node
+  linkType: hard
+
 "remove-trailing-separator@npm:^1.0.1":
   version: 1.1.0
   resolution: "remove-trailing-separator@npm:1.1.0"
@@ -30875,6 +31450,16 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"resolve-dir@npm:^0.1.0":
+  version: 0.1.1
+  resolution: "resolve-dir@npm:0.1.1"
+  dependencies:
+    expand-tilde: ^1.2.2
+    global-modules: ^0.2.3
+  checksum: cc3e1885938f8fe9656a6faa651e21730d369260e907b8dd7c847a4aa18db348ac08ee0dbf2d6f87e2ba08715fb109432ec773bbb31698381bd2a48c0ea66072
+  languageName: node
+  linkType: hard
+
 "resolve-dir@npm:^1.0.0":
   version: 1.0.1
   resolution: "resolve-dir@npm:1.0.1"
@@ -32110,6 +32695,15 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"shortid@npm:^2.2.8":
+  version: 2.2.16
+  resolution: "shortid@npm:2.2.16"
+  dependencies:
+    nanoid: ^2.1.0
+  checksum: 0790ce22fe20aacc226915160da178b5a6af7814d1796404684f6699b60f77e291d39ad3b6b2b4c6efcf5553e1deeee7e29a48b8f46955de1425e67ab934e309
+  languageName: node
+  linkType: hard
+
 "side-channel@npm:^1.0.2":
   version: 1.0.3
   resolution: "side-channel@npm:1.0.3"
@@ -32268,6 +32862,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"smart-buffer@npm:^1.0.13":
+  version: 1.1.15
+  resolution: "smart-buffer@npm:1.1.15"
+  checksum: 3a5267715c5f621968e3889f9ca673f2f4ab3d6e77f18b634898067e54443899691ddda8e6a9db8e5d1888fd1522e34c20e9156183fd66472c2b2088ab011792
+  languageName: node
+  linkType: hard
+
 "smart-buffer@npm:^4.1.0":
   version: 4.1.0
   resolution: "smart-buffer@npm:4.1.0"
@@ -32441,6 +33042,16 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"socks-proxy-agent@npm:^3.0.1":
+  version: 3.0.1
+  resolution: "socks-proxy-agent@npm:3.0.1"
+  dependencies:
+    agent-base: ^4.1.0
+    socks: ^1.1.10
+  checksum: d211f7233ad1a01dbeecb9f75c7032ca69fb3021924e40c2ee271dac7eb2aa687ef0d3a9914be62e9cbdbdfcf837e503ca41642740a449939b511bb6d4148cd7
+  languageName: node
+  linkType: hard
+
 "socks-proxy-agent@npm:^4.0.0":
   version: 4.0.2
   resolution: "socks-proxy-agent@npm:4.0.2"
@@ -32473,6 +33084,16 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"socks@npm:^1.1.10":
+  version: 1.1.10
+  resolution: "socks@npm:1.1.10"
+  dependencies:
+    ip: ^1.1.4
+    smart-buffer: ^1.0.13
+  checksum: 38494adebcb0b653467097e02f5cdd2d971b4635e50e715ba96f8fe4ab6ce011148fad6691b5f99580d740e832bdb7695c489b3977cd1d97b64c6b44bc24e308
+  languageName: node
+  linkType: hard
+
 "socks@npm:^2.6.1":
   version: 2.6.1
   resolution: "socks@npm:2.6.1"
@@ -32786,6 +33407,24 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"ssri@npm:^4.1.6":
+  version: 4.1.6
+  resolution: "ssri@npm:4.1.6"
+  dependencies:
+    safe-buffer: ^5.1.0
+  checksum: 0500541df00e914cb7fdd81e80429d0c78a418b385c1f03a0bfc0cab56bf66be3052ad817d481419e972d0533da0ee5694ea6edbc3def36a567df87fd9c76272
+  languageName: node
+  linkType: hard
+
+"ssri@npm:^5.0.0, ssri@npm:^5.2.4":
+  version: 5.3.0
+  resolution: "ssri@npm:5.3.0"
+  dependencies:
+    safe-buffer: ^5.1.1
+  checksum: 18902cf582d15075b31dddd2508404cd688a7bceb0026765b7a9ed1d0c8422eab548e06427d850e048ad72643f8382a1dda2a4b00d2381bb8622e2e19b8a92d5
+  languageName: node
+  linkType: hard
+
 "ssri@npm:^6.0.0, ssri@npm:^6.0.1":
   version: 6.0.1
   resolution: "ssri@npm:6.0.1"
@@ -33978,6 +34617,18 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"tar-fs@npm:^1.15.3":
+  version: 1.16.3
+  resolution: "tar-fs@npm:1.16.3"
+  dependencies:
+    chownr: ^1.0.1
+    mkdirp: ^0.5.1
+    pump: ^1.0.0
+    tar-stream: ^1.1.2
+  checksum: 0c78aa173cde0df44e5fbbd85077240b8340444bff5ec026539e9e20806ca31b5d4b8cee58befe5c1dae7fa47cd1bb3f9a0efebf2212c2bfbad31f23de329c79
+  languageName: node
+  linkType: hard
+
 "tar-fs@npm:^2.1.1":
   version: 2.1.1
   resolution: "tar-fs@npm:2.1.1"
@@ -33990,6 +34641,21 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"tar-stream@npm:^1.1.2, tar-stream@npm:^1.5.4":
+  version: 1.6.2
+  resolution: "tar-stream@npm:1.6.2"
+  dependencies:
+    bl: ^1.0.0
+    buffer-alloc: ^1.2.0
+    end-of-stream: ^1.0.0
+    fs-constants: ^1.0.0
+    readable-stream: ^2.3.0
+    to-buffer: ^1.1.1
+    xtend: ^4.0.0
+  checksum: a5d49e232d3e33321bbd150381b6a4e5046bf12b1c2618acb95435b7871efde4d98bd1891eb2200478a7142ef7e304e033eb29bbcbc90451a2cdfa1890e05245
+  languageName: node
+  linkType: hard
+
 "tar-stream@npm:^2.1.4":
   version: 2.2.0
   resolution: "tar-stream@npm:2.2.0"
@@ -34364,6 +35030,13 @@ fsevents@~2.1.2:
   languageName: node
   linkType: hard
 
+"to-buffer@npm:^1.1.1":
+  version: 1.1.1
+  resolution: "to-buffer@npm:1.1.1"
+  checksum: 6c897f58c2bdd8b8b1645ea515297732fec6dafb089bf36d12370c102ff5d64abf2be9410e0b1b7cfc707bada22d9a4084558010bfc78dd7023748dc5dd9a1ce
+  languageName: node
+  linkType: hard
+
 "to-fast-properties@npm:^2.0.0":
   version: 2.0.0
   resolution: "to-fast-properties@npm:2.0.0"
@@ -35198,7 +35871,7 @@ typescript@^3.9.3:
   languageName: node
   linkType: hard
 
-"unique-filename@npm:^1.1.1":
+"unique-filename@npm:^1.1.0, unique-filename@npm:^1.1.1":
   version: 1.1.1
   resolution: "unique-filename@npm:1.1.1"
   dependencies:
@@ -35586,7 +36259,7 @@ typescript@^3.9.3:
   languageName: node
   linkType: hard
 
-"update-notifier@npm:^2.5.0":
+"update-notifier@npm:^2.2.0, update-notifier@npm:^2.5.0":
   version: 2.5.0
   resolution: "update-notifier@npm:2.5.0"
   dependencies:
@@ -36725,7 +37398,7 @@ typescript@^3.9.3:
   languageName: node
   linkType: hard
 
-"which@npm:1, which@npm:^1.2.14, which@npm:^1.2.8, which@npm:^1.2.9, which@npm:^1.3.0, which@npm:^1.3.1":
+"which@npm:1, which@npm:^1.2.12, which@npm:^1.2.14, which@npm:^1.2.8, which@npm:^1.2.9, which@npm:^1.3.0, which@npm:^1.3.1":
   version: 1.3.1
   resolution: "which@npm:1.3.1"
   dependencies:
@@ -37143,6 +37816,13 @@ typescript@^3.9.3:
   languageName: node
   linkType: hard
 
+"y18n@npm:^3.2.1":
+  version: 3.2.2
+  resolution: "y18n@npm:3.2.2"
+  checksum: 6154fd7544f8bbf5b18cdf77692ed88d389be49c87238ecb4e0d6a5276446cd2a5c29cc4bdbdddfc7e4e498b08df9d7e38df4a1453cf75eecfead392246ea74a
+  languageName: node
+  linkType: hard
+
 "y18n@npm:^4.0.0":
   version: 4.0.0
   resolution: "y18n@npm:4.0.0"