You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			930 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			930 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			JavaScript
		
	
| /* eslint-disable @typescript-eslint/no-use-before-define */ "use strict";
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|     value: true
 | |
| });
 | |
| 0 && (module.exports = {
 | |
|     getSupportedArchTriples: null,
 | |
|     lockfilePatchPromise: null,
 | |
|     loadBindings: null,
 | |
|     createDefineEnv: null,
 | |
|     isWasm: null,
 | |
|     transform: null,
 | |
|     transformSync: null,
 | |
|     minify: null,
 | |
|     minifySync: null,
 | |
|     parse: null,
 | |
|     getBinaryMetadata: null,
 | |
|     initCustomTraceSubscriber: null,
 | |
|     initHeapProfiler: null,
 | |
|     teardownHeapProfiler: null,
 | |
|     teardownTraceSubscriber: null
 | |
| });
 | |
| function _export(target, all) {
 | |
|     for(var name in all)Object.defineProperty(target, name, {
 | |
|         enumerable: true,
 | |
|         get: all[name]
 | |
|     });
 | |
| }
 | |
| _export(exports, {
 | |
|     getSupportedArchTriples: function() {
 | |
|         return getSupportedArchTriples;
 | |
|     },
 | |
|     lockfilePatchPromise: function() {
 | |
|         return lockfilePatchPromise;
 | |
|     },
 | |
|     loadBindings: function() {
 | |
|         return loadBindings;
 | |
|     },
 | |
|     createDefineEnv: function() {
 | |
|         return createDefineEnv;
 | |
|     },
 | |
|     isWasm: function() {
 | |
|         return isWasm;
 | |
|     },
 | |
|     transform: function() {
 | |
|         return transform;
 | |
|     },
 | |
|     transformSync: function() {
 | |
|         return transformSync;
 | |
|     },
 | |
|     minify: function() {
 | |
|         return minify;
 | |
|     },
 | |
|     minifySync: function() {
 | |
|         return minifySync;
 | |
|     },
 | |
|     parse: function() {
 | |
|         return parse;
 | |
|     },
 | |
|     getBinaryMetadata: function() {
 | |
|         return getBinaryMetadata;
 | |
|     },
 | |
|     initCustomTraceSubscriber: function() {
 | |
|         return initCustomTraceSubscriber;
 | |
|     },
 | |
|     initHeapProfiler: function() {
 | |
|         return initHeapProfiler;
 | |
|     },
 | |
|     teardownHeapProfiler: function() {
 | |
|         return teardownHeapProfiler;
 | |
|     },
 | |
|     teardownTraceSubscriber: function() {
 | |
|         return teardownTraceSubscriber;
 | |
|     }
 | |
| });
 | |
| const _path = /*#__PURE__*/ _interop_require_default(require("path"));
 | |
| const _url = require("url");
 | |
| const _os = require("os");
 | |
| const _triples = require("next/dist/compiled/@napi-rs/triples");
 | |
| const _log = /*#__PURE__*/ _interop_require_wildcard(require("../output/log"));
 | |
| const _options = require("./options");
 | |
| const _swcloadfailure = require("../../telemetry/events/swc-load-failure");
 | |
| const _patchincorrectlockfile = require("../../lib/patch-incorrect-lockfile");
 | |
| const _downloadswc = require("../../lib/download-swc");
 | |
| const _util = require("util");
 | |
| const _defineenvplugin = require("../webpack/plugins/define-env-plugin");
 | |
| function _interop_require_default(obj) {
 | |
|     return obj && obj.__esModule ? obj : {
 | |
|         default: obj
 | |
|     };
 | |
| }
 | |
| function _getRequireWildcardCache(nodeInterop) {
 | |
|     if (typeof WeakMap !== "function") return null;
 | |
|     var cacheBabelInterop = new WeakMap();
 | |
|     var cacheNodeInterop = new WeakMap();
 | |
|     return (_getRequireWildcardCache = function(nodeInterop) {
 | |
|         return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
 | |
|     })(nodeInterop);
 | |
| }
 | |
| function _interop_require_wildcard(obj, nodeInterop) {
 | |
|     if (!nodeInterop && obj && obj.__esModule) {
 | |
|         return obj;
 | |
|     }
 | |
|     if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
 | |
|         return {
 | |
|             default: obj
 | |
|         };
 | |
|     }
 | |
|     var cache = _getRequireWildcardCache(nodeInterop);
 | |
|     if (cache && cache.has(obj)) {
 | |
|         return cache.get(obj);
 | |
|     }
 | |
|     var newObj = {};
 | |
|     var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
 | |
