2015-10-22 03:05:01 +08:00
/ *
MIT License http : //www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @ sokra
* /
var NullDependency = require ( "./NullDependency" ) ;
2015-12-23 23:24:45 +08:00
var HarmonyModulesHelpers = require ( "./HarmonyModulesHelpers" ) ;
2015-10-22 03:05:01 +08:00
function HarmonyExportImportedSpecifierDependency ( originModule , importDependency , importedVar , id , name , position ) {
NullDependency . call ( this ) ;
this . originModule = originModule ;
this . importDependency = importDependency ;
this . importedVar = importedVar ;
this . id = id ;
this . name = name ;
this . position = position ;
}
module . exports = HarmonyExportImportedSpecifierDependency ;
HarmonyExportImportedSpecifierDependency . prototype = Object . create ( NullDependency . prototype ) ;
HarmonyExportImportedSpecifierDependency . prototype . constructor = HarmonyExportImportedSpecifierDependency ;
HarmonyExportImportedSpecifierDependency . prototype . type = "harmony export imported specifier" ;
HarmonyExportImportedSpecifierDependency . prototype . getReference = function ( ) {
var used = this . originModule . isUsed ( this . name ) ;
2015-12-23 23:24:45 +08:00
var active = HarmonyModulesHelpers . isActive ( this . originModule , this ) ;
if ( ! this . importDependency . module || ! used || ! active ) return null ;
2016-08-17 17:24:35 +08:00
if ( ! this . originModule . usedExports ) return null ;
var m = this . importDependency . module ;
if ( ! this . name ) {
// export *
if ( Array . isArray ( this . originModule . usedExports ) ) {
// reexport * with known used exports
var activeExports = HarmonyModulesHelpers . getActiveExports ( this . originModule ) ;
2016-09-06 05:41:03 +08:00
if ( Array . isArray ( m . providedExports ) ) {
return {
module : m ,
importedNames : this . originModule . usedExports . filter ( function ( id ) {
2016-09-07 15:44:53 +08:00
return activeExports . indexOf ( id ) < 0 && m . providedExports . indexOf ( id ) >= 0 && id !== "default" ;
2016-09-06 05:41:03 +08:00
} , this )
}
} else {
return {
module : m ,
importedNames : this . originModule . usedExports . filter ( function ( id ) {
2016-09-07 15:44:53 +08:00
return activeExports . indexOf ( id ) < 0 && id !== "default" ;
2016-09-06 05:41:03 +08:00
} , this )
}
}
} else if ( Array . isArray ( m . providedExports ) ) {
2016-08-17 17:24:35 +08:00
return {
module : m ,
2016-09-07 15:44:53 +08:00
importedNames : m . providedExports . filter ( function ( id ) {
return id !== "default"
} )
2016-08-17 17:24:35 +08:00
}
} else {
return {
module : m ,
importedNames : true
}
}
} else {
if ( Array . isArray ( this . originModule . usedExports ) && this . originModule . usedExports . indexOf ( this . name ) < 0 ) return null ;
if ( this . id ) {
// export { name as name }
return {
module : m ,
importedNames : [ this . id ]
} ;
} else {
// export { * as name }
return {
module : m ,
importedNames : true
} ;
}
}
2015-12-23 23:24:45 +08:00
} ;
2016-09-06 05:41:03 +08:00
HarmonyExportImportedSpecifierDependency . prototype . getExports = function ( ) {
if ( this . name ) {
return {
exports : [ this . name ]
}
2016-11-21 08:00:25 +08:00
}
2016-09-06 05:41:03 +08:00
if ( this . importDependency . module && Array . isArray ( this . importDependency . module . providedExports ) ) {
return {
2016-09-07 15:44:53 +08:00
exports : this . importDependency . module . providedExports . filter ( function ( id ) {
return id !== "default"
} ) ,
2016-09-06 05:41:03 +08:00
dependencies : [ this . importDependency . module ]
} ;
}
if ( this . importDependency . module && this . importDependency . module . providedExports ) {
return {
exports : true
} ;
}
if ( this . importDependency . module ) {
return {
exports : null ,
dependencies : [ this . importDependency . module ]
} ;
}
return {
exports : null
}
} ;
2015-12-23 23:24:45 +08:00
HarmonyExportImportedSpecifierDependency . prototype . describeHarmonyExport = function ( ) {
return {
exportedName : this . name ,
precedence : this . name ? 2 : 3
2015-10-22 03:05:01 +08:00
} ;
} ;
2016-02-04 07:06:16 +08:00
HarmonyExportImportedSpecifierDependency . prototype . updateHash = function ( hash ) {
NullDependency . prototype . updateHash . call ( this , hash ) ;
2016-02-04 16:59:28 +08:00
var importedModule = this . importDependency . module ;
2016-09-07 16:56:17 +08:00
hash . update ( ( importedModule && ( importedModule . used + JSON . stringify ( importedModule . usedExports ) + JSON . stringify ( importedModule . providedExports ) ) ) + "" ) ;
2016-02-04 07:06:16 +08:00
} ;
2015-10-22 03:05:01 +08:00
HarmonyExportImportedSpecifierDependency . Template = function HarmonyExportImportedSpecifierDependencyTemplate ( ) { } ;
2015-12-01 23:13:46 +08:00
HarmonyExportImportedSpecifierDependency . Template . prototype . apply = function ( dep , source , outputOptions , requestShortener ) {
2015-10-22 03:05:01 +08:00
var name = dep . importedVar ;
var used = dep . originModule . isUsed ( dep . name ) ;
2016-02-04 06:40:41 +08:00
var importedModule = dep . importDependency . module ;
2015-12-23 23:24:45 +08:00
var active = HarmonyModulesHelpers . isActive ( dep . originModule , dep ) ;
2015-10-22 03:05:01 +08:00
var content ;
2016-02-04 06:48:51 +08:00
var activeExports ;
2016-09-06 05:41:03 +08:00
var items ;
var importIsHarmony = importedModule && ( ! importedModule . meta || importedModule . meta . harmonyModule ) ;
2016-06-16 06:52:50 +08:00
2016-02-17 05:31:12 +08:00
function getReexportStatement ( key , valueKey ) {
2016-06-16 06:52:50 +08:00
return ( importIsHarmony || ! valueKey ? "" : "if(__webpack_require__.o(" + name + ", " + valueKey + ")) " ) +
"__webpack_require__.d(exports, " + key + ", " +
2016-09-07 15:46:13 +08:00
"function() { return " + name + ( valueKey === null ? "_default.a" : valueKey && "[" + valueKey + "]" ) + "; });\n"
2016-02-17 05:31:12 +08:00
}
if ( ! used ) { // we want to rexport something, but the export isn't used
2016-02-22 20:24:14 +08:00
content = "/* unused harmony reexport " + dep . name + " */\n" ;
2016-02-17 05:31:12 +08:00
} else if ( ! active ) { // we want to reexport something but another exports overrides this one
content = "/* inactive harmony reexport " + ( dep . name || "namespace" ) + " */\n" ;
2016-07-03 19:13:01 +08:00
} else if ( dep . name && dep . id === "default" && ! ( importedModule && ( ! importedModule . meta || importedModule . meta . harmonyModule ) ) ) { // we want to reexport the default export from a non-hamory module
2016-09-07 15:46:13 +08:00
content = "/* harmony reexport (default from non-hamory) */ " + getReexportStatement ( JSON . stringify ( used ) , null ) ;
2016-02-17 05:31:12 +08:00
} else if ( dep . name && dep . id ) { // we want to reexport a key as new key
2016-02-04 06:40:41 +08:00
var idUsed = importedModule && importedModule . isUsed ( dep . id ) ;
2016-09-07 15:46:13 +08:00
content = "/* harmony reexport (binding) */ " + getReexportStatement ( JSON . stringify ( used ) , JSON . stringify ( idUsed ) ) ;
2016-02-17 05:31:12 +08:00
} else if ( dep . name ) { // we want to reexport the module object as named export
2016-09-07 15:46:13 +08:00
content = "/* harmony reexport (module object) */ " + getReexportStatement ( JSON . stringify ( used ) , "" ) ;
2016-02-22 22:40:01 +08:00
} else if ( Array . isArray ( dep . originModule . usedExports ) ) { // we know which exports are used
2016-02-04 06:48:51 +08:00
activeExports = HarmonyModulesHelpers . getActiveExports ( dep . originModule ) ;
2016-09-06 05:41:03 +08:00
items = dep . originModule . usedExports . map ( function ( id ) {
2016-02-04 06:40:41 +08:00
if ( id === "default" ) return ;
if ( activeExports . indexOf ( id ) >= 0 ) return ;
2016-09-06 05:41:03 +08:00
if ( importedModule . isProvided ( id ) === false ) return ;
2016-02-04 06:40:41 +08:00
var exportUsed = dep . originModule . isUsed ( id ) ;
var idUsed = importedModule && importedModule . isUsed ( id ) ;
return [ exportUsed , idUsed ] ;
} ) . filter ( Boolean ) ;
2016-02-17 05:31:12 +08:00
if ( items . length > 0 ) {
2016-09-07 15:46:13 +08:00
content = items . map ( function ( item ) {
return "/* harmony namespace reexport (by used) */ " + getReexportStatement ( JSON . stringify ( item [ 0 ] ) , JSON . stringify ( item [ 1 ] ) ) ;
} ) . join ( "" ) ;
2016-02-17 05:31:12 +08:00
} else content = "/* unused harmony namespace reexport */\n" ;
2016-09-06 05:41:03 +08:00
} else if ( dep . originModule . usedExports && importedModule && Array . isArray ( importedModule . providedExports ) ) { // not sure which exports are used, but we know which are provided
activeExports = HarmonyModulesHelpers . getActiveExports ( dep . originModule ) ;
items = importedModule . providedExports . map ( function ( id ) {
if ( id === "default" ) return ;
if ( activeExports . indexOf ( id ) >= 0 ) return ;
var exportUsed = dep . originModule . isUsed ( id ) ;
var idUsed = importedModule && importedModule . isUsed ( id ) ;
return [ exportUsed , idUsed ] ;
} ) . filter ( Boolean ) ;
if ( items . length > 0 ) {
2016-09-07 15:46:13 +08:00
content = items . map ( function ( item ) {
return "/* harmony namespace reexport (by provided) */ " + getReexportStatement ( JSON . stringify ( item [ 0 ] ) , JSON . stringify ( item [ 1 ] ) ) ;
} ) . join ( "" ) ;
2016-09-06 05:41:03 +08:00
} else content = "/* empty harmony namespace reexport */\n" ;
} else if ( dep . originModule . usedExports ) { // not sure which exports are used and provided
2016-02-04 06:48:51 +08:00
activeExports = HarmonyModulesHelpers . getActiveExports ( dep . originModule ) ;
2016-09-06 05:41:03 +08:00
content = "/* harmony namespace reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in " + name + ") " ;
2015-12-23 23:24:45 +08:00
// Filter out exports which are defined by other exports
// and filter out default export because it cannot be reexported with *
if ( activeExports . length > 0 )
content += "if(" + JSON . stringify ( activeExports . concat ( "default" ) ) + ".indexOf(__WEBPACK_IMPORT_KEY__) < 0) " ;
else
content += "if(__WEBPACK_IMPORT_KEY__ !== 'default') " ;
2016-06-08 06:10:30 +08:00
content += "(function(key) { __webpack_require__.d(exports, key, function() { return " + name + "[key]; }) }(__WEBPACK_IMPORT_KEY__));\n" ;
2016-02-22 20:24:14 +08:00
} else {
content = "/* unused harmony reexport namespace */\n" ;
2015-10-22 03:05:01 +08:00
}
source . insert ( dep . position , content ) ;
} ;