2017-12-07 17:31:00 +08:00
/ *
MIT License http : //www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @ sokra
* /
"use strict" ;
2017-12-19 22:50:09 +08:00
const Template = require ( "./Template" ) ;
2017-12-07 17:31:00 +08:00
module . exports = class RuntimeTemplate {
constructor ( outputOptions , requestShortener ) {
this . outputOptions = outputOptions || { } ;
this . requestShortener = requestShortener ;
}
2017-12-19 22:50:09 +08:00
comment ( {
request ,
chunkName ,
chunkReason ,
message ,
exportName
} ) {
let content ;
if ( this . outputOptions . pathinfo ) {
content = [ message , request , chunkName , chunkReason ] . filter ( Boolean ) . map ( item => this . requestShortener . shorten ( item ) ) . join ( " | " ) ;
} else {
content = [ message , chunkName , chunkReason ] . filter ( Boolean ) . map ( item => this . requestShortener . shorten ( item ) ) . join ( " | " ) ;
}
if ( ! content ) return "" ;
if ( this . outputOptions . pathinfo ) {
2017-12-23 15:11:28 +08:00
return Template . toComment ( content ) + " " ;
2017-12-19 22:50:09 +08:00
} else {
2017-12-23 15:11:28 +08:00
return Template . toNormalComment ( content ) + " " ;
2017-12-19 22:50:09 +08:00
}
}
throwMissingModuleErrorFunction ( {
request
} ) {
const err = ` Cannot find module " ${ request } " ` ;
return ` function webpackMissingModule() { var e = new Error( ${ JSON . stringify ( err ) } ); e.code = 'MODULE_NOT_FOUND'; throw e; } ` ;
}
missingModule ( {
request
} ) {
return ` !( ${ this . throwMissingModuleErrorFunction ( { request } )}()) ` ;
}
missingModuleStatement ( {
request
} ) {
return ` ${ this . missingModule ( { request } )}; \n ` ;
}
missingModulePromise ( {
request
} ) {
return ` Promise.resolve().then( ${ this . throwMissingModuleErrorFunction ( { request } )}) ` ;
}
moduleId ( {
module ,
request
} ) {
if ( ! module ) return this . missingModule ( {
request
} ) ;
return ` ${ this . comment ( { request } )} ${ JSON . stringify ( module . id ) } ` ;
}
moduleRaw ( {
module ,
request
} ) {
if ( ! module ) return this . missingModule ( {
request
} ) ;
return ` __webpack_require__( ${ this . moduleId ( { module , request } )}) ` ;
}
moduleExports ( {
module ,
request
} ) {
return this . moduleRaw ( {
module ,
request
} ) ;
}
moduleNamespace ( {
module ,
request ,
strict
} ) {
const rawModule = this . moduleRaw ( {
module ,
request
} ) ;
2017-12-23 01:23:20 +08:00
const exportsType = module . buildMeta && module . buildMeta . exportsType ;
if ( exportsType === "namespace" ) {
2017-12-19 22:50:09 +08:00
return rawModule ;
2017-12-23 01:23:20 +08:00
} else if ( exportsType === "named" ) {
return ` Object.assign({/* fake namespace object */}, ${ rawModule } , { "default": ${ rawModule } }) ` ;
2017-12-19 22:50:09 +08:00
} else if ( strict ) {
return ` Object({ /* fake namespace object */ "default": ${ rawModule } }) ` ;
} else {
return ` Object(function() { var module = ${ rawModule } ; return typeof module === "object" && module && module.__esModule ? module : { /* fake namespace object */ "default": module }; }()) ` ;
}
}
moduleNamespacePromise ( {
block ,
module ,
request ,
message ,
strict ,
weak
} ) {
if ( ! module ) return this . missingModulePromise ( {
request
} ) ;
const promise = this . blockPromise ( {
block ,
message
} ) ;
let getModuleFunction ;
let idExpr = JSON . stringify ( module . id ) ;
const comment = this . comment ( {
request
} ) ;
let header = "" ;
if ( weak ) {
if ( idExpr . length > 8 ) { // 'var x="nnnnnn";x,"+x+",x' vs '"nnnnnn",nnnnnn,"nnnnnn"'
header += ` var id = ${ idExpr } ; ` ;
idExpr = "id" ;
}
header += ` if(!__webpack_require__.m[ ${ idExpr } ]) { var e = new Error("Module '" + ${ idExpr } + "' is not available (weak dependency)"); e.code = 'MODULE_NOT_FOUND'; throw e; } ` ;
}
const rawModule = this . moduleRaw ( {
module ,
request
} ) ;
2017-12-23 01:23:20 +08:00
const exportsType = module . buildMeta && module . buildMeta . exportsType ;
if ( exportsType === "namespace" ) {
2017-12-19 22:50:09 +08:00
if ( header ) {
getModuleFunction = ` function() { ${ header } return ${ rawModule } ; } ` ;
} else {
getModuleFunction = ` __webpack_require__.bind(null, ${ comment } ${ idExpr } ) ` ;
}
2017-12-23 01:23:20 +08:00
} else if ( exportsType === "named" ) {
getModuleFunction = ` function() { ${ header } var module = ${ rawModule } ; return Object.assign({/* fake namespace object */}, module, { "default": module }); } ` ;
2017-12-19 22:50:09 +08:00
} else if ( strict ) {
getModuleFunction = ` function() { ${ header } return { /* fake namespace object */ "default": ${ rawModule } }; } ` ;
} else {
getModuleFunction = ` function() { ${ header } var module = ${ rawModule } ; return typeof module === "object" && module && module.__esModule ? module : { /* fake namespace object */ "default": module }; } ` ;
}
return ` ${ promise || "Promise.resolve()" } .then( ${ getModuleFunction } ) ` ;
}
importStatement ( {
update ,
module ,
request ,
importVar ,
originModule
} ) {
if ( ! module ) return this . missingModuleStatement ( {
request
} ) ;
const comment = this . comment ( {
request
} ) ;
const optDeclaration = update ? "" : "var " ;
2017-12-23 01:23:20 +08:00
const exportsType = module . buildMeta && module . buildMeta . exportsType ;
let content = ` /* harmony import */ ${ optDeclaration } ${ importVar } = __webpack_require__( ${ comment } ${ JSON . stringify ( module . id ) } ); \n ` ;
if ( ! exportsType && ! originModule . buildMeta . strictHarmonyModule ) {
content += ` /* harmony import */ ${ optDeclaration } ${ importVar } _default = /*#__PURE__*/__webpack_require__.n( ${ importVar } ); \n ` ;
}
if ( exportsType === "named" ) {
if ( Array . isArray ( module . buildMeta . providedExports ) )
content += ` ${ optDeclaration } ${ importVar } _namespace = /*#__PURE__*/Object.assign({}, ${ importVar } , {"default": ${ importVar } }); \n ` ;
else
content += ` ${ optDeclaration } ${ importVar } _namespace = /*#__PURE__*/{ /* fake namespace object */ "default": ${ importVar } }; \n ` ;
2017-12-19 22:50:09 +08:00
}
2017-12-23 01:23:20 +08:00
return content ;
2017-12-19 22:50:09 +08:00
}
exportFromImport ( {
module ,
exportName ,
originModule ,
asiSafe ,
isCall ,
callContext ,
importVar
} ) {
2017-12-23 01:23:20 +08:00
const exportsType = module . buildMeta && module . buildMeta . exportsType ;
2017-12-19 22:50:09 +08:00
2017-12-23 01:23:20 +08:00
if ( ! exportsType ) {
2017-12-19 22:50:09 +08:00
if ( exportName === "default" ) {
if ( ! originModule . buildMeta . strictHarmonyModule ) {
if ( isCall )
return ` ${ importVar } _default() ` ;
else if ( asiSafe )
return ` ( ${ importVar } _default()) ` ;
else
return ` ${ importVar } _default.a ` ;
} else {
return importVar ;
}
} else if ( originModule . buildMeta . strictHarmonyModule ) {
if ( exportName ) {
return "/* non-default import from non-esm module */undefined" ;
} else if ( ! exportName ) {
if ( asiSafe ) {
2017-12-23 01:23:20 +08:00
return ` /*#__PURE__*/{ /* fake namespace object */ "default": ${ importVar } } ` ;
2017-12-19 22:50:09 +08:00
} else {
2017-12-23 01:23:20 +08:00
return ` /*#__PURE__*/Object({ /* fake namespace object */ "default": ${ importVar } }) ` ;
2017-12-19 22:50:09 +08:00
}
}
}
}
2017-12-23 01:23:20 +08:00
if ( exportsType === "named" ) {
if ( exportName === "default" ) {
return importVar ;
} else if ( ! exportName ) {
return ` ${ importVar } _namespace ` ;
}
}
2017-12-19 22:50:09 +08:00
if ( exportName ) {
const used = module . isUsed ( exportName ) ;
const comment = used !== exportName ? Template . toNormalComment ( exportName ) + " " : "" ;
const access = ` ${ importVar } [ ${ comment } ${ JSON . stringify ( used ) } ] ` ;
if ( isCall ) {
if ( callContext === false && asiSafe )
return ` (0, ${ access } ) ` ;
else if ( callContext === false )
return ` Object( ${ access } ) ` ;
}
return access ;
} else {
return importVar ;
}
}
blockPromise ( {
block ,
message
} ) {
2018-01-20 00:06:59 +08:00
if ( ! block || ! block . chunkGroup || block . chunkGroup . chunks . length === 0 ) {
2017-12-19 22:50:09 +08:00
const comment = this . comment ( {
message
} ) ;
2017-12-23 15:11:28 +08:00
return ` Promise.resolve( ${ comment . trim ( ) } ) ` ;
2017-12-19 22:50:09 +08:00
}
2018-01-20 00:06:59 +08:00
const chunks = block . chunkGroup . chunks . filter ( chunk => ! chunk . hasRuntime ( ) && chunk . id !== null ) ;
2017-12-19 22:50:09 +08:00
const comment = this . comment ( {
message ,
chunkName : block . chunkName ,
chunkReason : block . chunkReason
} ) ;
if ( chunks . length === 1 ) {
const chunkId = JSON . stringify ( chunks [ 0 ] . id ) ;
return ` __webpack_require__.e( ${ comment } ${ chunkId } ) ` ;
} else if ( chunks . length > 0 ) {
const requireChunkId = chunk => ` __webpack_require__.e( ${ JSON . stringify ( chunk . id ) } ) ` ;
2017-12-23 15:11:28 +08:00
return ` Promise.all( ${ comment . trim ( ) } [ ${ chunks . map ( requireChunkId ) . join ( ", " ) } ]) ` ;
2017-12-19 22:50:09 +08:00
} else {
2017-12-23 15:11:28 +08:00
return ` Promise.resolve( ${ comment . trim ( ) } ) ` ;
2017-12-19 22:50:09 +08:00
}
}
onError ( ) {
return "__webpack_require__.oe" ;
}
defineEsModuleFlagStatement ( {
exportsArgument
} ) {
return ` __webpack_require__.r( ${ exportsArgument } ); \n ` ;
}
2017-12-07 17:31:00 +08:00
} ;