|     for(var key in obj){
 | |
|         if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
 | |
|             var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
 | |
|             if (desc && (desc.get || desc.set)) {
 | |
|                 Object.defineProperty(newObj, key, desc);
 | |
|             } else {
 | |
|                 newObj[key] = obj[key];
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     newObj.default = obj;
 | |
|     if (cache) {
 | |
|         cache.set(obj, newObj);
 | |
|     }
 | |
|     return newObj;
 | |
| }
 | |
| const nextVersion = "14.1.1";
 | |
| const ArchName = (0, _os.arch)();
 | |
| const PlatformName = (0, _os.platform)();
 | |
| const infoLog = (...args)=>{
 | |
|     if (process.env.NEXT_PRIVATE_BUILD_WORKER) {
 | |
|         return;
 | |
|     }
 | |
|     if (process.env.DEBUG) {
 | |
|         _log.info(...args);
 | |
|     }
 | |
| };
 | |
| const getSupportedArchTriples = ()=>{
 | |
|     const { darwin, win32, linux, freebsd, android } = _triples.platformArchTriples;
 | |
|     return {
 | |
|         darwin,
 | |
|         win32: {
 | |
|             arm64: win32.arm64,
 | |
|             ia32: win32.ia32.filter((triple)=>triple.abi === "msvc"),
 | |
|             x64: win32.x64.filter((triple)=>triple.abi === "msvc")
 | |
|         },
 | |
|         linux: {
 | |
|             // linux[x64] includes `gnux32` abi, with x64 arch.
 | |
|             x64: linux.x64.filter((triple)=>triple.abi !== "gnux32"),
 | |
|             arm64: linux.arm64,
 | |
|             // This target is being deprecated, however we keep it in `knownDefaultWasmFallbackTriples` for now
 | |
|             arm: linux.arm
 | |
|         },
 | |
|         // Below targets are being deprecated, however we keep it in `knownDefaultWasmFallbackTriples` for now
 | |
|         freebsd: {
 | |
|             x64: freebsd.x64
 | |
|         },
 | |
|         android: {
 | |
|             arm64: android.arm64,
 | |
|             arm: android.arm
 | |
|         }
 | |
|     };
 | |
| };
 | |
| const triples = (()=>{
 | |
|     var _supportedArchTriples_PlatformName, _platformArchTriples_PlatformName;
 | |
|     const supportedArchTriples = getSupportedArchTriples();
 | |
|     const targetTriple = (_supportedArchTriples_PlatformName = supportedArchTriples[PlatformName]) == null ? void 0 : _supportedArchTriples_PlatformName[ArchName];
 | |
|     // If we have supported triple, return it right away
 | |
|     if (targetTriple) {
 | |
|         return targetTriple;
 | |
|     }
 | |
|     // If there isn't corresponding target triple in `supportedArchTriples`, check if it's excluded from original raw triples
 | |
|     // Otherwise, it is completely unsupported platforms.
 | |
|     let rawTargetTriple = (_platformArchTriples_PlatformName = _triples.platformArchTriples[PlatformName]) == null ? void 0 : _platformArchTriples_PlatformName[ArchName];
 | |
|     if (rawTargetTriple) {
 | |
|         _log.warn(`Trying to load next-swc for target triple ${rawTargetTriple}, but there next-swc does not have native bindings support`);
 | |
|     } else {
 | |
|         _log.warn(`Trying to load next-swc for unsupported platforms ${PlatformName}/${ArchName}`);
 | |
|     }
 | |
|     return [];
 | |
| })();
 | |
| // Allow to specify an absolute path to the custom turbopack binary to load.
 | |
| // If one of env variables is set, `loadNative` will try to use any turbo-* interfaces from specified
 | |
| // binary instead. This will not affect existing swc's transform, or other interfaces. This is thin,
 | |
| // naive interface - `loadBindings` will not validate neither path nor the binary.
 | |
| //
 | |
| // Note these are internal flag: there's no stability, feature guarantee.
 | |
| const __INTERNAL_CUSTOM_TURBOPACK_BINDINGS = process.env.__INTERNAL_CUSTOM_TURBOPACK_BINDINGS;
 | |
| function checkVersionMismatch(pkgData) {
 | |
|     const version = pkgData.version;
 | |
|     if (version && version !== nextVersion) {
 | |
|         _log.warn(`Mismatching @next/swc version, detected: ${version} while Next.js is on ${nextVersion}. Please ensure these match`);
 | |
|     }
 | |
| }
 | |
| // These are the platforms we'll try to load wasm bindings first,
 | |
| // only try to load native bindings if loading wasm binding somehow fails.
 | |
| // Fallback to native binding is for migration period only,
 | |
| // once we can verify loading-wasm-first won't cause visible regressions,
 | |
| // we'll not include native bindings for these platform at all.
 | |
| const knownDefaultWasmFallbackTriples = [
 | |
|     "x86_64-unknown-freebsd",
 | |
|     "aarch64-linux-android",
 | |
|     "arm-linux-androideabi",
 | |
|     "armv7-unknown-linux-gnueabihf",
 | |
|     "i686-pc-windows-msvc"
 | |
| ];
 | |
| // The last attempt's error code returned when cjs require to native bindings fails.
 | |
| // If node.js throws an error without error code, this should be `unknown` instead of undefined.
 | |
| // For the wasm-first targets (`knownDefaultWasmFallbackTriples`) this will be `unsupported_target`.
 | |
| let lastNativeBindingsLoadErrorCode = undefined;
 | |
| let nativeBindings;
 | |
| let wasmBindings;
 | |
| let downloadWasmPromise;
 | |
| let pendingBindings;
 | |
| let swcTraceFlushGuard;
 | |
| let swcHeapProfilerFlushGuard;
 | |
| let downloadNativeBindingsPromise = undefined;
 | |
| const lockfilePatchPromise = {};
 | |
| async function loadBindings(useWasmBinary = false) {
 | |
|     if (pendingBindings) {
 | |
|         return pendingBindings;
 | |
|     }
 | |
|     // rust needs stdout to be blocking, otherwise it will throw an error (on macOS at least) when writing a lot of data (logs) to it
 | |
|     // see https://github.com/napi-rs/napi-rs/issues/1630
 | |
|     // and https://github.com/nodejs/node/blob/main/doc/api/process.md#a-note-on-process-io
 | |
|     if (process.stdout._handle != null) {
 | |
|         // @ts-ignore
 | |
|         process.stdout._handle.setBlocking(true);
 | |
|     }
 | |
|     if (process.stderr._handle != null) {
 | |
|         // @ts-ignore
 | |
|         process.stderr._handle.setBlocking(true);
 | |
|     }
 | |
|     pendingBindings = new Promise(async (resolve, _reject)=>{
 | |
|         if (!lockfilePatchPromise.cur) {
 | |
|             // always run lockfile check once so that it gets patched
 | |
|             // even if it doesn't fail to load locally
 | |
|             lockfilePatchPromise.cur = (0, _patchincorrectlockfile.patchIncorrectLockfile)(process.cwd()).catch(console.error);
 | |
|         }
 | |
|         let attempts = [];
 | |
|         const disableWasmFallback = process.env.NEXT_DISABLE_SWC_WASM;
 | |
|         const unsupportedPlatform = triples.some((triple)=>!!(triple == null ? void 0 : triple.raw) && knownDefaultWasmFallbackTriples.includes(triple.raw));
 | |
|         const isWebContainer = process.versions.webcontainer;
 | |
|         const shouldLoadWasmFallbackFirst = !disableWasmFallback && unsupportedPlatform && useWasmBinary || isWebContainer;
 | |
|         if (!unsupportedPlatform && useWasmBinary) {
 | |
|             _log.warn(`experimental.useWasmBinary is not an option for supported platform ${PlatformName}/${ArchName} and will be ignored.`);
 | |
|         }
 | |
|         if (shouldLoadWasmFallbackFirst) {
 | |
|             lastNativeBindingsLoadErrorCode = "unsupported_target";
 | |
|             const fallbackBindings = await tryLoadWasmWithFallback(attempts);
 | |
|             if (fallbackBindings) {
 | |
|                 return resolve(fallbackBindings);
 | |
|             }
 | |
|         }
 | |
|         // Trickle down loading `fallback` bindings:
 | |
|         //
 | |
|         // - First, try to load native bindings installed in node_modules.
 | |
|         // - If that fails with `ERR_MODULE_NOT_FOUND`, treat it as case of https://github.com/npm/cli/issues/4828
 | |
|         // that host system where generated package lock is not matching to the guest system running on, try to manually
 | |
|         // download corresponding target triple and load it. This won't be triggered if native bindings are failed to load
 | |
|         // with other reasons than `ERR_MODULE_NOT_FOUND`.
 | |
|         // - Lastly, falls back to wasm binding where possible.
 | |
|         try {
 | |
|             return resolve(loadNative());
 | |
|         } catch (a) {
 | |
|             if (Array.isArray(a) && a.every((m)=>m.includes("it was not installed"))) {
 | |
|                 let fallbackBindings = await tryLoadNativeWithFallback(attempts);
 | |
|                 if (fallbackBindings) {
 | |
|                     return resolve(fallbackBindings);
 | |
|                 }
 | |
|             }
 | |
|             attempts = attempts.concat(a);
 | |
|         }
 | |
|         logLoadFailure(attempts, true);
 | |
|     });
 | |
|     return pendingBindings;
 | |
| }
 | |
| async function tryLoadNativeWithFallback(attempts) {
 | |
|     const nativeBindingsDirectory = _path.default.join(_path.default.dirname(require.resolve("next/package.json")), "next-swc-fallback");
 | |
|     if (!downloadNativeBindingsPromise) {
 | |
|         downloadNativeBindingsPromise = (0, _downloadswc.downloadNativeNextSwc)(nextVersion, nativeBindingsDirectory, triples.map((triple)=>triple.platformArchABI));
 | |
|     }
 | |
|     await downloadNativeBindingsPromise;
 | |
|     try {
 | |
|         let bindings = loadNative(nativeBindingsDirectory);
 | |
|         return bindings;
 | |
|     } catch (a) {
 | |
|         attempts.concat(a);
 | |
|     }
 | |
|     return undefined;
 | |
| }
 | |
| async function tryLoadWasmWithFallback(attempts) {
 | |
|     try {
 | |
|         let bindings = await loadWasm("");
 | |
|         // @ts-expect-error TODO: this event has a wrong type.
 | |
|         (0, _swcloadfailure.eventSwcLoadFailure)({
 | |
|             wasm: "enabled",
 | |
|             nativeBindingsErrorCode: lastNativeBindingsLoadErrorCode
 | |
|         });
 | |
|         return bindings;
 | |
|     } catch (a) {
 | |
|         attempts = attempts.concat(a);
 | |
|     }
 | |
|     try {
 | |
|         // if not installed already download wasm package on-demand
 | |
|         // we download to a custom directory instead of to node_modules
 | |
|         // as node_module import attempts are cached and can't be re-attempted
 | |
|         // x-ref: https://github.com/nodejs/modules/issues/307
 | |
|         const wasmDirectory = _path.default.join(_path.default.dirname(require.resolve("next/package.json")), "wasm");
 | |
|         if (!downloadWasmPromise) {
 | |
|             downloadWasmPromise = (0, _downloadswc.downloadWasmSwc)(nextVersion, wasmDirectory);
 | |
|         }
 | |
|         await downloadWasmPromise;
 | |
|         let bindings = await loadWasm((0, _url.pathToFileURL)(wasmDirectory).href);
 | |
|         // @ts-expect-error TODO: this event has a wrong type.
 | |
|         (0, _swcloadfailure.eventSwcLoadFailure)({
 | |
|             wasm: "fallback",
 | |
|             nativeBindingsErrorCode: lastNativeBindingsLoadErrorCode
 | |
|         });
 | |
|         // still log native load attempts so user is
 | |
|         // aware it failed and should be fixed
 | |
|         for (const attempt of attempts){
 | |
|             _log.warn(attempt);
 | |
|         }
 | |
|         return bindings;
 | |
|     } catch (a) {
 | |
|         attempts = attempts.concat(a);
 | |
|     }
 | |
| }
 | |
| function loadBindingsSync() {
 | |
|     let attempts = [];
 | |
|     try {
 | |
|         return loadNative();
 | |
|     } catch (a) {
 | |
|         attempts = attempts.concat(a);
 | |
|     }
 | |
|     // we can leverage the wasm bindings if they are already
 | |
|     // loaded
 | |
|     if (wasmBindings) {
 | |
|         return wasmBindings;
 | |
|     }
 | |
|     logLoadFailure(attempts);
 | |
| }
 | |
| let loggingLoadFailure = false;
 | |
| function logLoadFailure(attempts, triedWasm = false) {
 | |
|     // make sure we only emit the event and log the failure once
 | |
|     if (loggingLoadFailure) return;
 | |
|     loggingLoadFailure = true;
 | |
|     for (let attempt of attempts){
 | |
|         _log.warn(attempt);
 | |
|     }
 | |
|     // @ts-expect-error TODO: this event has a wrong type.
 | |
|     (0, _swcloadfailure.eventSwcLoadFailure)({
 | |
|         wasm: triedWasm ? "failed" : undefined,
 | |
|         nativeBindingsErrorCode: lastNativeBindingsLoadErrorCode
 | |
|     }).then(()=>lockfilePatchPromise.cur || Promise.resolve()).finally(()=>{
 | |
|         _log.error(`Failed to load SWC binary for ${PlatformName}/${ArchName}, see more info here: https://nextjs.org/docs/messages/failed-loading-swc`);
 | |
|         process.exit(1);
 | |
|     });
 | |
| }
 | |
| function createDefineEnv({ isTurbopack, allowedRevalidateHeaderKeys, clientRouterFilters, config, dev, distDir, fetchCacheKeyPrefix, hasRewrites, middlewareMatchers, previewModeId }) {
 | |
|     let defineEnv = {
 | |
|         client: [],
 | |
|         edge: [],
 | |
|         nodejs: []
 | |
|     };
 | |
|     for (const variant of Object.keys(defineEnv)){
 | |
|         defineEnv[variant] = rustifyEnv((0, _defineenvplugin.getDefineEnv)({
 | |
|             isTurbopack,
 | |
|             allowedRevalidateHeaderKeys,
 | |
|             clientRouterFilters,
 | |
|             config,
 | |
|             dev,
 | |
|             distDir,
 | |
|             fetchCacheKeyPrefix,
 | |
|             hasRewrites,
 | |
|             isClient: variant === "client",
 | |
|             isEdgeServer: variant === "edge",
 | |
|             isNodeOrEdgeCompilation: variant === "nodejs" || variant === "edge",
 | |
|             isNodeServer: variant === "nodejs",
 | |
|             middlewareMatchers,
 | |
|             previewModeId
 | |
|         }));
 | |
|     }
 | |
|     return defineEnv;
 | |
| }
 | |
| function rustifyEnv(env) {
 | |
|     return Object.entries(env).filter(([_, value])=>value != null).map(([name, value])=>({
 | |
|             name,
 | |
|             value
 | |
|         }));
 | |
| }
 | |
| // TODO(sokra) Support wasm option.
 | |
| function bindingToApi(binding, _wasm) {
 | |
|     const cancel = new class Cancel extends Error {
 | |
|     }();
 | |
|     /**
 | |
|    * Utility function to ensure all variants of an enum are handled.
 | |
|    */ function invariant(never, computeMessage) {
 | |
|         throw new Error(`Invariant: ${computeMessage(never)}`);
 | |
|     }
 | |
|     async function withErrorCause(fn) {
 | |
|         try {
 | |
|             return await fn();
 | |
|         } catch (nativeError) {
 | |
|             throw new Error(nativeError.message, {
 | |
|                 cause: nativeError
 | |
|             });
 | |
|         }
 | |
|     }
 | |
|     /**
 | |
|    * Calls a native function and streams the result.
 | |
|    * If useBuffer is true, all values will be preserved, potentially buffered
 | |
|    * if consumed slower than produced. Else, only the latest value will be
 | |
|    * preserved.
 | |
|    */ function subscribe(useBuffer, nativeFunction) {
 | |
|         // A buffer of produced items. This will only contain values if the
 | |
|         // consumer is slower than the producer.
 | |
|         let buffer = [];
 | |
|         // A deferred value waiting for the next produced item. This will only
 | |
|         // exist if the consumer is faster than the producer.
 | |
|         let waiting;
 | |
|         let canceled = false;
 | |
|         // The native function will call this every time it emits a new result. We
 | |
|         // either need to notify a waiting consumer, or buffer the new result until
 | |
|         // the consumer catches up.
 | |
|         const emitResult = (err, value)=>{
 | |
|             if (waiting) {
 | |
|                 let { resolve, reject } = waiting;
 | |
|                 waiting = undefined;
 | |
|                 if (err) reject(err);
 | |
|                 else resolve(value);
 | |
|             } else {
 | |
|                 const item = {
 | |
|                     err,
 | |
|                     value
 | |
|                 };
 | |
|                 if (useBuffer) buffer.push(item);
 | |
|                 else buffer[0] = item;
 | |
|             }
 | |
|         };
 | |
|         const iterator = async function*() {
 | |
|             const task = await withErrorCause(()=>nativeFunction(emitResult));
 | |
|             try {
 | |
|                 while(!canceled){
 | |
|                     if (buffer.length > 0) {
 | |
|                         const item = buffer.shift();
 | |
|                         if (item.err) throw item.err;
 | |
|                         yield item.value;
 | |
|                     } else {
 | |
|                         // eslint-disable-next-line no-loop-func
 | |
|                         yield new Promise((resolve, reject)=>{
 | |
|                             waiting = {
 | |
|                                 resolve,
 | |
|                                 reject
 | |
|                             };
 | |
|                         });
 | |
|                     }
 | |
|                 }
 | |
|             } catch (e) {
 | |
|                 if (e === cancel) return;
 | |
|                 throw e;
 | |
|             } finally{
 | |
|                 binding.rootTaskDispose(task);
 | |
|             }
 | |
|         }();
 | |
|         iterator.return = async ()=>{
 | |
|             canceled = true;
 | |
|             if (waiting) waiting.reject(cancel);
 | |
|             return {
 | |
|                 value: undefined,
 | |
|                 done: true
 | |
|             };
 | |
|         };
 | |
|         return iterator;
 | |
|     }
 | |
|     async function rustifyProjectOptions(options) {
 | |
|         return {
 | |
|             ...options,
 | |
|             nextConfig: options.nextConfig && await serializeNextConfig(options.nextConfig, options.projectPath),
 | |
|             jsConfig: options.jsConfig && JSON.stringify(options.jsConfig),
 | |
|             env: options.env && rustifyEnv(options.env),
 | |
|             defineEnv: options.defineEnv
 | |
|         };
 | |
|     }
 | |
|     class ProjectImpl {
 | |
|         constructor(nativeProject){
 | |
|             this._nativeProject = nativeProject;
 | |
|         }
 | |
|         async update(options) {
 | |
|             await withErrorCause(async ()=>binding.projectUpdate(this._nativeProject, await rustifyProjectOptions(options)));
 | |
|         }
 | |
|         entrypointsSubscribe() {
 | |
|             const subscription = subscribe(false, async (callback)=>binding.projectEntrypointsSubscribe(this._nativeProject, callback));
 | |
|             return async function*() {
 | |
|                 for await (const entrypoints of subscription){
 | |
|                     const routes = new Map();
 | |
|                     for (const { pathname, ...nativeRoute } of entrypoints.routes){
 | |
|                         let route;
 | |
|                         const routeType = nativeRoute.type;
 | |
|                         switch(routeType){
 | |
|                             case "page":
 | |
|                                 route = {
 | |
|                                     type: "page",
 | |
|                                     htmlEndpoint: new EndpointImpl(nativeRoute.htmlEndpoint),
 | |
|                                     dataEndpoint: new EndpointImpl(nativeRoute.dataEndpoint)
 | |
|                                 };
 | |
|                                 break;
 | |
|                             case "page-api":
 | |
|                                 route = {
 | |
|                                     type: "page-api",
 | |
|                                     endpoint: new EndpointImpl(nativeRoute.endpoint)
 | |
|                                 };
 | |
|                                 break;
 | |
|                             case "app-page":
 | |
|                                 route = {
 | |
|                                     type: "app-page",
 | |
|                                     htmlEndpoint: new EndpointImpl(nativeRoute.htmlEndpoint),
 | |
|                                     rscEndpoint: new EndpointImpl(nativeRoute.rscEndpoint)
 | |
|                                 };
 | |
|                                 break;
 | |
|                             case "app-route":
 | |
|                                 route = {
 | |
|                                     type: "app-route",
 | |
|                                     endpoint: new EndpointImpl(nativeRoute.endpoint)
 | |
|                                 };
 | |
|                                 break;
 | |
|                             case "conflict":
 | |
|                                 route = {
 | |
|                                     type: "conflict"
 | |
|                                 };
 | |
|                                 break;
 | |
|                             default:
 | |
|                                 const _exhaustiveCheck = routeType;
 | |
|                                 invariant(nativeRoute, ()=>`Unknown route type: ${_exhaustiveCheck}`);
 | |
|                         }
 | |
|                         routes.set(pathname, route);
 | |
|                     }
 | |
|                     const napiMiddlewareToMiddleware = (middleware)=>({
 | |
|                             endpoint: new EndpointImpl(middleware.endpoint),
 | |
|                             runtime: middleware.runtime,
 | |
|                             matcher: middleware.matcher
 | |
|                         });
 | |
|                     const middleware = entrypoints.middleware ? napiMiddlewareToMiddleware(entrypoints.middleware) : undefined;
 | |
|                     const napiInstrumentationToInstrumentation = (instrumentation)=>({
 | |
|                             nodeJs: new EndpointImpl(instrumentation.nodeJs),
 | |
|                             edge: new EndpointImpl(instrumentation.edge)
 | |
|                         });
 | |
|                     const instrumentation = entrypoints.instrumentation ? napiInstrumentationToInstrumentation(entrypoints.instrumentation) : undefined;
 | |
|                     yield {
 | |
|                         routes,
 | |
|                         middleware,
 | |
|                         instrumentation,
 | |
|                         pagesDocumentEndpoint: new EndpointImpl(entrypoints.pagesDocumentEndpoint),
 | |
|                         pagesAppEndpoint: new EndpointImpl(entrypoints.pagesAppEndpoint),
 | |
|                         pagesErrorEndpoint: new EndpointImpl(entrypoints.pagesErrorEndpoint),
 | |
|                         issues: entrypoints.issues,
 | |
|                         diagnostics: entrypoints.diagnostics
 | |
|                     };
 | |
|                 }
 | |
|             }();
 | |
|         }
 | |
|         hmrEvents(identifier) {
 | |
|             const subscription = subscribe(true, async (callback)=>binding.projectHmrEvents(this._nativeProject, identifier, callback));
 | |
|             return subscription;
 | |
|         }
 | |
|         hmrIdentifiersSubscribe() {
 | |
|             const subscription = subscribe(false, async (callback)=>binding.projectHmrIdentifiersSubscribe(this._nativeProject, callback));
 | |
|             return subscription;
 | |
|         }
 | |
|         traceSource(stackFrame) {
 | |
|             return binding.projectTraceSource(this._nativeProject, stackFrame);
 | |
|         }
 | |
|         getSourceForAsset(filePath) {
 | |
|             return binding.projectGetSourceForAsset(this._nativeProject, filePath);
 | |
|         }
 | |
|         updateInfoSubscribe() {
 | |
|             const subscription = subscribe(true, async (callback)=>binding.projectUpdateInfoSubscribe(this._nativeProject, callback));
 | |
|             return subscription;
 | |
|         }
 | |
|     }
 | |
|     class EndpointImpl {
 | |
|         constructor(nativeEndpoint){
 | |
|             this._nativeEndpoint = nativeEndpoint;
 | |
|         }
 | |
|         async writeToDisk() {
 | |
|             return await withErrorCause(()=>binding.endpointWriteToDisk(this._nativeEndpoint));
 | |
|         }
 | |
|         async clientChanged() {
 | |
|             const clientSubscription = subscribe(false, async (callback)=>binding.endpointClientChangedSubscribe(await this._nativeEndpoint, callback));
 | |
|             await clientSubscription.next();
 | |
|             return clientSubscription;
 | |
|         }
 | |
|         async serverChanged(includeIssues) {
 | |
|             const serverSubscription = subscribe(false, async (callback)=>binding.endpointServerChangedSubscribe(await this._nativeEndpoint, includeIssues, callback));
 | |
|             await serverSubscription.next();
 | |
|             return serverSubscription;
 | |
|         }
 | |
|     }
 | |
|     async function serializeNextConfig(nextConfig, projectPath) {
 | |
|         var _nextConfig_experimental_turbo, _nextConfig_experimental;
 | |
|         let nextConfigSerializable = nextConfig;
 | |
|         nextConfigSerializable.generateBuildId = await (nextConfig.generateBuildId == null ? void 0 : nextConfig.generateBuildId.call(nextConfig));
 | |
|         // TODO: these functions takes arguments, have to be supported in a different way
 | |
|         nextConfigSerializable.exportPathMap = {};
 | |
|         nextConfigSerializable.webpack = nextConfig.webpack && {};
 | |
|         if ((_nextConfig_experimental = nextConfig.experimental) == null ? void 0 : (_nextConfig_experimental_turbo = _nextConfig_experimental.turbo) == null ? void 0 : _nextConfig_experimental_turbo.rules) {
 | |
|             var _nextConfig_experimental_turbo1;
 | |
|             ensureLoadersHaveSerializableOptions((_nextConfig_experimental_turbo1 = nextConfig.experimental.turbo) == null ? void 0 : _nextConfig_experimental_turbo1.rules);
 | |
|         }
 | |
|         nextConfigSerializable.modularizeImports = nextConfigSerializable.modularizeImports ? Object.fromEntries(Object.entries(nextConfigSerializable.modularizeImports).map(([mod, config])=>[
 | |
|                 mod,
 | |
|                 {
 | |
|                     ...config,
 | |
|                     transform: typeof config.transform === "string" ? config.transform : Object.entries(config.transform).map(([key, value])=>[
 | |
|                             key,
 | |
|                             value
 | |
|                         ])
 | |
|                 }
 | |
|             ])) : undefined;
 | |
|         // loaderFile is an absolute path, we need it to be relative for turbopack.
 | |
|         if (nextConfig.images.loaderFile) {
 | |
|             nextConfig.images.loaderFile = "./" + _path.default.relative(projectPath, nextConfig.images.loaderFile);
 | |
|         }
 | |
|         return JSON.stringify(nextConfigSerializable, null, 2);
 | |
|     }
 | |
|     function ensureLoadersHaveSerializableOptions(turbopackRules) {
 | |
|         for (const [glob, rule] of Object.entries(turbopackRules)){
 | |
|             const loaderItems = Array.isArray(rule) ? rule : rule.loaders;
 | |
|             for (const loaderItem of loaderItems){
 | |
|                 if (typeof loaderItem !== "string" && !(0, _util.isDeepStrictEqual)(loaderItem, JSON.parse(JSON.stringify(loaderItem)))) {
 | |
|                     throw new Error(`loader ${loaderItem.loader} for match "${glob}" does not have serializable options. Ensure that options passed are plain JavaScript objects and values.`);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     async function createProject(options, turboEngineOptions) {
 | |
|         return new ProjectImpl(await binding.projectNew(await rustifyProjectOptions(options), turboEngineOptions || {}));
 | |
|     }
 | |
|     return createProject;
 | |
| }
 | |
| async function loadWasm(importPath = "") {
 | |
|     if (wasmBindings) {
 | |
|         return wasmBindings;
 | |
|     }
 | |
|     let attempts = [];
 | |
|     for (let pkg of [
 | |
|         "@next/swc-wasm-nodejs",
 | |
|         "@next/swc-wasm-web"
 | |
|     ]){
 | |
|         try {
 | |
|             let pkgPath = pkg;
 | |
|             if (importPath) {
 | |
|                 // the import path must be exact when not in node_modules
 | |
|                 pkgPath = _path.default.join(importPath, pkg, "wasm.js");
 | |
|             }
 | |
|             let bindings = await import(pkgPath);
 | |
|             if (pkg === "@next/swc-wasm-web") {
 | |
|                 bindings = await bindings.default();
 | |
|             }
 | |
|             infoLog("next-swc build: wasm build @next/swc-wasm-web");
 | |
|             // Note wasm binary does not support async intefaces yet, all async
 | |
|             // interface coereces to sync interfaces.
 | |
|             wasmBindings = {
 | |
|                 isWasm: true,
 | |
|                 transform (src, options) {
 | |
|                     // TODO: we can remove fallback to sync interface once new stable version of next-swc gets published (current v12.2)
 | |
|                     return (bindings == null ? void 0 : bindings.transform) ? bindings.transform(src.toString(), options) : Promise.resolve(bindings.transformSync(src.toString(), options));
 | |
|                 },
 | |
|                 transformSync (src, options) {
 | |
|                     return bindings.transformSync(src.toString(), options);
 | |
|                 },
 | |
|                 minify (src, options) {
 | |
|                     return (bindings == null ? void 0 : bindings.minify) ? bindings.minify(src.toString(), options) : Promise.resolve(bindings.minifySync(src.toString(), options));
 | |
|                 },
 | |
|                 minifySync (src, options) {
 | |
|                     return bindings.minifySync(src.toString(), options);
 | |
|                 },
 | |
|                 parse (src, options) {
 | |
|                     return (bindings == null ? void 0 : bindings.parse) ? bindings.parse(src.toString(), options) : Promise.resolve(bindings.parseSync(src.toString(), options));
 | |
|                 },
 | |
|                 parseSync (src, options) {
 | |
|                     const astStr = bindings.parseSync(src.toString(), options);
 | |
|                     return astStr;
 | |
|                 },
 | |
|                 getTargetTriple () {
 | |
|                     return undefined;
 | |
|                 },
 | |
|                 turbo: {
 | |
|                     startTrace: ()=>{
 | |
|                         _log.error("Wasm binding does not support trace yet");
 | |
|                     },
 | |
|                     entrypoints: {
 | |
|                         stream: (turboTasks, rootDir, applicationDir, pageExtensions, callbackFn)=>{
 | |
|                             return bindings.streamEntrypoints(turboTasks, rootDir, applicationDir, pageExtensions, callbackFn);
 | |
|                         },
 | |
|                         get: (turboTasks, rootDir, applicationDir, pageExtensions)=>{
 | |
|                             return bindings.getEntrypoints(turboTasks, rootDir, applicationDir, pageExtensions);
 | |
|                         }
 | |
|                     }
 | |
|                 },
 | |
|                 mdx: {
 | |
|                     compile: (src, options)=>bindings.mdxCompile(src, getMdxOptions(options)),
 | |
|                     compileSync: (src, options)=>bindings.mdxCompileSync(src, getMdxOptions(options))
 | |
|                 }
 | |
|             };
 | |
|             return wasmBindings;
 | |
|         } catch (e) {
 | |
|             // Only log attempts for loading wasm when loading as fallback
 | |
|             if (importPath) {
 | |
|                 if ((e == null ? void 0 : e.code) === "ERR_MODULE_NOT_FOUND") {
 | |
|                     attempts.push(`Attempted to load ${pkg}, but it was not installed`);
 | |
|                 } else {
 | |
|                     attempts.push(`Attempted to load ${pkg}, but an error occurred: ${e.message ?? e}`);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     throw attempts;
 | |
| }
 | |
| function loadNative(importPath) {
 | |
|     if (nativeBindings) {
 | |
|         return nativeBindings;
 | |
|     }
 | |
|     const customBindings = !!__INTERNAL_CUSTOM_TURBOPACK_BINDINGS ? require(__INTERNAL_CUSTOM_TURBOPACK_BINDINGS) : null;
 | |
|     let bindings;
 | |
|     let attempts = [];
 | |
|     for (const triple of triples){
 | |
|         try {
 | |
|             bindings = require(`@next/swc/native/next-swc.${triple.platformArchABI}.node`);
 | |
|             infoLog("next-swc build: local built @next/swc");
 | |
|             break;
 | |
|         } catch (e) {}
 | |
|     }
 | |
|     if (!bindings) {
 | |
|         for (const triple of triples){
 | |
|             let pkg = importPath ? _path.default.join(importPath, `@next/swc-${triple.platformArchABI}`, `next-swc.${triple.platformArchABI}.node`) : `@next/swc-${triple.platformArchABI}`;
 | |
|             try {
 | |
|                 bindings = require(pkg);
 | |
|                 if (!importPath) {
 | |
|                     checkVersionMismatch(require(`${pkg}/package.json`));
 | |
|                 }
 | |
|                 break;
 | |
|             } catch (e) {
 | |
|                 if ((e == null ? void 0 : e.code) === "MODULE_NOT_FOUND") {
 | |
|                     attempts.push(`Attempted to load ${pkg}, but it was not installed`);
 | |
|                 } else {
 | |
|                     attempts.push(`Attempted to load ${pkg}, but an error occurred: ${e.message ?? e}`);
 | |
|                 }
 | |
|                 lastNativeBindingsLoadErrorCode = (e == null ? void 0 : e.code) ?? "unknown";
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     if (bindings) {
 | |
|         nativeBindings = {
 | |
|             isWasm: false,
 | |
|             transform (src, options) {
 | |
|                 var _options_jsc;
 | |
|                 const isModule = typeof src !== undefined && typeof src !== "string" && !Buffer.isBuffer(src);
 | |
|                 options = options || {};
 | |
|                 if (options == null ? void 0 : (_options_jsc = options.jsc) == null ? void 0 : _options_jsc.parser) {
 | |
|                     options.jsc.parser.syntax = options.jsc.parser.syntax ?? "ecmascript";
 | |
|                 }
 | |
|                 return bindings.transform(isModule ? JSON.stringify(src) : src, isModule, toBuffer(options));
 | |
|             },
 | |
|             transformSync (src, options) {
 | |
|                 var _options_jsc;
 | |
|                 if (typeof src === undefined) {
 | |
|                     throw new Error("transformSync doesn't implement reading the file from filesystem");
 | |
|                 } else if (Buffer.isBuffer(src)) {
 | |
|                     throw new Error("transformSync doesn't implement taking the source code as Buffer");
 | |
|                 }
 | |
|                 const isModule = typeof src !== "string";
 | |
|                 options = options || {};
 | |
|                 if (options == null ? void 0 : (_options_jsc = options.jsc) == null ? void 0 : _options_jsc.parser) {
 | |
|                     options.jsc.parser.syntax = options.jsc.parser.syntax ?? "ecmascript";
 | |
|                 }
 | |
|                 return bindings.transformSync(isModule ? JSON.stringify(src) : src, isModule, toBuffer(options));
 | |
|             },
 | |
|             minify (src, options) {
 | |
|                 return bindings.minify(toBuffer(src), toBuffer(options ?? {}));
 | |
|             },
 | |
|             minifySync (src, options) {
 | |
|                 return bindings.minifySync(toBuffer(src), toBuffer(options ?? {}));
 | |
|             },
 | |
|             parse (src, options) {
 | |
|                 return bindings.parse(src, toBuffer(options ?? {}));
 | |
|             },
 | |
|             getTargetTriple: bindings.getTargetTriple,
 | |
|             initCustomTraceSubscriber: bindings.initCustomTraceSubscriber,
 | |
|             teardownTraceSubscriber: bindings.teardownTraceSubscriber,
 | |
|             initHeapProfiler: bindings.initHeapProfiler,
 | |
|             teardownHeapProfiler: bindings.teardownHeapProfiler,
 | |
|             turbo: {
 | |
|                 startTrace: (options = {}, turboTasks)=>{
 | |
|                     initHeapProfiler();
 | |
|                     const ret = (customBindings ?? bindings).runTurboTracing(toBuffer({
 | |
|                         exact: true,
 | |
|                         ...options
 | |
|                     }), turboTasks);
 | |
|                     return ret;
 | |
|                 },
 | |
|                 createTurboTasks: (memoryLimit)=>bindings.createTurboTasks(memoryLimit),
 | |
|                 entrypoints: {
 | |
|                     stream: (turboTasks, rootDir, applicationDir, pageExtensions, fn)=>{
 | |
|                         return (customBindings ?? bindings).streamEntrypoints(turboTasks, rootDir, applicationDir, pageExtensions, fn);
 | |
|                     },
 | |
|                     get: (turboTasks, rootDir, applicationDir, pageExtensions)=>{
 | |
|                         return (customBindings ?? bindings).getEntrypoints(turboTasks, rootDir, applicationDir, pageExtensions);
 | |
|                     }
 | |
|                 },
 | |
|                 createProject: bindingToApi(customBindings ?? bindings, false)
 | |
|             },
 | |
|             mdx: {
 | |
|                 compile: (src, options)=>bindings.mdxCompile(src, toBuffer(getMdxOptions(options))),
 | |
|                 compileSync: (src, options)=>bindings.mdxCompileSync(src, toBuffer(getMdxOptions(options)))
 | |
|             }
 | |
|         };
 | |
|         return nativeBindings;
 | |
|     }
 | |
|     throw attempts;
 | |
| }
 | |
| /// Build a mdx options object contains default values that
 | |
| /// can be parsed with serde_wasm_bindgen.
 | |
| function getMdxOptions(options = {}) {
 | |
|     const ret = {
 | |
|         ...options,
 | |
|         development: options.development ?? false,
 | |
|         jsx: options.jsx ?? false,
 | |
|         parse: options.parse ?? {
 | |
|             gfmStrikethroughSingleTilde: true,
 | |
|             mathTextSingleDollar: true
 | |
|         }
 | |
|     };
 | |
|     return ret;
 | |
| }
 | |
| function toBuffer(t) {
 | |
|     return Buffer.from(JSON.stringify(t));
 | |
| }
 | |
| async function isWasm() {
 | |
|     let bindings = await loadBindings();
 | |
|     return bindings.isWasm;
 | |
| }
 | |
| async function transform(src, options) {
 | |
|     let bindings = await loadBindings();
 | |
|     return bindings.transform(src, options);
 | |
| }
 | |
| function transformSync(src, options) {
 | |
|     let bindings = loadBindingsSync();
 | |
|     return bindings.transformSync(src, options);
 | |
| }
 | |
| async function minify(src, options) {
 | |
|     let bindings = await loadBindings();
 | |
|     return bindings.minify(src, options);
 | |
| }
 | |
| function minifySync(src, options) {
 | |
|     let bindings = loadBindingsSync();
 | |
|     return bindings.minifySync(src, options);
 | |
| }
 | |
| async function parse(src, options) {
 | |
|     let bindings = await loadBindings();
 | |
|     let parserOptions = (0, _options.getParserOptions)(options);
 | |
|     return bindings.parse(src, parserOptions).then((astStr)=>JSON.parse(astStr));
 | |
| }
 | |
| function getBinaryMetadata() {
 | |
|     var _bindings_getTargetTriple;
 | |
|     let bindings;
 | |
|     try {
 | |
|         bindings = loadNative();
 | |
|     } catch (e) {
 | |
|     // Suppress exceptions, this fn allows to fail to load native bindings
 | |
|     }
 | |
|     return {
 | |
|         target: bindings == null ? void 0 : (_bindings_getTargetTriple = bindings.getTargetTriple) == null ? void 0 : _bindings_getTargetTriple.call(bindings)
 | |
|     };
 | |
| }
 | |
| const initCustomTraceSubscriber = (traceFileName)=>{
 | |
|     if (!swcTraceFlushGuard) {
 | |
|         // Wasm binary doesn't support trace emission
 | |
|         let bindings = loadNative();
 | |
|         swcTraceFlushGuard = bindings.initCustomTraceSubscriber(traceFileName);
 | |
|     }
 | |
| };
 | |
| const initHeapProfiler = ()=>{
 | |
|     try {
 | |
|         if (!swcHeapProfilerFlushGuard) {
 | |
|             let bindings = loadNative();
 | |
|             swcHeapProfilerFlushGuard = bindings.initHeapProfiler();
 | |
|         }
 | |
|     } catch (_) {
 | |
|     // Suppress exceptions, this fn allows to fail to load native bindings
 | |
|     }
 | |
| };
 | |
| const teardownHeapProfiler = (()=>{
 | |
|     let flushed = false;
 | |
|     return ()=>{
 | |
|         if (!flushed) {
 | |
|             flushed = true;
 | |
|             try {
 | |
|                 let bindings = loadNative();
 | |
|                 if (swcHeapProfilerFlushGuard) {
 | |
|                     bindings.teardownHeapProfiler(swcHeapProfilerFlushGuard);
 | |
|                 }
 | |
|             } catch (e) {
 | |
|             // Suppress exceptions, this fn allows to fail to load native bindings
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| })();
 | |
| const teardownTraceSubscriber = (()=>{
 | |
|     let flushed = false;
 | |
|     return ()=>{
 | |
|         if (!flushed) {
 | |
|             flushed = true;
 | |
|             try {
 | |
|                 let bindings = loadNative();
 | |
|                 if (swcTraceFlushGuard) {
 | |
|                     bindings.teardownTraceSubscriber(swcTraceFlushGuard);
 | |
|                 }
 | |
|             } catch (e) {
 | |
|             // Suppress exceptions, this fn allows to fail to load native bindings
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| })();
 | |
| 
 | |
| //# sourceMappingURL=index.js.map
 |