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
2018-04-12 00:25:50 +08:00
/ * *
* Add a comment
2018-04-12 16:01:09 +08:00
* @ param { object } options Information content of the comment
* @ param { string = } options . request request string used originally
* @ param { string = } options . chunkName name of the chunk referenced
* @ param { string = } options . chunkReason reason information of the chunk
* @ param { string = } options . message additional message
* @ param { string = } options . exportName name of the export
2018-05-08 20:31:51 +08:00
* @ returns { string } comment
2018-04-12 00:25:50 +08:00
* /
comment ( { request , chunkName , chunkReason , message , exportName } ) {
2017-12-19 22:50:09 +08:00
let content ;
2018-02-25 09:00:20 +08:00
if ( this . outputOptions . pathinfo ) {
content = [ message , request , chunkName , chunkReason ]
. filter ( Boolean )
. map ( item => this . requestShortener . shorten ( item ) )
. join ( " | " ) ;
2017-12-19 22:50:09 +08:00
} else {
2018-02-25 09:00:20 +08:00
content = [ message , chunkName , chunkReason ]
. filter ( Boolean )
. map ( item => this . requestShortener . shorten ( item ) )
. join ( " | " ) ;
2017-12-19 22:50:09 +08:00
}
2018-02-25 09:00:20 +08:00
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
}
}
2018-02-25 09:00:20 +08:00
throwMissingModuleErrorFunction ( { request } ) {
2018-05-15 14:16:39 +08:00
const err = ` Cannot find module ' ${ request } ' ` ;
2018-02-25 09:00:20 +08:00
return ` function webpackMissingModule() { var e = new Error( ${ JSON . stringify (
err
) } ) ; e . code = 'MODULE_NOT_FOUND' ; throw e ; } ` ;
2017-12-19 22:50:09 +08:00
}
2018-02-25 09:00:20 +08:00
missingModule ( { request } ) {
2017-12-19 22:50:09 +08:00
return ` !( ${ this . throwMissingModuleErrorFunction ( { request } )}()) ` ;
}
2018-02-25 09:00:20 +08:00
missingModuleStatement ( { request } ) {
2017-12-19 22:50:09 +08:00
return ` ${ this . missingModule ( { request } )}; \n ` ;
}
2018-02-25 09:00:20 +08:00
missingModulePromise ( { request } ) {
return ` Promise.resolve().then( ${ this . throwMissingModuleErrorFunction ( {
request
} ) } ) ` ;
2017-12-19 22:50:09 +08:00
}
2018-02-25 09:00:20 +08:00
moduleId ( { module , request } ) {
2018-05-28 03:47:23 +08:00
if ( ! module ) {
2018-02-25 09:00:20 +08:00
return this . missingModule ( {
request
} ) ;
2018-05-28 03:47:23 +08:00
}
if ( module . id === null ) {
throw new Error (
` RuntimeTemplate.moduleId(): Module ${ module . identifier ( ) } has no id. This should not happen. `
) ;
}
2017-12-19 22:50:09 +08:00
return ` ${ this . comment ( { request } )} ${ JSON . stringify ( module . id ) } ` ;
}
2018-02-25 09:00:20 +08:00
moduleRaw ( { module , request } ) {
2018-05-29 20:50:40 +08:00
if ( ! module ) {
2018-02-25 09:00:20 +08:00
return this . missingModule ( {
request
} ) ;
2018-05-29 20:50:40 +08:00
}
2017-12-19 22:50:09 +08:00
return ` __webpack_require__( ${ this . moduleId ( { module , request } )}) ` ;
}
2018-02-25 09:00:20 +08:00
moduleExports ( { module , request } ) {
2017-12-19 22:50:09 +08:00
return this . moduleRaw ( {
module ,
request
} ) ;
}
2018-02-25 09:00:20 +08:00
moduleNamespace ( { module , request , strict } ) {
2018-05-29 20:50:40 +08:00
if ( ! module ) {
2018-05-03 00:09:24 +08:00
return this . missingModule ( {
request
} ) ;
2018-05-29 20:50:40 +08:00
}
2018-05-03 00:09:24 +08:00
const moduleId = this . moduleId ( {
2017-12-19 22:50:09 +08:00
module ,
request
} ) ;
2017-12-23 01:23:20 +08:00
const exportsType = module . buildMeta && module . buildMeta . exportsType ;
2018-02-25 09:00:20 +08:00
if ( exportsType === "namespace" ) {
2018-05-03 00:09:24 +08:00
const rawModule = this . moduleRaw ( {
module ,
request
} ) ;
2017-12-19 22:50:09 +08:00
return rawModule ;
2018-02-25 09:00:20 +08:00
} else if ( exportsType === "named" ) {
2018-05-03 00:09:24 +08:00
return ` __webpack_require__.t( ${ moduleId } , 3) ` ;
2018-02-25 09:00:20 +08:00
} else if ( strict ) {
2018-05-03 00:09:24 +08:00
return ` __webpack_require__.t( ${ moduleId } , 1) ` ;
2017-12-19 22:50:09 +08:00
} else {
2018-05-03 00:09:24 +08:00
return ` __webpack_require__.t( ${ moduleId } , 7) ` ;
2017-12-19 22:50:09 +08:00
}
}
2018-02-25 09:00:20 +08:00
moduleNamespacePromise ( { block , module , request , message , strict , weak } ) {
2018-05-28 03:47:23 +08:00
if ( ! module ) {
2018-02-25 09:00:20 +08:00
return this . missingModulePromise ( {
request
} ) ;
2018-05-28 03:47:23 +08:00
}
if ( module . id === null ) {
throw new Error (
` RuntimeTemplate.moduleNamespacePromise(): Module ${ module . identifier ( ) } has no id. This should not happen. `
) ;
}
2017-12-19 22:50:09 +08:00
const promise = this . blockPromise ( {
block ,
message
} ) ;
let getModuleFunction ;
let idExpr = JSON . stringify ( module . id ) ;
const comment = this . comment ( {
request
} ) ;
let header = "" ;
2018-02-25 09:00:20 +08:00
if ( weak ) {
if ( idExpr . length > 8 ) {
// 'var x="nnnnnn";x,"+x+",x' vs '"nnnnnn",nnnnnn,"nnnnnn"'
2017-12-19 22:50:09 +08:00
header += ` var id = ${ idExpr } ; ` ;
idExpr = "id" ;
}
2018-03-26 22:56:10 +08:00
header += ` if(!__webpack_require__.m[ ${ idExpr } ]) { var e = new Error("Module '" + ${ idExpr } + "' is not available (weak dependency)"); e.code = 'MODULE_NOT_FOUND'; throw e; } ` ;
2017-12-19 22:50:09 +08:00
}
2018-05-03 00:09:24 +08:00
const moduleId = this . moduleId ( {
2017-12-19 22:50:09 +08:00
module ,
request
} ) ;
2017-12-23 01:23:20 +08:00
const exportsType = module . buildMeta && module . buildMeta . exportsType ;
2018-02-25 09:00:20 +08:00
if ( exportsType === "namespace" ) {
if ( header ) {
2018-05-03 00:09:24 +08:00
const rawModule = this . moduleRaw ( {
module ,
request
} ) ;
2017-12-19 22:50:09 +08:00
getModuleFunction = ` function() { ${ header } return ${ rawModule } ; } ` ;
} else {
2018-03-26 22:56:10 +08:00
getModuleFunction = ` __webpack_require__.bind(null, ${ comment } ${ idExpr } ) ` ;
2017-12-19 22:50:09 +08:00
}
2018-02-25 09:00:20 +08:00
} else if ( exportsType === "named" ) {
2018-05-03 00:09:24 +08:00
if ( header ) {
getModuleFunction = ` function() { ${ header } return __webpack_require__.t( ${ moduleId } , 3); } ` ;
} else {
getModuleFunction = ` __webpack_require__.t.bind(null, ${ comment } ${ idExpr } , 3) ` ;
}
2018-02-25 09:00:20 +08:00
} else if ( strict ) {
2018-05-03 00:09:24 +08:00
if ( header ) {
getModuleFunction = ` function() { ${ header } return __webpack_require__.t( ${ moduleId } , 1); } ` ;
} else {
getModuleFunction = ` __webpack_require__.t.bind(null, ${ comment } ${ idExpr } , 1) ` ;
}
2017-12-19 22:50:09 +08:00
} else {
2018-05-03 00:09:24 +08:00
if ( header ) {
getModuleFunction = ` function() { ${ header } return __webpack_require__.t( ${ moduleId } , 7); } ` ;
} else {
getModuleFunction = ` __webpack_require__.t.bind(null, ${ comment } ${ idExpr } , 7) ` ;
}
2017-12-19 22:50:09 +08:00
}
return ` ${ promise || "Promise.resolve()" } .then( ${ getModuleFunction } ) ` ;
}
2018-02-25 09:00:20 +08:00
importStatement ( { update , module , request , importVar , originModule } ) {
2018-05-28 03:47:23 +08:00
if ( ! module ) {
2018-02-25 09:00:20 +08:00
return this . missingModuleStatement ( {
request
} ) ;
2018-05-28 03:47:23 +08:00
}
2018-05-03 00:09:24 +08:00
const moduleId = this . moduleId ( {
module ,
2017-12-19 22:50:09 +08:00
request
} ) ;
const optDeclaration = update ? "" : "var " ;
2017-12-23 01:23:20 +08:00
const exportsType = module . buildMeta && module . buildMeta . exportsType ;
2018-05-03 00:09:24 +08:00
let content = ` /* harmony import */ ${ optDeclaration } ${ importVar } = __webpack_require__( ${ moduleId } ); \n ` ;
2017-12-23 01:23:20 +08:00
2018-02-25 09:00:20 +08:00
if ( ! exportsType && ! originModule . buildMeta . strictHarmonyModule ) {
2018-03-26 22:56:10 +08:00
content += ` /* harmony import */ ${ optDeclaration } ${ importVar } _default = /*#__PURE__*/__webpack_require__.n( ${ importVar } ); \n ` ;
2017-12-23 01:23:20 +08:00
}
2018-02-25 09:00:20 +08:00
if ( exportsType === "named" ) {
2018-05-29 20:50:40 +08:00
if ( Array . isArray ( module . buildMeta . providedExports ) ) {
2018-05-03 00:09:24 +08:00
content += ` ${ optDeclaration } ${ importVar } _namespace = /*#__PURE__*/__webpack_require__.t( ${ moduleId } , 1); \n ` ;
2018-05-29 20:50:40 +08:00
} else {
2018-05-03 00:09:24 +08:00
content += ` ${ optDeclaration } ${ importVar } _namespace = /*#__PURE__*/__webpack_require__.t( ${ moduleId } ); \n ` ;
2018-05-29 20:50:40 +08:00
}
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 ,
2018-02-10 00:35:28 +08:00
request ,
2017-12-19 22:50:09 +08:00
exportName ,
originModule ,
asiSafe ,
isCall ,
callContext ,
importVar
} ) {
2018-05-29 20:50:40 +08:00
if ( ! module ) {
2018-02-25 09:00:20 +08:00
return this . missingModule ( {
request
} ) ;
2018-05-29 20:50:40 +08:00
}
2017-12-23 01:23:20 +08:00
const exportsType = module . buildMeta && module . buildMeta . exportsType ;
2017-12-19 22:50:09 +08:00
2018-02-25 09:00:20 +08:00
if ( ! exportsType ) {
if ( exportName === "default" ) {
if ( ! originModule . buildMeta . strictHarmonyModule ) {
2018-05-29 20:50:40 +08:00
if ( isCall ) {
return ` ${ importVar } _default() ` ;
} else if ( asiSafe ) {
return ` ( ${ importVar } _default()) ` ;
} else {
return ` ${ importVar } _default.a ` ;
}
2017-12-19 22:50:09 +08:00
} else {
return importVar ;
}
2018-02-25 09:00:20 +08:00
} else if ( originModule . buildMeta . strictHarmonyModule ) {
if ( exportName ) {
2017-12-19 22:50:09 +08:00
return "/* non-default import from non-esm module */undefined" ;
2018-04-12 00:23:21 +08:00
} else {
2018-05-03 00:09:24 +08:00
return ` /*#__PURE__*/__webpack_require__.t( ${ importVar } ) ` ;
2017-12-19 22:50:09 +08:00
}
}
}
2018-02-25 09:00:20 +08:00
if ( exportsType === "named" ) {
if ( exportName === "default" ) {
2017-12-23 01:23:20 +08:00
return importVar ;
2018-02-25 09:00:20 +08:00
} else if ( ! exportName ) {
2017-12-23 01:23:20 +08:00
return ` ${ importVar } _namespace ` ;
}
}
2018-02-25 09:00:20 +08:00
if ( exportName ) {
2017-12-19 22:50:09 +08:00
const used = module . isUsed ( exportName ) ;
2018-02-25 09:00:20 +08:00
const comment =
used !== exportName ? Template . toNormalComment ( exportName ) + " " : "" ;
2017-12-19 22:50:09 +08:00
const access = ` ${ importVar } [ ${ comment } ${ JSON . stringify ( used ) } ] ` ;
2018-02-25 09:00:20 +08:00
if ( isCall ) {
2018-05-29 20:50:40 +08:00
if ( callContext === false && asiSafe ) {
return ` (0, ${ access } ) ` ;
} else if ( callContext === false ) {
return ` Object( ${ access } ) ` ;
}
2017-12-19 22:50:09 +08:00
}
return access ;
} else {
return importVar ;
}
}
2018-02-25 09:00:20 +08:00
blockPromise ( { block , message } ) {
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-02-25 09:00:20 +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
} ) ;
2018-02-25 09:00:20 +08:00
if ( chunks . length === 1 ) {
2017-12-19 22:50:09 +08:00
const chunkId = JSON . stringify ( chunks [ 0 ] . id ) ;
return ` __webpack_require__.e( ${ comment } ${ chunkId } ) ` ;
2018-02-25 09:00:20 +08:00
} else if ( chunks . length > 0 ) {
const requireChunkId = chunk =>
` __webpack_require__.e( ${ JSON . stringify ( chunk . id ) } ) ` ;
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" ;
}
2018-02-25 09:00:20 +08:00
defineEsModuleFlagStatement ( { exportsArgument } ) {
2017-12-19 22:50:09 +08:00
return ` __webpack_require__.r( ${ exportsArgument } ); \n ` ;
}
2017-12-07 17:31:00 +08:00
} ;