UNPKG

liferay-npm-bundler-preset-reactjs

Version:

liferay npm bundler preset react

204 lines (203 loc) 8.28 kB
"use strict"; /** * SPDX-FileCopyrightText: © 2020 Liferay, Inc. <https://liferay.com> * SPDX-License-Identifier: LGPL-3.0-or-later */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Visitor = void 0; const alias_1 = require("liferay-npm-build-tools-common/lib/alias"); const babelIpc = __importStar(require("liferay-npm-build-tools-common/lib/babel-ipc")); const file_path_1 = __importDefault(require("liferay-npm-build-tools-common/lib/file-path")); const mod = __importStar(require("liferay-npm-build-tools-common/lib/modules")); const project_1 = __importDefault(require("liferay-npm-build-tools-common/lib/project")); const absPrjDirPath = project_1.default.dir.asNative; const absBuildDirPath = project_1.default.dir.join(project_1.default.buildDir).asNative; let t; class Visitor { constructor(state) { const babelIpcObject = babelIpc.get(state, {}); this._aliasFields = alias_1.getAliasFields(babelIpcObject.globalConfig, state.opts); this._absFile = new file_path_1.default(state.file.opts.filename); this._log = babelIpcObject.log; this._absRootDir = new file_path_1.default(this._absFile.asNative.startsWith(absBuildDirPath) ? absBuildDirPath : absPrjDirPath); state.visitor = this; } CallExpression(bpath) { const { _log } = this; const { node } = bpath; const { callee } = node; if (!t.isIdentifier(callee)) { return; } if (callee.name !== 'require') { return; } const argument = node.arguments[0]; if (!t.isLiteral(argument) || !argument.value) { return; } const moduleName = argument.value; if (typeof moduleName !== 'string') { return; } const aliasedModuleName = this._resolve(moduleName); if (aliasedModuleName === false) { bpath.replaceWith(t.objectExpression([])); _log.info('alias-modules', `Replaced require('${moduleName}') with {}`).linkToCode(5); } else if (aliasedModuleName !== argument.value) { argument.value = aliasedModuleName; _log.info('alias-modules', `Redirected '${moduleName}' to ` + `'${aliasedModuleName}'`).linkToCode(6); } } /** * Get required module name as it should be required from `absFile` or `false` * if it should be ignored. * * @param requiredModuleName */ _resolve(requiredModuleName) { const { _absFile, _absRootDir, _aliasFields, _log } = this; // Fail for absolute path modules if (requiredModuleName.startsWith('/')) { _log.error('babel-plugin-alias-modules', `Require to absolute path ${requiredModuleName} will not work in ` + `AMD environments (like Liferay)`); return undefined; } const absFileDir = _absFile.dirname(); const requiredModule = new file_path_1.default(requiredModuleName, { posix: true }); let alias; if (mod.isLocalModule(requiredModuleName)) { // First look in file directory (without recursion) alias = this._getAliasForLocal(absFileDir, absFileDir, requiredModule); // Then, if not found, recursively from target module up if (alias === undefined) { const moduleDir = absFileDir.join(requiredModule.dirname()); const moduleBasename = requiredModule.basename(); alias = this._getAliasForLocal(_absRootDir, moduleDir, moduleBasename); if (alias !== undefined && alias_1.getAliasToType(alias) === alias_1.AliasToType.LOCAL) { alias = absFileDir .relative(moduleDir) .join(new file_path_1.default(alias, { posix: true })).asPosix; if (!alias.startsWith('.')) { alias = `./${alias}`; } } } } else { alias = this._getAliasForExternal(absFileDir, requiredModule); } return alias === undefined ? requiredModuleName : alias; } /** * Get resolved module name as it should be required from `absSearchDir` or * `undefined` if it is not aliased. * * @param searchRelModuleName (without leading `./`) */ _getAliasForLocal(absSearchTopDir, absSearchDir, searchRelModuleName) { const { _aliasFields } = this; const aliases = alias_1.loadAliases(absSearchDir.join('package.json'), _aliasFields); const normalizedSearchRelModuleName = `./${searchRelModuleName.asPosix}`; let alias = aliases[normalizedSearchRelModuleName]; // Try with file alias if (alias === undefined && !normalizedSearchRelModuleName.toLowerCase().endsWith('.js')) { alias = aliases[`${normalizedSearchRelModuleName}.js`]; } // Try with external module aliases if (alias === undefined) { alias = aliases[searchRelModuleName.asPosix]; } // Found: return it if (alias !== undefined) { return alias; } // Search finished if (absSearchDir.is(absSearchTopDir)) { return undefined; } // Look up in hierachy alias = this._getAliasForLocal(absSearchTopDir, absSearchDir.dirname(), absSearchDir.basename().join(searchRelModuleName)); // Rebase to current folder if (alias !== undefined && alias_1.getAliasToType(alias) === alias_1.AliasToType.LOCAL) { alias = new file_path_1.default(`../${alias}`, { posix: true }).normalize() .asPosix; } return alias; } /** * Get resolved module name or `undefined` if it is not aliased. * * @param absRootDir * @param absSearchDir * @param searchRelModuleName */ _getAliasForExternal(absSearchDir, requiredModule) { const { _absRootDir, _aliasFields } = this; const aliases = alias_1.loadAliases(absSearchDir.join('package.json'), _aliasFields); let alias = aliases[requiredModule.asPosix]; // Found: return it if (alias !== undefined) { return alias; } // Search finished if (absSearchDir.is(_absRootDir)) { return undefined; } // Look up in hierachy alias = this._getAliasForExternal(absSearchDir.dirname(), requiredModule); // Rebase to current folder if (alias !== undefined && alias_1.getAliasToType(alias) === alias_1.AliasToType.LOCAL) { alias = new file_path_1.default(`../${alias}`, { posix: true }).normalize() .asPosix; } return alias; } } exports.Visitor = Visitor; /** * @return {object} a babel visitor */ function default_1({ types }) { t = types; return { visitor: { CallExpression(bpath, state) { state.visitor.CallExpression(bpath); }, Program(bpath, state) { new Visitor(state); }, }, }; } exports.default = default_1;