Browse Source

Splitting sandpack from main bundle (#4256)

* Initial Commit

* play with it

* oops

* easier repro

* import type

* remove `suspense: true`

* Add patch for next

* Patch package

* Add fallback

* Enable flag

* Fixes local dev env and adds better fallback for codeblock

* Adds fallback for sandpack (should work fine)

* turn off concurrentFeatures

* Revert "turn off concurrentFeatures"

This reverts commit 50158ecbd33969e707a2a91a54e822e90c2ebfde.

* Update SandpackWrapper.tsx

* Removed flags and setTimeouts

* add timeouts and promise again

* Adds bottom bezel and scroll to sandpack fallback

* tinker bottombezel and remove console

* Update CodeBlock.tsx

* Update SandpackWrapper.tsx

* removing overflows to avoid explicit scrolls

* upgrade nextjs to canary

* Rm patch

* Fix TS

* Bump Next

* No more CSS jumping

* Reverts the canary to use the latest Next.js `12.0.10`

Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
Co-authored-by: Dan Abramov <dan.abramov@me.com>
main
Strek 3 years ago
committed by GitHub
parent
commit
2979d0c967
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      beta/next.config.js
  2. 4
      beta/package.json
  3. 6
      beta/src/components/MDX/APIAnatomy.tsx
  4. 7
      beta/src/components/MDX/CodeBlock/CodeBlock.module.css
  5. 7
      beta/src/components/MDX/CodeBlock/CodeBlock.tsx
  6. 33
      beta/src/components/MDX/CodeBlock/index.tsx
  7. 1
      beta/src/components/MDX/MDXComponents.tsx
  8. 1
      beta/src/components/MDX/PackageImport.tsx
  9. 102
      beta/src/components/MDX/Sandpack/SandpackWrapper.tsx
  10. 200
      beta/src/components/MDX/Sandpack/index.tsx
  11. 54
      beta/src/components/MDX/Sandpack/utils.ts
  12. 6
      beta/src/pages/_document.tsx
  13. 4
      beta/src/styles/sandpack.css
  14. 148
      beta/yarn.lock

4
beta/next.config.js

@ -11,7 +11,7 @@ module.exports = {
experimental: {
plugins: true,
// TODO: this doesn't work because https://github.com/vercel/next.js/issues/30714
// concurrentFeatures: true,
concurrentFeatures: false,
scrollRestoration: true,
},
async redirects() {
@ -27,7 +27,7 @@ module.exports = {
},
webpack: (config, {dev, isServer, ...options}) => {
if (process.env.ANALYZE) {
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer');
config.plugins.push(
new BundleAnalyzerPlugin({
analyzerMode: 'static',

4
beta/package.json

@ -18,7 +18,7 @@
"ci-check": "npm-run-all prettier:diff --parallel lint tsc lint-heading-ids",
"tsc": "tsc --noEmit",
"start": "next start",
"postinstall": "is-ci || (cd .. && husky install beta/.husky)",
"postinstall": "patch-package && (is-ci || (cd .. && husky install beta/.husky))",
"check-all": "npm-run-all prettier lint:fix tsc"
},
"dependencies": {
@ -32,7 +32,7 @@
"date-fns": "^2.16.1",
"debounce": "^1.2.1",
"github-slugger": "^1.3.0",
"next": "^12.0.9",
"next": "^12.0.10",
"parse-numeric-range": "^1.2.0",
"react": "experimental",
"react-collapsed": "3.1.0",

6
beta/src/components/MDX/APIAnatomy.tsx

@ -59,7 +59,11 @@ export function APIAnatomy({children}: APIAnatomyProps) {
break;
case 'pre':
acc.code = (
<CodeBlock {...child.props.children.props} noMargin={true} />
<CodeBlock
{...child.props.children.props}
noMargin={true}
isFromAPIAnatomy
/>
);
break;
}

7
beta/src/components/MDX/CodeBlock/CodeBlock.module.css

@ -1,7 +0,0 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*/
.codeViewer {
padding: 6px 0.5rem !important;
}

7
beta/src/components/MDX/CodeBlock/CodeBlock.tsx

@ -4,14 +4,12 @@
import cn from 'classnames';
import {
ClasserProvider,
SandpackCodeViewer,
SandpackProvider,
SandpackThemeProvider,
} from '@codesandbox/sandpack-react';
import rangeParser from 'parse-numeric-range';
import {CustomTheme} from '../Sandpack/Themes';
import styles from './CodeBlock.module.css';
interface InlineHiglight {
step: number;
@ -86,16 +84,11 @@ const CodeBlock = function CodeBlock({
},
}}>
<SandpackThemeProvider theme={CustomTheme}>
<ClasserProvider
classes={{
'sp-cm': styles.codeViewer,
}}>
<SandpackCodeViewer
key={children.trimEnd()}
showLineNumbers={false}
decorators={decorators}
/>
</ClasserProvider>
</SandpackThemeProvider>
</SandpackProvider>
</div>

33
beta/src/components/MDX/CodeBlock/index.tsx

@ -1,7 +1,34 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*/
import cn from 'classnames';
import * as React from 'react';
const CodeBlock = React.lazy(() => import('./CodeBlock'));
import CodeBlock from './CodeBlock';
export default CodeBlock;
export default React.memo(function CodeBlockWrapper(props: {
isFromAPIAnatomy: boolean;
isFromPackageImport: boolean;
children: string;
className?: string;
metastring: string;
noMargin?: boolean;
noMarkers?: boolean;
}): any {
const {children, isFromAPIAnatomy, isFromPackageImport} = props;
return (
<React.Suspense
fallback={
<pre
className={cn(
'rounded-lg leading-6 h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg text-[13.6px] overflow-hidden',
!isFromPackageImport && !isFromAPIAnatomy && 'my-8'
)}>
<div className="py-[18px] pl-5 font-normal ">
<p className="sp-pre-placeholder overflow-hidden">{children}</p>
</div>
</pre>
}>
<CodeBlock {...props} />
</React.Suspense>
);
});

1
beta/src/components/MDX/MDXComponents.tsx

@ -19,6 +19,7 @@ import Intro from './Intro';
import Link from './Link';
import {PackageImport} from './PackageImport';
import Recap from './Recap';
import dynamic from 'next/dynamic';
import Sandpack from './Sandpack';
import SimpleCallout from './SimpleCallout';
import TerminalBlock from './TerminalBlock';

1
beta/src/components/MDX/PackageImport.tsx

@ -18,6 +18,7 @@ export function PackageImport({children}: PackageImportProps) {
return (
<CodeBlock
{...child.props.children.props}
isFromPackageImport
key={i}
noMargin={true}
noMarkers={true}

102
beta/src/components/MDX/Sandpack/SandpackWrapper.tsx

@ -0,0 +1,102 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*/
import React from 'react';
import {
SandpackProvider,
SandpackSetup,
SandpackFile,
} from '@codesandbox/sandpack-react';
import {CustomPreset} from './CustomPreset';
type SandpackProps = {
children: React.ReactChildren;
autorun?: boolean;
setup?: SandpackSetup;
showDevTools?: boolean;
};
import {reducedCodeSnippet} from './utils';
const sandboxStyle = `
* {
box-sizing: border-box;
}
body {
font-family: sans-serif;
margin: 20px;
padding: 0;
}
h1 {
margin-top: 0;
font-size: 22px;
}
h2 {
margin-top: 0;
font-size: 20px;
}
h3 {
margin-top: 0;
font-size: 18px;
}
h4 {
margin-top: 0;
font-size: 16px;
}
h5 {
margin-top: 0;
font-size: 14px;
}
h6 {
margin-top: 0;
font-size: 12px;
}
ul {
padding-left: 20px;
}
`.trim();
function SandpackWrapper(props: SandpackProps) {
let {children, setup, autorun = true, showDevTools = false} = props;
const [devToolsLoaded, setDevToolsLoaded] = React.useState(false);
let codeSnippets = React.Children.toArray(children) as React.ReactElement[];
let isSingleFile = true;
const files = reducedCodeSnippet(codeSnippets);
files['/styles.css'] = {
code: [sandboxStyle, files['/styles.css']?.code ?? ''].join('\n\n'),
hidden: true,
};
return (
<div className="sandpack-container my-8" translate="no">
<SandpackProvider
template="react"
customSetup={{...setup, files: files}}
autorun={autorun}
initMode="user-visible"
initModeObserverOptions={{rootMargin: '1400px 0px'}}>
<CustomPreset
isSingleFile={isSingleFile}
showDevTools={showDevTools}
onDevToolsLoad={() => setDevToolsLoaded(true)}
devToolsLoaded={devToolsLoaded}
/>
</SandpackProvider>
</div>
);
}
SandpackWrapper.displayName = 'Sandpack';
export default SandpackWrapper;

200
beta/src/components/MDX/Sandpack/index.tsx

@ -1,146 +1,68 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*/
import React from 'react';
import {
SandpackProvider,
SandpackSetup,
SandpackFile,
} from '@codesandbox/sandpack-react';
import {CustomPreset} from './CustomPreset';
type SandpackProps = {
children: React.ReactChildren;
autorun?: boolean;
setup?: SandpackSetup;
showDevTools?: boolean;
};
const sandboxStyle = `
* {
box-sizing: border-box;
}
body {
font-family: sans-serif;
margin: 20px;
padding: 0;
}
h1 {
margin-top: 0;
font-size: 22px;
}
h2 {
margin-top: 0;
font-size: 20px;
}
h3 {
margin-top: 0;
font-size: 18px;
}
h4 {
margin-top: 0;
font-size: 16px;
}
h5 {
margin-top: 0;
font-size: 14px;
}
h6 {
margin-top: 0;
font-size: 12px;
}
ul {
padding-left: 20px;
}
`.trim();
function Sandpack(props: SandpackProps) {
let {children, setup, autorun = true, showDevTools = false} = props;
const [devToolsLoaded, setDevToolsLoaded] = React.useState(false);
let codeSnippets = React.Children.toArray(children) as React.ReactElement[];
let isSingleFile = true;
const files = codeSnippets.reduce(
(result: Record<string, SandpackFile>, codeSnippet: React.ReactElement) => {
if (codeSnippet.props.mdxType !== 'pre') {
return result;
}
const {props} = codeSnippet.props.children;
let filePath; // path in the folder structure
let fileHidden = false; // if the file is available as a tab
let fileActive = false; // if the file tab is shown by default
import * as React from 'react';
import {reducedCodeSnippet} from './utils';
const Sandpack = React.lazy(() => import('./SandpackWrapper'));
const SandpackFallBack = ({code}: {code: string}) => (
<div className="sandpack-container my-8">
<div className="shadow-lg dark:shadow-lg-dark rounded-lg">
<div className="bg-wash h-10 dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg rounded-b-none">
<div className="px-4 lg:px-6">
<div className="sp-tabs"></div>
</div>
<div className="px-3 flex items-center justify-end flex-grow text-right"></div>
</div>
<div className="sp-wrapper">
<div className="sp-layout sp-custom-layout min-h-[216px]">
<div className="sp-stack max-h-[406px] h-auto">
<div className="sp-code-editor">
<div className="sp-cm sp-pristine overflow-auto">
<div className="cm-editor">
<div>
<div className="cm-gutters pl-9 sticky min-h-[192px]">
<div className="cm-gutter cm-lineNumbers whitespace-pre sp-pre-placeholder">
{code}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="sp-stack order-last xl:order-2 max-h-[406px] h-auto">
<div className="p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative rounded-b-lg lg:rounded-b-none overflow-auto"></div>
</div>
{code.split('\n').length > 16 && (
<div className="flex h-[42px] text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 rounded-t-none p-1 w-full order-2 xl:order-last border-b-1 relative top-0"></div>
)}
</div>
</div>
</div>
</div>
);
if (props.metastring) {
const [name, ...params] = props.metastring.split(' ');
filePath = '/' + name;
if (params.includes('hidden')) {
fileHidden = true;
}
if (params.includes('active')) {
fileActive = true;
}
isSingleFile = false;
} else {
if (props.className === 'language-js') {
filePath = '/App.js';
} else if (props.className === 'language-css') {
filePath = '/styles.css';
} else {
throw new Error(
`Code block is missing a filename: ${props.children}`
export default React.memo(function SandpackWrapper(props: any): any {
const codeSnippet = reducedCodeSnippet(
React.Children.toArray(props.children)
);
}
}
if (result[filePath]) {
throw new Error(
`File ${filePath} was defined multiple times. Each file snippet should have a unique path name`
);
}
result[filePath] = {
code: (props.children as string).trim(),
hidden: fileHidden,
active: fileActive,
};
return result;
},
{}
// To set the active file in the fallback we have to find the active file first. If there are no active files we fallback to App.js as default
let activeCodeSnippet = Object.keys(codeSnippet).filter(
(fileName) =>
codeSnippet[fileName]?.active === true &&
codeSnippet[fileName]?.hidden === false
);
files['/styles.css'] = {
code: [sandboxStyle, files['/styles.css']?.code ?? ''].join('\n\n'),
hidden: true,
};
let activeCode;
if (!activeCodeSnippet.length) {
activeCode = codeSnippet['/App.js'].code;
} else {
activeCode = codeSnippet[activeCodeSnippet[0]].code;
}
return (
<div className="sandpack-container my-8" translate="no">
<SandpackProvider
template="react"
customSetup={{...setup, files: files}}
autorun={autorun}
initMode="user-visible"
initModeObserverOptions={{rootMargin: '1400px 0px'}}>
<CustomPreset
isSingleFile={isSingleFile}
showDevTools={showDevTools}
onDevToolsLoad={() => setDevToolsLoaded(true)}
devToolsLoaded={devToolsLoaded}
/>
</SandpackProvider>
</div>
<>
<React.Suspense fallback={<SandpackFallBack code={activeCode} />}>
<Sandpack {...props} />
</React.Suspense>
</>
);
}
Sandpack.displayName = 'Sandpack';
export default Sandpack;
});

54
beta/src/components/MDX/Sandpack/utils.ts

@ -1,7 +1,7 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*/
import type {SandpackFile} from '@codesandbox/sandpack-react';
export type ViewportSizePreset =
| 'iPhone X'
| 'Pixel 2'
@ -47,3 +47,55 @@ export const computeViewportSize = (
return viewport;
};
//TODO: revisit to reduce this (moved this to utils from sandpackWrapper since it is being used for finding active file for fallBack too)
export const reducedCodeSnippet = (codeSnippets: any) => {
let isSingleFile = true;
return codeSnippets.reduce(
(result: Record<string, SandpackFile>, codeSnippet: React.ReactElement) => {
if (codeSnippet.props.mdxType !== 'pre') {
return result;
}
const {props} = codeSnippet.props.children;
let filePath; // path in the folder structure
let fileHidden = false; // if the file is available as a tab
let fileActive = false; // if the file tab is shown by default
if (props.metastring) {
const [name, ...params] = props.metastring.split(' ');
filePath = '/' + name;
if (params.includes('hidden')) {
fileHidden = true;
}
if (params.includes('active')) {
fileActive = true;
}
isSingleFile = false;
} else {
if (props.className === 'language-js') {
filePath = '/App.js';
} else if (props.className === 'language-css') {
filePath = '/styles.css';
} else {
throw new Error(
`Code block is missing a filename: ${props.children}`
);
}
}
if (result[filePath]) {
throw new Error(
`File ${filePath} was defined multiple times. Each file snippet should have a unique path name`
);
}
result[filePath] = {
code: props.children as string,
hidden: fileHidden,
active: fileActive,
};
return result;
},
{}
);
};

6
beta/src/pages/_document.tsx

@ -5,8 +5,7 @@
import * as React from 'react';
import Document, {Html, Head, Main, NextScript} from 'next/document';
class MyDocument extends Document {
render() {
const MyDocument = () => {
// @todo specify language in HTML?
return (
<Html lang="en">
@ -60,7 +59,6 @@ class MyDocument extends Document {
</body>
</Html>
);
}
}
};
export default MyDocument;

4
beta/src/styles/sandpack.css

@ -132,7 +132,6 @@ html.dark .sp-tabs .sp-tab-button[data-active='true'] {
font-size: 13.6px !important;
line-height: 24px !important;
height: 100%;
overflow: scroll;
}
.text-xl .sp-pre-placeholder {
font-size: 16px !important;
@ -250,6 +249,9 @@ html.dark .sp-devtools > div {
}
}
.sp-cm.sp-pristine {
padding-left: 8px !important;
}
.sp-layout {
min-height: 216px;
}

148
beta/yarn.lock

@ -713,10 +713,10 @@
resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b"
integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==
"@next/env@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/env/-/env-12.0.9.tgz#4c9e9eef00226145d9629a846b8cc31878e1328c"
integrity sha512-oBlkyDop0Stf7MPIzETGv5r0YT/G/weBrknoPOUTaa5qwOeGjuy6gsOVc/SBtrBkOoBmRpD+fFhQJPvmo1mS+g==
"@next/env@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/env/-/env-12.0.10.tgz#561640fd62279218ccd2798ae907bae8d94a7730"
integrity sha512-mQVj0K6wQ5WEk/sL9SZ+mJXJUaG7el8CpZ6io1uFe9GgNTSC7EgUyNGqM6IQovIFc5ukF4O/hqsdh3S/DCgT2g==
"@next/eslint-plugin-next@12.0.3":
version "12.0.3"
@ -725,60 +725,60 @@
dependencies:
glob "7.1.7"
"@next/swc-android-arm64@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.0.9.tgz#2cdbcc1814471044ea0e057b475090d25654833c"
integrity sha512-aVqgsEn5plmUH2X58sjzhHsH/6majucWTMaaBEs7hHO2+GCwCZc7zaLH4XCBMKPES9Yaja8/pYUbvZQE9DqgFw==
"@next/swc-darwin-arm64@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.9.tgz#ea200929d7116de12c6f3b13ff75f9522c2153e3"
integrity sha512-uAgRKm4a2nVdyBiPPJokvmDD1saugOvxljz9ld2ih0CCg5S9vBhqaj3kPGCQBj9hSu3q+Lng2CHnQqG3ga1jzA==
"@next/swc-darwin-x64@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.9.tgz#32800a7a9aff4bfd2038b0bce3657ece8708a87b"
integrity sha512-fDOs2lZIyrAdU18IxMA5orBPn9qLbOdu55gXSTNZOhyRJ8ugtbUAejsK7OL0boJy0CCHPAdVRXm01Mwk8tZ9RQ==
"@next/swc-linux-arm-gnueabihf@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.9.tgz#da012dfb69ad2abc3d4045395581b650048bdd7c"
integrity sha512-/ni0p9DBvATUML9RQ1ycQuf05uOYKdzA6iI8+eRsARjpGbFVUFbge7XPzlj9g2Q9YWgoN8CSjFGnKRlyky5uHA==
"@next/swc-linux-arm64-gnu@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.9.tgz#fe704c0a1cb048ef19d4a24b2c990574c96c933b"
integrity sha512-AphxilJDf95rUxJDHgM9Ww1DaYXZWqTvoKwXeej/0SgSvICcRZrLaFDrkojdXz0Rxr4igX2OdYR1S4/Hj1jWOQ==
"@next/swc-linux-arm64-musl@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.9.tgz#b2bb68940903cd64f7875979ed9907e946dc4f3e"
integrity sha512-K5jbvNNzF3mRjWmPdxP5Bg87i7FHivfBj/L0KJlxpkLSC8sffBJDmB6jtMnI7wiPj9J6vmLkbGtSosln78xAlQ==
"@next/swc-linux-x64-gnu@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.9.tgz#b700ba095551d4f6e830b92d4593a3b6e73bba82"
integrity sha512-bJZ9bkMkQzsY+UyWezEZ77GWQ4TzwKeXdayX3U3+aEkL8k5C6eKBXlidWdrhu0teLmaUXIyWerWrLnJzwGXdfw==
"@next/swc-linux-x64-musl@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.9.tgz#678460266f544b52f1190ef0c3494e436608591e"
integrity sha512-SR9p0R+v1T32DTXPVAXZw31pmJAkSDotC6Afy+mfC0xrEL3pp95R8sGXYAAUCEPkQp0MEeUOVy2LrToe92X7hQ==
"@next/swc-win32-arm64-msvc@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.9.tgz#f70e5bd0821ca168aeef117e51ab870265ceeeb1"
integrity sha512-mzQ1A8vfHhJrvEy5KJZGZWEByXthyKfWofvFaf+oo/5nJl/0Bz1ODP2ajSmbLG++77Eo2AROgbm9pkW1ucvG2A==
"@next/swc-win32-ia32-msvc@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.9.tgz#0b853793754642cde9f9099087d4a86b6a99a24d"
integrity sha512-MpD2vj1zjo1u3J3wiz3pEKse19Etz+P0GL6XfQkB/9a84vJQ1JWMaWBjmIdivzZv718Il2pRSSx8hymwPfguYQ==
"@next/swc-win32-x64-msvc@12.0.9":
version "12.0.9"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.9.tgz#f7d3b59000082cf65c84fdc61930b708aa5446e5"
integrity sha512-1c/sxp/4Qz4F6rCxiYqAnrmghCOFt5hHZ9Kd+rXFW5Mqev4C4XDOUMHdBH55HgnJZqngYhOE0r/XNkCtsIojig==
"@next/swc-android-arm64@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.0.10.tgz#fd9d716433cc9d361021b0052f8b002bcaff948d"
integrity sha512-xYwXGkNhzZZsM5MD7KRwF5ZNiC8OLPtVMUiagpPnwENg8Hb0GSQo/NbYWXM8YrawEwp9LaZ7OXiuRKPh2JyBdA==
"@next/swc-darwin-arm64@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.10.tgz#34b2d0dc62eb89efb9176af111e3820a11fdb3f0"
integrity sha512-f2zngulkpIJKWHckhRi7X8GZ+J/tNgFF7lYIh7Qx15JH0OTBsjkqxORlkzy+VZyHJ5sWTCaI6HYYd3ow6qkEEg==
"@next/swc-darwin-x64@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.10.tgz#a4306795159293c7d4d58a2c88ce1710ff0a8baa"
integrity sha512-Qykcu/gVC5oTvOQoRBhyuS5GYm5SbcgrFTsaLFkGBmEkg9eMQRiaCswk4IafpDXVzITkVFurzSM28q3tLW2qUw==
"@next/swc-linux-arm-gnueabihf@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.10.tgz#1ad15af3d5fca2fef57894d61e16f73aee61ec2e"
integrity sha512-EhqrTFsIXAXN9B/fiiW/QKUK/lSLCXRsLalkUp58KDfMqVLLlj1ORbESAcswiNQOChLuHQSldGEEtOBPQZcd9A==
"@next/swc-linux-arm64-gnu@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.10.tgz#a84a92d0e1a179c4346c9ed8f22e26f708101ad6"
integrity sha512-kqGtC72g3+JYXZbY2ca6digXR5U6AQ6Dzv4eAxYluMePLHjI/Xye1mf9dwVsgmeXfrD/IRDp5K/3A6UNvBm4oQ==
"@next/swc-linux-arm64-musl@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.10.tgz#973ec96c77f845bd0a6eecbf1892caa1ee4defaf"
integrity sha512-bG9zTSNwnSgc1Un/7oz1ZVN4UeXsTWrsQhAGWU78lLLCn4Zj9HQoUCRCGLt0OVs2DBZ+WC8CzzFliQ1SKipVbg==
"@next/swc-linux-x64-gnu@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.10.tgz#efcc7f8252ea8225834760eaf09350f1bead73f7"
integrity sha512-c79PcfWtyThiYRa1+3KVfDq0zXaI8o1d6dQWNVqDrtLz5HKM/rbjLdvoNuxDwUeZhxI/d9CtyH6GbuKPw5l/5A==
"@next/swc-linux-x64-musl@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.10.tgz#c2a73d939dfd310acc1892a0a132762500dd5757"
integrity sha512-g/scgn+21/MLfizOCZOZt+MxNj2/8Tdlwjvy+QZcSUPZRUI2Y5o3HwBvI1f/bSci+NGRU+bUAO0NFtRJ9MzH5w==
"@next/swc-win32-arm64-msvc@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.10.tgz#2316af5f612cde1691abdf2571ff40ec32ea3429"
integrity sha512-gl6B/ravwMeY5Nv4Il2/ARYJQ6u+KPRwGMjS1ZrNudIKlNn4YBeXh5A4cIVm+dHaff6/O/lGOa5/SUYDMZpkww==
"@next/swc-win32-ia32-msvc@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.10.tgz#98a4f74d164871cfaccb0df6efddf2b7bcbaa54b"
integrity sha512-7RVpZ3tSThC6j+iZB0CUYmFiA3kXmN+pE7QcfyAxFaflKlaZoWNMKHIEZDuxSJc6YmQ6kyxsjqxVay2F5+/YCg==
"@next/swc-win32-x64-msvc@12.0.10":
version "12.0.10"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.10.tgz#5c0ba98b695c4be44d8793aff42971a0dac65c2d"
integrity sha512-oUIWRKd24jFLRWUYO1CZmML5+32BcpVfqhimGaaZIXcOkfQW+iqiAzdqsv688zaGtyKGeB9ZtiK3NDf+Q0v+Vw==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@ -3337,28 +3337,28 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
next@^12.0.9:
version "12.0.9"
resolved "https://registry.yarnpkg.com/next/-/next-12.0.9.tgz#4eb3006b63bb866f5c2918ca0003e98f4259e063"
integrity sha512-omfYqoR/DvbdOIJ6SS1unKJ4mGIxUPs0RPa7wr/Mft22OCKgJhuG+aI9KFYi5ZJBwoFQk1vqaMKpWz5qr+dN0Q==
next@^12.0.10:
version "12.0.10"
resolved "https://registry.yarnpkg.com/next/-/next-12.0.10.tgz#fcc4584177418bd777ce157f3165b7ba5e7708f7"
integrity sha512-1y3PpGzpb/EZzz1jgne+JfZXKAVJUjYXwxzrADf/LWN+8yi9o79vMLXpW3mevvCHkEF2sBnIdjzNn16TJrINUw==
dependencies:
"@next/env" "12.0.9"
"@next/env" "12.0.10"
caniuse-lite "^1.0.30001283"
postcss "8.4.5"
styled-jsx "5.0.0"
use-subscription "1.5.1"
optionalDependencies:
"@next/swc-android-arm64" "12.0.9"
"@next/swc-darwin-arm64" "12.0.9"
"@next/swc-darwin-x64" "12.0.9"
"@next/swc-linux-arm-gnueabihf" "12.0.9"
"@next/swc-linux-arm64-gnu" "12.0.9"
"@next/swc-linux-arm64-musl" "12.0.9"
"@next/swc-linux-x64-gnu" "12.0.9"
"@next/swc-linux-x64-musl" "12.0.9"
"@next/swc-win32-arm64-msvc" "12.0.9"
"@next/swc-win32-ia32-msvc" "12.0.9"
"@next/swc-win32-x64-msvc" "12.0.9"
"@next/swc-android-arm64" "12.0.10"
"@next/swc-darwin-arm64" "12.0.10"
"@next/swc-darwin-x64" "12.0.10"
"@next/swc-linux-arm-gnueabihf" "12.0.10"
"@next/swc-linux-arm64-gnu" "12.0.10"
"@next/swc-linux-arm64-musl" "12.0.10"
"@next/swc-linux-x64-gnu" "12.0.10"
"@next/swc-linux-x64-musl" "12.0.10"
"@next/swc-win32-arm64-msvc" "12.0.10"
"@next/swc-win32-ia32-msvc" "12.0.10"
"@next/swc-win32-x64-msvc" "12.0.10"
nice-try@^1.0.4:
version "1.0.5"

Loading…
Cancel
Save