UNPKG

webpack

Version:

Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.

164 lines (145 loc) 3.98 kB
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const DependencyReference = require("./DependencyReference"); const HarmonyImportDependency = require("./HarmonyImportDependency"); const HarmonyLinkingError = require("../HarmonyLinkingError"); class HarmonyImportSpecifierDependency extends HarmonyImportDependency { constructor( request, originModule, sourceOrder, parserScope, id, name, range, strictExportPresence ) { super(request, originModule, sourceOrder, parserScope); this.id = id === null ? null : `${id}`; this.redirectedId = undefined; this.name = name; this.range = range; this.strictExportPresence = strictExportPresence; this.namespaceObjectAsContext = false; this.callArgs = undefined; this.call = undefined; this.directImport = undefined; this.shorthand = undefined; } get type() { return "harmony import specifier"; } get _id() { return this.redirectedId || this.id; } getReference() { if (!this._module) return null; return new DependencyReference( this._module, this._id && !this.namespaceObjectAsContext ? [this._id] : true, false, this.sourceOrder ); } getWarnings() { if ( this.strictExportPresence || this.originModule.buildMeta.strictHarmonyModule ) { return []; } return this._getErrors(); } getErrors() { if ( this.strictExportPresence || this.originModule.buildMeta.strictHarmonyModule ) { return this._getErrors(); } return []; } _getErrors() { const importedModule = this._module; if (!importedModule) { return; } if (!importedModule.buildMeta || !importedModule.buildMeta.exportsType) { // It's not an harmony module if ( this.originModule.buildMeta.strictHarmonyModule && this._id && this._id !== "default" ) { // In strict harmony modules we only support the default export return [ new HarmonyLinkingError( `Can't import the named export '${this._id}' from non EcmaScript module (only default export is available)` ) ]; } return; } if (!this._id) { return; } if (importedModule.isProvided(this._id) !== false) { // It's provided or we are not sure return; } // We are sure that it's not provided const idIsNotNameMessage = this._id !== this.name ? ` (imported as '${this.name}')` : ""; const errorMessage = `"export '${this._id}'${idIsNotNameMessage} was not found in '${this.userRequest}'`; return [new HarmonyLinkingError(errorMessage)]; } // implement this method to allow the occurrence order plugin to count correctly getNumberOfIdOccurrences() { return 0; } updateHash(hash) { super.updateHash(hash); const importedModule = this._module; hash.update((importedModule && this._id) + ""); hash.update( (importedModule && this._id && importedModule.isUsed(this._id)) + "" ); hash.update( (importedModule && (!importedModule.buildMeta || importedModule.buildMeta.exportsType)) + "" ); hash.update( (importedModule && importedModule.used + JSON.stringify(importedModule.usedExports)) + "" ); } disconnect() { super.disconnect(); this.redirectedId = undefined; } } HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependencyTemplate extends HarmonyImportDependency.Template { apply(dep, source, runtime) { super.apply(dep, source, runtime); const content = this.getContent(dep, runtime); source.replace(dep.range[0], dep.range[1] - 1, content); } getContent(dep, runtime) { const exportExpr = runtime.exportFromImport({ module: dep._module, request: dep.request, exportName: dep._id, originModule: dep.originModule, asiSafe: dep.shorthand, isCall: dep.call, callContext: !dep.directImport, importVar: dep.getImportVar() }); return dep.shorthand ? `${dep.name}: ${exportExpr}` : exportExpr; } }; module.exports = HarmonyImportSpecifierDependency;