diff --git a/package.json b/package.json index c69bd5fe91914..8336d6bc07159 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,8 @@ "wait-port": "0.2.2", "web-streams-polyfill": "2.1.1", "webpack-bundle-analyzer": "4.3.0", - "worker-loader": "3.0.7" + "worker-loader": "3.0.7", + "@swc/core": "1.2.63" }, "resolutions": { "browserslist": "4.16.6", diff --git a/packages/next/client/dev/error-overlay/hot-dev-client.js b/packages/next/client/dev/error-overlay/hot-dev-client.js index afc67f15879eb..c2fe731ae59f3 100644 --- a/packages/next/client/dev/error-overlay/hot-dev-client.js +++ b/packages/next/client/dev/error-overlay/hot-dev-client.js @@ -26,7 +26,12 @@ // can be found here: // https://github.com/facebook/create-react-app/blob/v3.4.1/packages/react-dev-utils/webpackHotDevClient.js -import * as DevOverlay from '@next/react-dev-overlay/lib/client' +import { + register, + onBuildError, + onBuildOk, + onRefresh, +} from '@next/react-dev-overlay/lib/client' import stripAnsi from 'next/dist/compiled/strip-ansi' import { addMessageListener } from './eventsource' import formatWebpackMessages from './format-webpack-messages' @@ -43,7 +48,7 @@ import formatWebpackMessages from './format-webpack-messages' let hadRuntimeError = false let customHmrEventHandler export default function connect() { - DevOverlay.register() + register() addMessageListener((event) => { // This is the heartbeat event @@ -154,7 +159,7 @@ function handleErrors(errors) { }) // Only show the first error. - DevOverlay.onBuildError(formatted.errors[0]) + onBuildError(formatted.errors[0]) // Also log them to the console. if (typeof console !== 'undefined' && typeof console.error === 'function') { @@ -176,9 +181,9 @@ function handleErrors(errors) { let startLatency = undefined function onFastRefresh(hasUpdates) { - DevOverlay.onBuildOk() + onBuildOk() if (hasUpdates) { - DevOverlay.onRefresh() + onRefresh() } if (startLatency) { diff --git a/packages/next/client/index.tsx b/packages/next/client/index.tsx index cc2de85c03f14..c1b747b0673af 100644 --- a/packages/next/client/index.tsx +++ b/packages/next/client/index.tsx @@ -13,8 +13,11 @@ import Router, { PrivateRouteInfo, } from '../shared/lib/router/router' import { isDynamicRoute } from '../shared/lib/router/utils/is-dynamic' -import * as querystring from '../shared/lib/router/utils/querystring' -import * as envConfig from '../shared/lib/runtime-config' +import { + urlQueryToSearchParams, + assign, +} from '../shared/lib/router/utils/querystring' +import { setConfig } from '../shared/lib/runtime-config' import { getURL, loadGetInitialProps, NEXT_DATA, ST } from '../shared/lib/utils' import { Portal } from './portal' import initHeadManager from './head-manager' @@ -79,7 +82,7 @@ const prefix: string = assetPrefix || '' // So, this is how we do it in the client side at runtime __webpack_public_path__ = `${prefix}/_next/` //eslint-disable-line // Initialize next/config with the environment configuration -envConfig.setConfig({ +setConfig({ serverRuntimeConfig: {}, publicRuntimeConfig: runtimeConfig || {}, }) @@ -205,8 +208,8 @@ class Container extends React.Component<{ router.pathname + '?' + String( - querystring.assign( - querystring.urlQueryToSearchParams(router.query), + assign( + urlQueryToSearchParams(router.query), new URLSearchParams(location.search) ) ), @@ -257,7 +260,7 @@ class Container extends React.Component<{ export const emitter: MittEmitter = mitt() let CachedComponent: React.ComponentType -export default async (opts: { webpackHMR?: any } = {}) => { +export async function initNext(opts: { webpackHMR?: any } = {}) { // This makes sure this specific lines are removed in production if (process.env.NODE_ENV === 'development') { webpackHMR = opts.webpackHMR @@ -406,7 +409,7 @@ export default async (opts: { webpackHMR?: any } = {}) => { render(renderCtx) return emitter } else { - return { emitter, render, renderCtx } + return { emitter, renderCtx } } } diff --git a/packages/next/client/link.tsx b/packages/next/client/link.tsx index b5dbd607a1bde..9419739564ee8 100644 --- a/packages/next/client/link.tsx +++ b/packages/next/client/link.tsx @@ -1,4 +1,4 @@ -import React, { Children, useEffect } from 'react' +import React from 'react' import { UrlObject } from 'url' import { addBasePath, @@ -232,7 +232,7 @@ function Link(props: React.PropsWithChildren) { let child: any if (process.env.NODE_ENV === 'development') { try { - child = Children.only(children) + child = React.Children.only(children) } catch (err) { throw new Error( `Multiple children were passed to with \`href\` of \`${props.href}\` but only one child is supported https://nextjs.org/docs/messages/link-multiple-children` + @@ -242,7 +242,7 @@ function Link(props: React.PropsWithChildren) { ) } } else { - child = Children.only(children) + child = React.Children.only(children) } const childRef: any = child && typeof child === 'object' && child.ref @@ -261,7 +261,7 @@ function Link(props: React.PropsWithChildren) { }, [childRef, setIntersectionRef] ) - useEffect(() => { + React.useEffect(() => { const shouldPrefetch = isVisible && p && isLocalURL(href) const curLocale = typeof locale !== 'undefined' ? locale : router && router.locale diff --git a/packages/next/client/next-dev.js b/packages/next/client/next-dev.js index b66e1196dd77d..0fe54678b370f 100644 --- a/packages/next/client/next-dev.js +++ b/packages/next/client/next-dev.js @@ -1,12 +1,15 @@ /* globals __REPLACE_NOOP_IMPORT__ */ -import initNext, * as next from './' +import { initNext, version, router, emitter, render, renderError } from './' import EventSourcePolyfill from './dev/event-source-polyfill' import initOnDemandEntries from './dev/on-demand-entries-client' import initWebpackHMR from './dev/webpack-hot-middleware-client' import initializeBuildWatcher from './dev/dev-build-watcher' import { displayContent } from './dev/fouc' import { addMessageListener } from './dev/error-overlay/eventsource' -import * as querystring from '../shared/lib/router/utils/querystring' +import { + assign, + urlQueryToSearchParams, +} from '../shared/lib/router/utils/querystring' // Temporary workaround for the issue described here: // https://github.com/vercel/next.js/issues/3775#issuecomment-407438123 @@ -27,9 +30,18 @@ const { const prefix = assetPrefix || '' const webpackHMR = initWebpackHMR() -window.next = next +window.next = { + version, + // router is initialized later so it has to be live-binded + get router() { + return router + }, + emitter, + render, + renderError, +} initNext({ webpackHMR }) - .then(({ renderCtx, render }) => { + .then(({ renderCtx }) => { initOnDemandEntries({ assetPrefix: prefix }) let buildIndicatorHandler = () => {} @@ -46,7 +58,6 @@ initNext({ webpackHMR }) }) } else if (event.data.indexOf('serverOnlyChanges') !== -1) { const { pages } = JSON.parse(event.data) - const router = window.next.router if (!router.clc && pages.includes(router.pathname)) { console.log('Refreshing page data due to server-side change') @@ -60,8 +71,8 @@ initNext({ webpackHMR }) router.pathname + '?' + String( - querystring.assign( - querystring.urlQueryToSearchParams(router.query), + assign( + urlQueryToSearchParams(router.query), new URLSearchParams(location.search) ) ), diff --git a/packages/next/client/next.js b/packages/next/client/next.js index 98d0292271530..8a0f8bad9e4a9 100644 --- a/packages/next/client/next.js +++ b/packages/next/client/next.js @@ -1,5 +1,14 @@ -import initNext, * as next from './' +import { initNext, version, router, emitter, render, renderError } from './' -window.next = next +window.next = { + version, + // router is initialized later so it has to be live-binded + get router() { + return router + }, + emitter, + render, + renderError, +} initNext().catch(console.error) diff --git a/packages/next/client/page-loader.ts b/packages/next/client/page-loader.ts index e7958e228dd3d..3fd86b6e2c7aa 100644 --- a/packages/next/client/page-loader.ts +++ b/packages/next/client/page-loader.ts @@ -9,7 +9,8 @@ import getAssetPathFromRoute from '../shared/lib/router/utils/get-asset-path-fro import { isDynamicRoute } from '../shared/lib/router/utils/is-dynamic' import { parseRelativeUrl } from '../shared/lib/router/utils/parse-relative-url' import { removePathTrailingSlash } from './normalize-trailing-slash' -import createRouteLoader, { +import { + createRouteLoader, getClientBuildManifest, RouteLoader, } from './route-loader' diff --git a/packages/next/client/portal/index.tsx b/packages/next/client/portal/index.tsx index ff5a0d9896cfe..7e38a485f46be 100644 --- a/packages/next/client/portal/index.tsx +++ b/packages/next/client/portal/index.tsx @@ -1,4 +1,4 @@ -import * as React from 'react' +import React from 'react' import { createPortal } from 'react-dom' type PortalProps = { diff --git a/packages/next/client/route-announcer.tsx b/packages/next/client/route-announcer.tsx index 538e7fb4a2f64..a778fe5dac448 100644 --- a/packages/next/client/route-announcer.tsx +++ b/packages/next/client/route-announcer.tsx @@ -1,18 +1,18 @@ -import React, { useEffect, useState, useRef } from 'react' +import React from 'react' import { useRouter } from './router' export function RouteAnnouncer() { const { asPath } = useRouter() - const [routeAnnouncement, setRouteAnnouncement] = useState('') + const [routeAnnouncement, setRouteAnnouncement] = React.useState('') // Only announce the path change, but not for the first load because screen reader will do that automatically. - const initialPathLoaded = useRef(false) + const initialPathLoaded = React.useRef(false) // Every time the path changes, announce the route change. The announcement will be prioritized by h1, then title // (from metadata), and finally if those don't exist, then the pathName that is in the URL. This methodology is // inspired by Marcy Sutton's accessible client routing user testing. More information can be found here: // https://www.gatsbyjs.com/blog/2019-07-11-user-testing-accessible-client-routing/ - useEffect( + React.useEffect( () => { if (!initialPathLoaded.current) { initialPathLoaded.current = true diff --git a/packages/next/client/route-loader.ts b/packages/next/client/route-loader.ts index 31cec8c536547..312d56bcf13cd 100644 --- a/packages/next/client/route-loader.ts +++ b/packages/next/client/route-loader.ts @@ -285,7 +285,7 @@ function getFilesForRoute( }) } -function createRouteLoader(assetPrefix: string): RouteLoader { +export function createRouteLoader(assetPrefix: string): RouteLoader { const entrypoints: Map< string, Future | RouteEntrypoint @@ -423,5 +423,3 @@ function createRouteLoader(assetPrefix: string): RouteLoader { }, } } - -export default createRouteLoader diff --git a/packages/next/client/router.ts b/packages/next/client/router.ts index 0e7a6d0acf07f..16d618bfaf8bc 100644 --- a/packages/next/client/router.ts +++ b/packages/next/client/router.ts @@ -1,6 +1,7 @@ /* global window */ import React from 'react' -import Router, { NextRouter } from '../shared/lib/router/router' +import Router from '../shared/lib/router/router' +import type { NextRouter } from '../shared/lib/router/router' import { RouterContext } from '../shared/lib/router-context' type ClassArguments = T extends new (...args: infer U) => any ? U : any @@ -13,7 +14,9 @@ type SingletonRouterBase = { ready(cb: () => any): void } -export { Router, NextRouter } +export { Router } + +export type { NextRouter } export type SingletonRouter = SingletonRouterBase & NextRouter diff --git a/packages/next/package.json b/packages/next/package.json index d056d48a6368d..ba63a6984e991 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -59,7 +59,7 @@ "requires": [ "./taskfile-ncc.js", "./taskfile-babel.js", - "./taskfile-typescript.js" + "./taskfile-swc.js" ] }, "dependencies": { diff --git a/packages/next/server/next.ts b/packages/next/server/next.ts index 05099837d28ad..b9b0808e4c108 100644 --- a/packages/next/server/next.ts +++ b/packages/next/server/next.ts @@ -112,7 +112,8 @@ export class NextServer { const DevServer = require('./dev/next-dev-server').default return new DevServer(options) } - return new (await getServerImpl())(options) + const ServerImplementation = await getServerImpl() + return new ServerImplementation(options) } private async loadConfig() { diff --git a/packages/next/taskfile-babel.js b/packages/next/taskfile-babel.js index 47f7dd730d631..ad3e466ef62de 100644 --- a/packages/next/taskfile-babel.js +++ b/packages/next/taskfile-babel.js @@ -18,6 +18,7 @@ const babelClientPresetEnvOptions = { 'transform-typeof-symbol', 'transform-async-to-generator', 'transform-spread', + 'proposal-object-rest-spread', 'proposal-dynamic-import', ], } @@ -33,6 +34,15 @@ const babelClientOpts = { // eslint-disable-next-line no-useless-concat '@babel/plugin-syntax-dynamic-impor' + 't', ['@babel/plugin-proposal-class-properties', { loose: true }], + [ + '@babel/plugin-transform-runtime', + { + corejs: false, + helpers: true, + regenerator: false, + useESModules: false, + }, + ], ], overrides: [ { @@ -90,21 +100,6 @@ module.exports = function (task) { const options = { ...babelOpts, - plugins: [ - ...babelOpts.plugins, - // pages dir doesn't need core-js - serverOrClient === 'client' - ? [ - '@babel/plugin-transform-runtime', - { - corejs: false, - helpers: true, - regenerator: false, - useESModules: false, - }, - ] - : false, - ].filter(Boolean), compact: !dev, babelrc: false, configFile: false, diff --git a/packages/next/taskfile-swc.js b/packages/next/taskfile-swc.js new file mode 100644 index 0000000000000..8de10cea0e673 --- /dev/null +++ b/packages/next/taskfile-swc.js @@ -0,0 +1,91 @@ +// taskr babel plugin with Babel 7 support +// https://github.com/lukeed/taskr/pull/305 + +const path = require('path') + +// eslint-disable-next-line import/no-extraneous-dependencies +const transform = require('@swc/core').transform + +module.exports = function (task) { + // eslint-disable-next-line require-yield + task.plugin('swc', {}, function* ( + file, + serverOrClient, + { stripExtension, dev } = {} + ) { + // Don't compile .d.ts + if (file.base.endsWith('.d.ts')) return + + const options = { + filename: path.join(file.dir, file.base), + sourceMaps: true, + + module: { + type: 'commonjs', + }, + env: { + targets: { + node: '12.0.0', + }, + }, + jsc: { + loose: true, + + parser: { + syntax: 'typescript', + dynamicImport: true, + tsx: file.base.endsWith('.tsx'), + }, + transform: { + react: { + pragma: 'React.createElement', + pragmaFrag: 'React.Fragment', + throwIfNamespace: true, + development: false, + useBuiltins: true, + }, + }, + }, + } + + const output = yield transform(file.data.toString('utf-8'), options) + const ext = path.extname(file.base) + + // Replace `.ts|.tsx` with `.js` in files with an extension + if (ext) { + const extRegex = new RegExp(ext.replace('.', '\\.') + '$', 'i') + // Remove the extension if stripExtension is enabled or replace it with `.js` + file.base = file.base.replace(extRegex, stripExtension ? '' : '.js') + } + + // Workaround for noop.js loading + if (file.base === 'next-dev.js') { + output.code = output.code.replace( + /__REPLACE_NOOP_IMPORT__/g, + `import('./dev/noop');` + ) + } + + if (output.map) { + const map = `${file.base}.map` + + output.code += Buffer.from(`\n//# sourceMappingURL=${map}`) + + // add sourcemap to `files` array + this._.files.push({ + base: map, + dir: file.dir, + data: Buffer.from(output.map), + }) + } + + file.data = Buffer.from(setNextVersion(output.code)) + }) +} + +function setNextVersion(code) { + return code.replace( + /process\.env\.__NEXT_VERSION/g, + `"${require('./package.json').version}"` + ) +} diff --git a/packages/next/taskfile.js b/packages/next/taskfile.js index 48a67e839a3af..1af3d46699ef2 100644 --- a/packages/next/taskfile.js +++ b/packages/next/taskfile.js @@ -821,15 +821,15 @@ export async function compile(task, opts) { export async function bin(task, opts) { await task .source(opts.src || 'bin/*') - .babel('server', { stripExtension: true, dev: opts.dev }) + .swc('server', { stripExtension: true, dev: opts.dev }) .target('dist/bin', { mode: '0755' }) notify('Compiled binaries') } export async function cli(task, opts) { await task - .source(opts.src || 'cli/**/*.+(js|ts|tsx)') - .babel('server', { dev: opts.dev }) + .source('cli/**/*.+(js|ts|tsx)') + .swc('server', { dev: opts.dev }) .target('dist/cli') notify('Compiled cli files') } @@ -837,7 +837,7 @@ export async function cli(task, opts) { export async function lib(task, opts) { await task .source(opts.src || 'lib/**/*.+(js|ts|tsx)') - .babel('server', { dev: opts.dev }) + .swc('server', { dev: opts.dev }) .target('dist/lib') notify('Compiled lib files') } @@ -845,7 +845,7 @@ export async function lib(task, opts) { export async function server(task, opts) { await task .source(opts.src || 'server/**/*.+(js|ts|tsx)') - .babel('server', { dev: opts.dev }) + .swc('server', { dev: opts.dev }) .target('dist/server') notify('Compiled server files') } @@ -853,7 +853,7 @@ export async function server(task, opts) { export async function nextbuild(task, opts) { await task .source(opts.src || 'build/**/*.+(js|ts|tsx)') - .babel('server', { dev: opts.dev }) + .swc('server', { dev: opts.dev }) .target('dist/build') notify('Compiled build files') } @@ -870,7 +870,7 @@ export async function client(task, opts) { export async function nextbuildstatic(task, opts) { await task .source(opts.src || 'export/**/*.+(js|ts|tsx)') - .babel('server', { dev: opts.dev }) + .swc('server', { dev: opts.dev }) .target('dist/export') notify('Compiled export files') } @@ -892,7 +892,7 @@ export async function pages_error(task, opts) { export async function pages_document(task, opts) { await task .source('pages/_document.tsx') - .babel('server', { dev: opts.dev }) + .swc('server', { dev: opts.dev }) .target('dist/pages') } @@ -903,7 +903,7 @@ export async function pages(task, opts) { export async function telemetry(task, opts) { await task .source(opts.src || 'telemetry/**/*.+(js|ts|tsx)') - .babel('server', { dev: opts.dev }) + .swc('server', { dev: opts.dev }) .target('dist/telemetry') notify('Compiled telemetry files') } @@ -932,7 +932,7 @@ export default async function (task) { export async function shared(task, opts) { await task .source(opts.src || 'shared/**/*.+(js|ts|tsx)') - .babel('server', { dev: opts.dev }) + .swc('server', { dev: opts.dev }) .target('dist/shared') notify('Compiled shared files') } diff --git a/yarn.lock b/yarn.lock index 13a56d302939a..52545ecadeef5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3238,6 +3238,19 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@napi-rs/triples@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@napi-rs/triples/-/triples-1.0.2.tgz#2ce4c6a78568358772008f564ee5009093d20a19" + integrity sha512-EL3SiX43m9poFSnhDx4d4fn9SSaqyO2rHsCNhETi9bWPmjXK3uPJ0QpPFtx39FEdHcz1vJmsiW41kqc0AgvtzQ== + +"@node-rs/helper@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@node-rs/helper/-/helper-1.2.0.tgz#c72c9f04527ee5d65700ac4842e3ea21ad0714c1" + integrity sha512-pzIFIS0POyqWVqdcF0NQO2DjnO1IeI1UN/hENCZMW3o/ndEpTmZLRVhoXGSHjjzoQaEuHwzj79BnYUXI3syv8w== + dependencies: + "@napi-rs/triples" "^1.0.2" + tslib "^2.2.0" + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -3683,6 +3696,86 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" +"@swc/core-android-arm64@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.2.63.tgz#e12ce194dc4066c8361975eb7d22141c44d94804" + integrity sha512-3Q43hlq4C2EX1jcFex0OsFNjT742fYgnPfNnWDtSeOXZz5D2e1pIpjSXfZZtOE3ZIvXlIAb1d99yw8fBQ5uSpA== + +"@swc/core-darwin-arm64@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.63.tgz#039517ec2912a797d6c9848e666be12b1bc6436a" + integrity sha512-6wN8Ur65ugCIZJiHOPav73IyPTUxmn/+7MqSwx0jB+80dp8PqEdj32AQOMtvvj/Ts1lXg023CLC7kXDsbOYYjw== + +"@swc/core-darwin-x64@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.2.63.tgz#714032a38ac9db93500ea7ce4146797306cb8b7f" + integrity sha512-xGSPmOMU28U0t9rNHilaD3nN9xoP772lUhtM9U8By4tKk4ZJcjMjL79XtoMflbKP3HhYU+qeyTnsDG3STaCYwg== + +"@swc/core-freebsd-x64@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.63.tgz#78fa85e579dec9f3a215664f69d13513d709ab85" + integrity sha512-gil07mAooVket0GmjuCHrpLjxmxaMFpKRLWHMKWZ1uwK6o9IC8b7c9II60O/5kbjFnhX1KMx078N4oZphhydjQ== + +"@swc/core-linux-arm-gnueabihf@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.63.tgz#ccb23cf705030a987eaf66a650c0432f596ec0f3" + integrity sha512-KgpIKQRxLQoXgzafx0t+HKuz9sF6D51eboFEvGkqyXCSuybu6mD+BIU2A25fHiS3LJrFCmKAkJjTvffzFN1Olw== + +"@swc/core-linux-arm64-gnu@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.63.tgz#cc02d39d87f04503e0a28a4f2273b1c746d5b3e3" + integrity sha512-dHVNAiQaQw/6ysUgQttsg0+3ElN6Puv9TboNH+FudJoNYecmZjfiPIZQi8S2VxzrUqpcg/jOWSsnUOTaDx7GlQ== + +"@swc/core-linux-arm64-musl@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.63.tgz#54c3c51addc31bdb4d72cf55882c649a89fd7869" + integrity sha512-ZfOKCZi/HvhVfus52QLVUT4ckSEnYKoMx7IKvHj4Vqij59JzeU3XscsD0Pkx8DJKzs5ZJikukFJqOuexryLZfw== + +"@swc/core-linux-x64-gnu@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.63.tgz#4031b2d49f8df146187a494ebc93c0cc60aba2f1" + integrity sha512-ht+UTpMDo8lGJHatA/YkQwkR6lbqv11GbKaGu76vG1g8lPmppDeQtdA7UL659LdrbfHxCKm8FT9pEgPR837fxQ== + +"@swc/core-linux-x64-musl@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.63.tgz#b83b5708a458efaaecfda1bc9ad80f9b1374f08d" + integrity sha512-bQXjfJ0z1aBgfrNtNFbPxmjCYbVOdDthcR19L6rwMo4g0M91YYUSpA7xQ4P6pT/m8y1rsau87t9ZoE/C5I3qxA== + +"@swc/core-win32-arm64-msvc@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.63.tgz#27040f38f460375b165a35fe9b575f4102d72c35" + integrity sha512-hjXBDYxlDqI8ybRQnJSlWiDUOtRc7FJw0ypkfb54NfGagzBubxzXUrVfZJcG6wLmR5ub0fINb2aX/7F86e2UMg== + +"@swc/core-win32-ia32-msvc@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.63.tgz#97a6edf5a5575373eacf93d6c190ec7358cc52b4" + integrity sha512-++QMBZQ4N12DkMie6YPRWENnxgsR3oosGWnMb/lwGhuYk82YCeOBjoItgqrGxL4KBq7y3+uR135OPf7r2sCJcA== + +"@swc/core-win32-x64-msvc@^1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.63.tgz#d60ab22bfbf7a612c26d782ba583b852fa735884" + integrity sha512-SzpMh2c47BPSTuWWtiJhiCHrmHWEubMbmf1MWW8eVnK+oDZJuk86LYxuLRm0vHZellgX9UehSMfc0uzJTwvb5w== + +"@swc/core@1.2.63": + version "1.2.63" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.2.63.tgz#399dbbc2ffe6d16d21926439ee83dfa3719be372" + integrity sha512-jjpYsgPHBcAa9rAxEDRPlRxoXlVfhCopDvScyJeFutF1EE+q4ZVc4Qj4bSRRRMGZIPrznpFX7+zFDP46QfgCnQ== + dependencies: + "@node-rs/helper" "^1.0.0" + optionalDependencies: + "@swc/core-android-arm64" "^1.2.63" + "@swc/core-darwin-arm64" "^1.2.63" + "@swc/core-darwin-x64" "^1.2.63" + "@swc/core-freebsd-x64" "^1.2.63" + "@swc/core-linux-arm-gnueabihf" "^1.2.63" + "@swc/core-linux-arm64-gnu" "^1.2.63" + "@swc/core-linux-arm64-musl" "^1.2.63" + "@swc/core-linux-x64-gnu" "^1.2.63" + "@swc/core-linux-x64-musl" "^1.2.63" + "@swc/core-win32-arm64-msvc" "^1.2.63" + "@swc/core-win32-ia32-msvc" "^1.2.63" + "@swc/core-win32-x64-msvc" "^1.2.63" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"