
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
/** @typedef {import("./Module")} Module */
const MODULE_REFERENCE_REGEXP =
/^__WEBPACK_MODULE_REFERENCE__(\d+)_([\da-f]+|ns)(_call)?(_directImport)?(?:_asiSafe(\d))?__$/;
const DEFAULT_EXPORT = "__WEBPACK_DEFAULT_EXPORT__";
const NAMESPACE_OBJECT_EXPORT = "__WEBPACK_NAMESPACE_OBJECT__";
/**
* @typedef {Object} ExternalModuleInfo
* @property {number} index
* @property {Module} module
*/
/**
* @typedef {Object} ConcatenatedModuleInfo
* @property {number} index
* @property {Module} module
* @property {Map<string, string>} exportMap mapping from export name to symbol
* @property {Map<string, string>} rawExportMap mapping from export name to symbol
* @property {string=} namespaceExportSymbol
*/
/** @typedef {ConcatenatedModuleInfo | ExternalModuleInfo} ModuleInfo */
/**
* @typedef {Object} ModuleReferenceOptions
* @property {string[]} ids the properties/exports of the module
* @property {boolean} call true, when this referenced export is called
* @property {boolean} directImport true, when this referenced export is directly imported (not via property access)
* @property {boolean | undefined} asiSafe if the position is ASI safe or unknown
*/
class ConcatenationScope {
/**
* @param {ModuleInfo[] | Map<Module, ModuleInfo>} modulesMap all module info by module
* @param {ConcatenatedModuleInfo} currentModule the current module info
*/
constructor(modulesMap, currentModule) {
this._currentModule = currentModule;
if (Array.isArray(modulesMap)) {
const map = new Map();
for (const info of modulesMap) {
map.set(info.module, info);
}
modulesMap = map;
}
this._modulesMap = modulesMap;
}
/**
* @param {Module} module the referenced module
* @returns {boolean} true, when it's in the scope
*/
isModuleInScope(module) {
return this._modulesMap.has(module);
}
/**
*
* @param {string} exportName name of the export
* @param {string} symbol identifier of the export in source code
*/
registerExport(exportName, symbol) {
if (!this._currentModule.exportMap) {
this._currentModule.exportMap = new Map();
}
if (!this._currentModule.exportMap.has(exportName)) {
this._currentModule.exportMap.set(exportName, symbol);
}
}
/**
*
* @param {string} exportName name of the export
* @param {string} expression expression to be used
*/
registerRawExport(exportName, expression) {
if (!this._currentModule.rawExportMap) {
this._currentModule.rawExportMap = new Map();
}
if (!this._currentModule.rawExportMap.has(exportName)) {
this._currentModule.rawExportMap.set(exportName, expression);
}
}
/**
* @param {string} symbol identifier of the export in source code
*/
registerNamespaceExport(symbol) {
this._currentModule.namespaceExportSymbol = symbol;
}
/**
*
* @param {Module} module the referenced module
* @param {Partial<ModuleReferenceOptions>} options options
* @returns {string} the reference as identifier
*/
createModuleReference(
module,
{ ids = undefined, call = false, directImport = false, asiSafe = false }
) {
const info = this._modulesMap.get(module);
const callFlag = call ? "_call" : "";
const directImportFlag = directImport ? "_directImport" : "";
const asiSafeFlag = asiSafe
? "_asiSafe1"
: asiSafe === false
? "_asiSafe0"
: "";
const exportData = ids
? Buffer.from(JSON.stringify(ids), "utf-8").toString("hex")
: "ns";
// a "._" is appended to allow "delete ...", which would cause a SyntaxError in strict mode
return `__WEBPACK_MODULE_REFERENCE__${info.index}_${exportData}${callFlag}${directImportFlag}${asiSafeFlag}__._`;
}
/**
* @param {string} name the identifier
* @returns {boolean} true, when it's an module reference
*/
static isModuleReference(name) {
return MODULE_REFERENCE_REGEXP.test(name);
}
/**
* @param {string} name the identifier
* @returns {ModuleReferenceOptions & { index: number }} parsed options and index
*/
static matchModuleReference(name) {
const match = MODULE_REFERENCE_REGEXP.exec(name);
if (!match) return null;
const index = +match[1];
const asiSafe = match[5];
return {
index,
ids:
match[2] === "ns"
? []
: JSON.parse(Buffer.from(match[2], "hex").toString("utf-8")),
call: !!match[3],
directImport: !!match[4],
asiSafe: asiSafe ? asiSafe === "1" : undefined
};
}
}
ConcatenationScope.DEFAULT_EXPORT = DEFAULT_EXPORT;
ConcatenationScope.NAMESPACE_OBJECT_EXPORT = NAMESPACE_OBJECT_EXPORT;
module.exports = ConcatenationScope;
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160/*MIT License http://www.opensource.org/licenses/mit-license.phpAuthor Tobias Koppers @sokra*/"use strict";/** @typedef {import("./Module")} Module */const MODULE_REFERENCE_REGEXP =/^__WEBPACK_MODULE_REFERENCE__(\d+)_([\da-f]+|ns)(_call)?(_directImport)?(?:_asiSafe(\d))?__$/;const DEFAULT_EXPORT = "__WEBPACK_DEFAULT_EXPORT__";const NAMESPACE_OBJECT_EXPORT = "__WEBPACK_NAMESPACE_OBJECT__";/*** @typedef {Object} ExternalModuleInfo* @property {number} index* @property {Module} module*//*** @typedef {Object} ConcatenatedModuleInfo* @property {number} index* @property {Module} module* @property {Map<string, string>} exportMap mapping from export name to symbol* @property {Map<string, string>} rawExportMap mapping from export name to symbol* @property {string=} namespaceExportSymbol*//** @typedef {ConcatenatedModuleInfo | ExternalModuleInfo} ModuleInfo *//*** @typedef {Object} ModuleReferenceOptions* @property {string[]} ids the properties/exports of the module* @property {boolean} call true, when this referenced export is called* @property {boolean} directImport true, when this referenced export is directly imported (not via property access)* @property {boolean | undefined} asiSafe if the position is ASI safe or unknown*/class ConcatenationScope {/*** @param {ModuleInfo[] | Map<Module, ModuleInfo>} modulesMap all module info by module* @param {ConcatenatedModuleInfo} currentModule the current module info*/constructor(modulesMap, currentModule) {this._currentModule = currentModule;if (Array.isArray(modulesMap)) {const map = new Map();for (const info of modulesMap) {map.set(info.module, info);}modulesMap = map;}this._modulesMap = modulesMap;}/*** @param {Module} module the referenced module* @returns {boolean} true, when it's in the scope*/isModuleInScope(module) {return this._modulesMap.has(module);}/**** @param {string} exportName name of the export* @param {string} symbol identifier of the export in source code*/registerExport(exportName, symbol) {if (!this._currentModule.exportMap) {this._currentModule.exportMap = new Map();}if (!this._currentModule.exportMap.has(exportName)) {this._currentModule.exportMap.set(exportName, symbol);}}/**** @param {string} exportName name of the export* @param {string} expression expression to be used*/registerRawExport(exportName, expression) {if (!this._currentModule.rawExportMap) {this._currentModule.rawExportMap = new Map();}if (!this._currentModule.rawExportMap.has(exportName)) {this._currentModule.rawExportMap.set(exportName, expression);}}/*** @param {string} symbol identifier of the export in source code*/registerNamespaceExport(symbol) {this._currentModule.namespaceExportSymbol = symbol;}/**** @param {Module} module the referenced module* @param {Partial<ModuleReferenceOptions>} options options* @returns {string} the reference as identifier*/createModuleReference(module,{ ids = undefined, call = false, directImport = false, asiSafe = false }) {const info = this._modulesMap.get(module);const callFlag = call ? "_call" : "";const directImportFlag = directImport ? "_directImport" : "";const asiSafeFlag = asiSafe? "_asiSafe1": asiSafe === false? "_asiSafe0": "";const exportData = ids? Buffer.from(JSON.stringify(ids), "utf-8").toString("hex"): "ns";// a "._" is appended to allow "delete ...", which would cause a SyntaxError in strict modereturn `__WEBPACK_MODULE_REFERENCE__${info.index}_${exportData}${callFlag}${directImportFlag}${asiSafeFlag}__._`;}/*** @param {string} name the identifier* @returns {boolean} true, when it's an module reference*/static isModuleReference(name) {return MODULE_REFERENCE_REGEXP.test(name);}/*** @param {string} name the identifier* @returns {ModuleReferenceOptions & { index: number }} parsed options and index*/static matchModuleReference(name) {const match = MODULE_REFERENCE_REGEXP.exec(name);if (!match) return null;const index = +match[1];const asiSafe = match[5];return {index,ids:match[2] === "ns"? []: JSON.parse(Buffer.from(match[2], "hex").toString("utf-8")),call: !!match[3],directImport: !!match[4],asiSafe: asiSafe ? asiSafe === "1" : undefined};}}ConcatenationScope.DEFAULT_EXPORT = DEFAULT_EXPORT;ConcatenationScope.NAMESPACE_OBJECT_EXPORT = NAMESPACE_OBJECT_EXPORT;module.exports = ConcatenationScope;