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" ) ;
2018-04-06 13:44:58 +08:00
/ * *
* @ typedef CommentOptions
* @ property { string = } request
* @ property { string = } chunkName
* @ property { string = } chunkReason
* @ property { string = } message
* @ property { string = } exportName
* /
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-06 01:44:15 +08:00
comment (
/** @type {CommentOptions} */ {
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 } ) {
2017-12-19 22:50:09 +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 } ) {
if ( ! module )
return this . missingModule ( {
request
} ) ;
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 } ) {
if ( ! module )
return this . missingModule ( {
request
} ) ;
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 } ) {
2017-12-19 22:50:09 +08:00
const rawModule = this . moduleRaw ( {
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" ) {
2017-12-19 22:50:09 +08:00
return rawModule ;
2018-02-25 09:00:20 +08:00
} else if ( exportsType === "named" ) {
2018-03-26 22:56:10 +08:00
return ` Object.assign({/* fake namespace object */}, ${ rawModule } , { "default": ${ rawModule } }) ` ;
2018-02-25 09:00:20 +08:00
} else if ( strict ) {
2017-12-19 22:50:09 +08:00
return ` Object({ /* fake namespace object */ "default": ${ rawModule } }) ` ;
} else {
2018-03-26 22:56:10 +08:00
return ` Object(function() { var module = ${ rawModule } ; return typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }); }()) ` ;
2017-12-19 22:50:09 +08:00
}
}
2018-02-25 09:00:20 +08:00
moduleNamespacePromise ( { block , module , request , message , strict , weak } ) {
if ( ! module )
return this . missingModulePromise ( {
request
} ) ;
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
}
const rawModule = this . moduleRaw ( {
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 ) {
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-03-26 22:56:10 +08:00
getModuleFunction = ` function() { ${ header } var module = ${ rawModule } ; return Object.assign({/* fake namespace object */}, module, { "default": module }); } ` ;
2018-02-25 09:00:20 +08:00
} else if ( strict ) {
2018-03-26 22:56:10 +08:00
getModuleFunction = ` function() { ${ header } return { /* fake namespace object */ "default": ${ rawModule } }; } ` ;
2017-12-19 22:50:09 +08:00
} else {
2018-03-26 22:56:10 +08:00
getModuleFunction = ` function() { ${ header } var module = ${ rawModule } ; return typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }); } ` ;
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 } ) {
if ( ! module )
return this . missingModuleStatement ( {
request
} ) ;
2017-12-19 22:50:09 +08:00
const comment = this . comment ( {
request
} ) ;
const optDeclaration = update ? "" : "var " ;
2017-12-23 01:23:20 +08:00
const exportsType = module . buildMeta && module . buildMeta . exportsType ;
2018-03-26 22:56:10 +08:00
let content = ` /* harmony import */ ${ optDeclaration } ${ importVar } = __webpack_require__( ${ comment } ${ JSON . stringify (
module . id
) } ) ; \ 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" ) {
if ( Array . isArray ( module . buildMeta . providedExports ) )
2018-03-26 22:56:10 +08:00
content += ` ${ optDeclaration } ${ importVar } _namespace = /*#__PURE__*/Object.assign({}, ${ importVar } , {"default": ${ importVar } }); \n ` ;
2017-12-23 01:23:20 +08:00
else
2018-03-26 22:56:10 +08:00
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 ,
2018-02-10 00:35:28 +08:00
request ,
2017-12-19 22:50:09 +08:00
exportName ,
originModule ,
asiSafe ,
isCall ,
callContext ,
importVar
} ) {
2018-02-25 09:00:20 +08:00
if ( ! module )
return this . missingModule ( {
request
} ) ;
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 ) {
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-02-25 09:00:20 +08:00
if ( asiSafe ) {
2018-03-26 22:56:10 +08:00
return ` /*#__PURE__*/{ /* fake namespace object */ "default": ${ importVar } } ` ;
2017-12-19 22:50:09 +08:00
} else {
2018-03-26 22:56:10 +08:00
return ` /*#__PURE__*/Object({ /* fake namespace object */ "default": ${ 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 ) {
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
} ;