11const qs = require ( 'querystring' )
2- const prettier = require ( 'prettier' )
3- const consolidate = require ( 'consolidate' )
42const loaderUtils = require ( 'loader-utils' )
53const compiler = require ( 'vue-template-compiler' )
6- const transpile = require ( 'vue-template-es2015-compiler' )
74const transformAssetUrl = require ( './modules/assetUrl' )
85const transformSrcset = require ( './modules/srcset' )
96const { genTemplateHotReloadCode } = require ( '../hotReload' )
7+ const { compileTemplate } = require ( 'vue-component-compiler' )
108
119// Loader that compiles raw template into JavaScript functions.
1210// This is injected by the global pitcher (../pitch) for template
1311// selection requests initiated from vue files.
1412// Also handles lang="xxx" pre-processing via consolidate if necessary.
15- module . exports = function ( template ) {
13+ module . exports = function ( source ) {
1614 const loaderContext = this
1715 const query = qs . parse ( this . resourceQuery . slice ( 1 ) )
1816
1917 // although this is not the main vue-loader, we can get access to the same
2018 // vue-loader options because we've set an ident in the plugin and used that
2119 // ident to create the request for this loader in the pitcher.
2220 const options = loaderUtils . getOptions ( loaderContext ) || { }
23-
24- const cb = loaderContext . async ( )
25- const compile = template => cb ( null , actuallyCompile (
26- template ,
27- options ,
28- loaderContext ,
29- query
30- ) )
31-
32- if ( query . lang && consolidate [ query . lang ] ) {
33- preprocess (
34- template ,
35- options ,
36- loaderContext ,
37- query . lang ,
38- ( err , template ) => {
39- if ( err ) return cb ( err )
40- compile ( template )
41- }
42- )
43- } else {
44- compile ( template )
45- }
46- }
47-
48- function preprocess ( rawTemplate , options , loaderContext , lang , cb ) {
49- const engineOptions = Object . assign ( {
50- filename : loaderContext . resourcePath
51- } , options . template )
52-
53- consolidate [ lang ] . render ( rawTemplate , engineOptions , ( err , template ) => {
54- if ( err ) {
55- return cb ( err )
56- }
57- cb ( null , template )
58- } )
59- }
60-
61- function actuallyCompile ( sourceTemplate , options , loaderContext , query ) {
6221 const { id } = query
6322 const isServer = loaderContext . target === 'node'
6423 const isProduction = loaderContext . minimize || process . env . NODE_ENV === 'production'
6524 const needsHotReload = ! isServer && ! isProduction && options . hotReload !== false
6625 const defaultModules = [ transformAssetUrl ( options . transformAssetUrl ) , transformSrcset ( ) ]
67- const hasFunctionalTemplate = query . functional
26+ const isFunctional = query . functional
6827
6928 const userCompilerOptions = options . compilerOptions || { }
70-
7129 const compilerOptions = Object . assign ( { } , userCompilerOptions , {
7230 scopeId : query . scoped ? `data-v-${ id } ` : null ,
7331 modules : defaultModules . concat ( userCompilerOptions . modules || [ ] ) ,
7432 comments : query . comments
7533 } )
7634
77- // support user compiler
78- const compilerToUse = options . compiler || compiler
35+ const preprocessOptions = Object . assign ( {
36+ filename : this . resourcePath
37+ } , options . template )
7938
80- const compile =
81- isServer && compilerToUse . ssrCompile && options . optimizeSSR !== false
82- ? compilerToUse . ssrCompile
83- : compilerToUse . compile
39+ // for vue-component-compiler
40+ const finalOptions = {
41+ source,
42+ // allow using custom compiler via options
43+ compiler : options . compiler || compiler ,
44+ compilerOptions,
45+ // handle possible lang="xxx"
46+ preprocessLang : query . lang ,
47+ preprocessOptions,
48+ // allow customizing behavior of vue-template-es2015-compiler
49+ transpileOptions : options . transpileOptions ,
50+ isProduction,
51+ isFunctional,
52+ optimizeSSR : isServer && options . optimizeSSR !== false
53+ }
8454
85- const compiled = compile ( sourceTemplate , compilerOptions )
55+ const compiled = compileTemplate ( finalOptions )
8656
8757 // tips
8858 if ( compiled . tips && compiled . tips . length ) {
@@ -91,65 +61,29 @@ function actuallyCompile (sourceTemplate, options, loaderContext, query) {
9161 } )
9262 }
9363
94- let code
64+ // errors
9565 if ( compiled . errors && compiled . errors . length ) {
9666 loaderContext . emitError (
97- `\n Error compiling template:\n${ pad ( sourceTemplate ) } \n` +
67+ `\n Error compiling template:\n${ pad ( compiled . source ) } \n` +
9868 compiled . errors . map ( e => ` - ${ e } ` ) . join ( '\n' ) +
9969 '\n'
10070 )
101- code =
102- `export var render = function () {}\n` +
103- `export var staticRenderFns = []`
104- } else {
105- const bubleOptions = options . buble || {
106- transforms : {
107- stripWithFunctional : hasFunctionalTemplate
108- }
109- }
110- const staticRenderFns = compiled . staticRenderFns . map ( fn =>
111- toFunction ( fn , hasFunctionalTemplate )
112- )
113-
114- code =
115- transpile (
116- 'var render = ' +
117- toFunction ( compiled . render , hasFunctionalTemplate ) +
118- '\n' +
119- 'var staticRenderFns = [' +
120- staticRenderFns . join ( ',' ) +
121- ']' ,
122- bubleOptions
123- ) + '\n'
124-
125- // prettify render fn
126- if ( ! isProduction ) {
127- code = prettier . format ( code , { semi : false } )
128- }
129-
130- // mark with stripped (this enables Vue to use correct runtime proxy detection)
131- if ( ! isProduction && bubleOptions . transforms . stripWith !== false ) {
132- code += `render._withStripped = true\n`
133- }
134- code += `export { render, staticRenderFns }`
13571 }
13672
73+ let { code } = compiled
74+
13775 // hot-reload
13876 if ( needsHotReload ) {
13977 code += genTemplateHotReloadCode ( id )
14078 }
14179
80+ // finish with ESM exports
81+ code += `export { render, staticRenderFns }`
14282 return code
14383}
14484
145- function toFunction ( code , hasFunctionalTemplate ) {
146- return (
147- 'function (' + ( hasFunctionalTemplate ? '_h,_vm' : '' ) + ') {' + code + '}'
148- )
149- }
150-
151- function pad ( sourceTemplate ) {
152- return sourceTemplate
85+ function pad ( source ) {
86+ return source
15387 . split ( / \r ? \n / )
15488 . map ( line => ` ${ line } ` )
15589 . join ( '\n' )
0 commit comments