123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = _default;
- var _path = require("path");
- function _default({ types: t }) {
- return {
- visitor: {
- ImportDeclaration (path, state) {
- let source = path.node.source.value;
- if (source !== "next/dynamic") return;
- let defaultSpecifier = path.get("specifiers").find((specifier)=>{
- return specifier.isImportDefaultSpecifier();
- });
- if (!defaultSpecifier) return;
- const bindingName = defaultSpecifier.node.local.name;
- const binding = path.scope.getBinding(bindingName);
- if (!binding) {
- return;
- }
- binding.referencePaths.forEach((refPath)=>{
- var ref2, ref1;
- let callExpression = refPath.parentPath;
- if (callExpression.isMemberExpression() && callExpression.node.computed === false) {
- const property = callExpression.get("property");
- if (!Array.isArray(property) && property.isIdentifier({
- name: "Map"
- })) {
- callExpression = callExpression.parentPath;
- }
- }
- if (!callExpression.isCallExpression()) return;
- const callExpression_ = callExpression;
- let args = callExpression_.get("arguments");
- if (args.length > 2) {
- throw callExpression_.buildCodeFrameError("next/dynamic only accepts 2 arguments");
- }
- if (!args[0]) {
- return;
- }
- let loader;
- let options;
- if (args[0].isObjectExpression()) {
- options = args[0];
- } else {
- if (!args[1]) {
- callExpression_.node.arguments.push(t.objectExpression([]));
- }
- // This is needed as the code is modified above
- args = callExpression_.get("arguments");
- loader = args[0];
- options = args[1];
- }
- if (!options.isObjectExpression()) return;
- const options_ = options;
- let properties = options_.get("properties");
- let propertiesMap = {};
- properties.forEach((property)=>{
- const key = property.get("key");
- propertiesMap[key.node.name] = property;
- });
- if (propertiesMap.loadableGenerated) {
- return;
- }
- if (propertiesMap.loader) {
- loader = propertiesMap.loader.get("value");
- }
- if (propertiesMap.modules) {
- loader = propertiesMap.modules.get("value");
- }
- if (!loader || Array.isArray(loader)) {
- return;
- }
- const dynamicImports = [];
- const dynamicKeys = [];
- loader.traverse({
- Import (importPath) {
- var ref;
- const importArguments = importPath.parentPath.get("arguments");
- if (!Array.isArray(importArguments)) return;
- const node = importArguments[0].node;
- dynamicImports.push(node);
- dynamicKeys.push(t.binaryExpression("+", t.stringLiteral((((ref = state.file.opts.caller) == null ? void 0 : ref.pagesDir) ? (0, _path).relative(state.file.opts.caller.pagesDir, state.file.opts.filename) : state.file.opts.filename) + " -> "), node));
- }
- });
- if (!dynamicImports.length) return;
- options.node.properties.push(t.objectProperty(t.identifier("loadableGenerated"), t.objectExpression(((ref2 = state.file.opts.caller) == null ? void 0 : ref2.isDev) || ((ref1 = state.file.opts.caller) == null ? void 0 : ref1.isServer) ? [
- t.objectProperty(t.identifier("modules"), t.arrayExpression(dynamicKeys)),
- ] : [
- t.objectProperty(t.identifier("webpack"), t.arrowFunctionExpression([], t.arrayExpression(dynamicImports.map((dynamicImport)=>{
- return t.callExpression(t.memberExpression(t.identifier("require"), t.identifier("resolveWeak")), [
- dynamicImport
- ]);
- })))),
- ])));
- // Turns `dynamic(import('something'))` into `dynamic(() => import('something'))` for backwards compat.
- // This is the replicate the behavior in versions below Next.js 7 where we magically handled not executing the `import()` too.
- // We'll deprecate this behavior and provide a codemod for it in 7.1.
- if (loader.isCallExpression()) {
- const arrowFunction = t.arrowFunctionExpression([], loader.node);
- loader.replaceWith(arrowFunction);
- }
- });
- }
- }
- };
- }
- //# sourceMappingURL=react-loadable-plugin.js.map
|