next
Version:
The React Framework
137 lines (136 loc) • 5.09 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = swcLoader;
var _loaderUtils = require("next/dist/compiled/loader-utils");
var _swc = require("../../swc");
const nextDistPath = /(next[\\/]dist[\\/]shared[\\/]lib)|(next[\\/]dist[\\/]client)|(next[\\/]dist[\\/]pages)/;
function getSWCOptions({ isTypeScript , isServer , development , isPageFile , pagesDir , isNextDist , hasReactRefresh , isCommonJS , }) {
const jsc = {
parser: {
syntax: isTypeScript ? 'typescript' : 'ecmascript',
dynamicImport: true,
[isTypeScript ? 'tsx' : 'jsx']: true
},
transform: {
react: {
runtime: 'automatic',
pragma: 'React.createElement',
pragmaFrag: 'React.Fragment',
throwIfNamespace: true,
development: development,
useBuiltins: true,
refresh: hasReactRefresh
},
optimizer: {
simplify: false,
globals: {
typeofs: {
window: isServer ? 'undefined' : 'object'
}
}
}
}
};
if (isServer) {
return {
jsc,
// Next.js dist intentionally does not have type: commonjs on server compilation
...isCommonJS ? {
module: {
type: 'commonjs'
}
} : {
},
// Disables getStaticProps/getServerSideProps tree shaking on the server compilation for pages
disableNextSsg: true,
disablePageConfig: true,
isDevelopment: development,
pagesDir,
isPageFile,
env: {
targets: {
// Targets the current version of Node.js
node: process.versions.node
}
}
};
} else {
// Matches default @babel/preset-env behavior
jsc.target = 'es5';
return {
// Ensure Next.js internals are output as commonjs modules
...isNextDist || isCommonJS ? {
module: {
type: 'commonjs'
}
} : {
},
disableNextSsg: !isPageFile,
isDevelopment: development,
pagesDir,
isPageFile,
jsc
};
}
}
async function loaderTransform(parentTrace, source, inputSourceMap) {
// Make the loader async
const filename = this.resourcePath;
const isTypeScript = filename.endsWith('.ts') || filename.endsWith('.tsx');
let loaderOptions = (0, _loaderUtils).getOptions(this) || {
};
const { isServer , pagesDir , hasReactRefresh } = loaderOptions;
const isPageFile = filename.startsWith(pagesDir);
const isNextDist = nextDistPath.test(filename);
const isCommonJS = source.indexOf('module.exports') !== -1;
const swcOptions = getSWCOptions({
pagesDir,
isTypeScript,
isServer: isServer,
isPageFile,
development: this.mode === 'development',
isNextDist,
isCommonJS,
hasReactRefresh
});
const programmaticOptions = {
...swcOptions,
filename,
inputSourceMap: inputSourceMap ? JSON.stringify(inputSourceMap) : undefined,
// Set the default sourcemap behavior based on Webpack's mapping flag,
sourceMaps: this.sourceMap,
inlineSourcesContent: this.sourceMap,
// Ensure that Webpack will get a full absolute path in the sourcemap
// so that it can properly map the module back to its internal cached
// modules.
sourceFileName: filename
};
if (!programmaticOptions.inputSourceMap) {
delete programmaticOptions.inputSourceMap;
}
// auto detect development mode
if (this.mode && programmaticOptions.jsc && programmaticOptions.jsc.transform && programmaticOptions.jsc.transform.react && !Object.prototype.hasOwnProperty.call(programmaticOptions.jsc.transform.react, 'development')) {
programmaticOptions.jsc.transform.react.development = this.mode === 'development';
}
const swcSpan = parentTrace.traceChild('next-swc-transform');
return swcSpan.traceAsyncFn(()=>(0, _swc).transform(source, programmaticOptions).then((output)=>{
return [
output.code,
output.map ? JSON.parse(output.map) : undefined
];
})
);
}
function swcLoader(inputSource, inputSourceMap) {
const loaderSpan = this.currentTraceSpan.traceChild('next-swc-loader');
const callback = this.async();
loaderSpan.traceAsyncFn(()=>loaderTransform.call(this, loaderSpan, inputSource, inputSourceMap)
).then(([transformedSource, outputSourceMap])=>{
callback(null, transformedSource, outputSourceMap || inputSourceMap);
}, (err)=>{
callback(err);
});
}
//# sourceMappingURL=next-swc-loader.js.map
;