123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.loadBindings = loadBindings;
- exports.isWasm = isWasm;
- exports.transform = transform;
- exports.transformSync = transformSync;
- exports.minify = minify;
- exports.minifySync = minifySync;
- exports.bundle = bundle;
- exports.parse = parse;
- exports.getBinaryMetadata = getBinaryMetadata;
- exports.teardownCrashReporter = exports.teardownTraceSubscriber = exports.initCustomTraceSubscriber = exports.lockfilePatchPromise = void 0;
- var _path = _interopRequireDefault(require("path"));
- var _url = require("url");
- var _os = require("os");
- var _triples = require("next/dist/compiled/@napi-rs/triples");
- var Log = _interopRequireWildcard(require("../output/log"));
- var _options = require("./options");
- var _swcLoadFailure = require("../../telemetry/events/swc-load-failure");
- var _patchIncorrectLockfile = require("../../lib/patch-incorrect-lockfile");
- var _downloadWasmSwc = require("../../lib/download-wasm-swc");
- var _packageJson = require("next/package.json");
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {
- default: obj
- };
- }
- function _getRequireWildcardCache() {
- if (typeof WeakMap !== "function") return null;
- var cache = new WeakMap();
- _getRequireWildcardCache = function() {
- return cache;
- };
- return cache;
- }
- function _interopRequireWildcard(obj) {
- if (obj && obj.__esModule) {
- return obj;
- }
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
- return {
- default: obj
- };
- }
- var cache = _getRequireWildcardCache();
- if (cache && cache.has(obj)) {
- return cache.get(obj);
- }
- var newObj = {};
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
- for(var key in obj){
- if (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 ArchName = (0, _os).arch();
- const PlatformName = (0, _os).platform();
- const triples = _triples.platformArchTriples[PlatformName][ArchName] || [];
- // 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 = [
- "aarch64-linux-android",
- "x86_64-unknown-freebsd",
- "aarch64-pc-windows-msvc",
- "arm-linux-androideabi",
- "armv7-unknown-linux-gnueabihf",
- "i686-pc-windows-msvc",
- ];
- let nativeBindings;
- let wasmBindings;
- let downloadWasmPromise;
- let pendingBindings;
- let swcTraceFlushGuard;
- let swcCrashReporterFlushGuard;
- const lockfilePatchPromise = {};
- exports.lockfilePatchPromise = lockfilePatchPromise;
- async function loadBindings() {
- if (pendingBindings) {
- return pendingBindings;
- }
- 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 shouldLoadWasmFallbackFirst = triples.some((triple)=>{
- return !!(triple == null ? void 0 : triple.raw) && knownDefaultWasmFallbackTriples.includes(triple.raw);
- });
- if (shouldLoadWasmFallbackFirst) {
- const fallbackBindings = await tryLoadWasmWithFallback(attempts);
- if (fallbackBindings) {
- return resolve(fallbackBindings);
- }
- }
- try {
- return resolve(loadNative());
- } catch (a) {
- attempts = attempts.concat(a);
- }
- // For these platforms we already tried to load wasm and failed, skip reattempt
- if (!shouldLoadWasmFallbackFirst) {
- const fallbackBindings = await tryLoadWasmWithFallback(attempts);
- if (fallbackBindings) {
- return resolve(fallbackBindings);
- }
- }
- logLoadFailure(attempts, true);
- });
- return pendingBindings;
- }
- async function tryLoadWasmWithFallback(attempts) {
- try {
- let bindings = await loadWasm();
- (0, _swcLoadFailure).eventSwcLoadFailure({
- wasm: "enabled"
- });
- 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, _downloadWasmSwc).downloadWasmSwc(_packageJson.version, wasmDirectory);
- }
- await downloadWasmPromise;
- let bindings = await loadWasm((0, _url).pathToFileURL(wasmDirectory).href);
- (0, _swcLoadFailure).eventSwcLoadFailure({
- wasm: "fallback"
- });
- // 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 (a1) {
- attempts = attempts.concat(a1);
- }
- }
- 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);
- }
- (0, _swcLoadFailure).eventSwcLoadFailure({
- wasm: triedWasm ? "failed" : undefined
- }).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);
- });
- }
- 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();
- }
- Log.info("Using wasm build of next-swc");
- // 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;
- }
- };
- 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 {
- var _message;
- attempts.push(`Attempted to load ${pkg}, but an error occurred: ${(_message = e.message) != null ? _message : e}`);
- }
- }
- }
- }
- throw attempts;
- }
- function loadNative() {
- if (nativeBindings) {
- return nativeBindings;
- }
- let bindings;
- let attempts = [];
- for (const triple of triples){
- try {
- bindings = require(`@next/swc/native/next-swc.${triple.platformArchABI}.node`);
- Log.info("Using locally built binary of @next/swc");
- break;
- } catch (e) {}
- }
- if (!bindings) {
- for (const triple of triples){
- let pkg = `@next/swc-${triple.platformArchABI}`;
- try {
- bindings = require(pkg);
- 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 {
- var _message;
- attempts.push(`Attempted to load ${pkg}, but an error occurred: ${(_message = e.message) != null ? _message : e}`);
- }
- }
- }
- }
- if (bindings) {
- // Initialize crash reporter, as earliest as possible from any point of import.
- // The first-time import to next-swc is not predicatble in the import tree of next.js, which makes
- // we can't rely on explicit manual initialization as similar to trace reporter.
- if (!swcCrashReporterFlushGuard) {
- // Crash reports in next-swc should be treated in the same way we treat telemetry to opt out.
- /* TODO: temporarily disable initialization while confirming logistics.
- let telemetry = new Telemetry({ distDir: process.cwd() })
- if (telemetry.isEnabled) {
- swcCrashReporterFlushGuard = bindings.initCrashReporter?.()
- }*/ }
- nativeBindings = {
- isWasm: false,
- transform (src, options) {
- var ref;
- const isModule = typeof src !== undefined && typeof src !== "string" && !Buffer.isBuffer(src);
- options = options || {};
- if (options == null ? void 0 : (ref = options.jsc) == null ? void 0 : ref.parser) {
- var _syntax;
- options.jsc.parser.syntax = (_syntax = options.jsc.parser.syntax) != null ? _syntax : "ecmascript";
- }
- return bindings.transform(isModule ? JSON.stringify(src) : src, isModule, toBuffer(options));
- },
- transformSync (src, options) {
- var ref;
- 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 : (ref = options.jsc) == null ? void 0 : ref.parser) {
- var _syntax;
- options.jsc.parser.syntax = (_syntax = options.jsc.parser.syntax) != null ? _syntax : "ecmascript";
- }
- return bindings.transformSync(isModule ? JSON.stringify(src) : src, isModule, toBuffer(options));
- },
- minify (src, options) {
- return bindings.minify(toBuffer(src), toBuffer(options != null ? options : {}));
- },
- minifySync (src, options) {
- return bindings.minifySync(toBuffer(src), toBuffer(options != null ? options : {}));
- },
- bundle (options) {
- return bindings.bundle(toBuffer(options));
- },
- parse (src, options) {
- return bindings.parse(src, toBuffer(options != null ? options : {}));
- },
- getTargetTriple: bindings.getTargetTriple,
- initCustomTraceSubscriber: bindings.initCustomTraceSubscriber,
- teardownTraceSubscriber: bindings.teardownTraceSubscriber,
- teardownCrashReporter: bindings.teardownCrashReporter
- };
- return nativeBindings;
- }
- throw attempts;
- }
- 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 bundle(options) {
- let bindings = loadBindingsSync();
- return bindings.bundle(toBuffer(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() {
- 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 == null ? void 0 : bindings.getTargetTriple()
- };
- }
- const initCustomTraceSubscriber = (()=>{
- return (filename)=>{
- if (!swcTraceFlushGuard) {
- // Wasm binary doesn't support trace emission
- let bindings = loadNative();
- swcTraceFlushGuard = bindings.initCustomTraceSubscriber(filename);
- }
- };
- })();
- exports.initCustomTraceSubscriber = initCustomTraceSubscriber;
- 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
- }
- }
- };
- })();
- exports.teardownTraceSubscriber = teardownTraceSubscriber;
- const teardownCrashReporter = (()=>{
- let flushed = false;
- return ()=>{
- if (!flushed) {
- flushed = true;
- try {
- let bindings = loadNative();
- if (swcCrashReporterFlushGuard) {
- bindings.teardownCrashReporter(swcCrashReporterFlushGuard);
- }
- } catch (e) {
- // Suppress exceptions, this fn allows to fail to load native bindings
- }
- }
- };
- })();
- exports.teardownCrashReporter = teardownCrashReporter;
- //# sourceMappingURL=index.js.map
|