You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
5.3 KiB
127 lines
5.3 KiB
"use strict"; |
|
var __importDefault = (this && this.__importDefault) || function (mod) { |
|
return (mod && mod.__esModule) ? mod : { "default": mod }; |
|
}; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
exports.compileTemplate = void 0; |
|
const assetUrl_1 = __importDefault(require("./templateCompilerModules/assetUrl")); |
|
const srcset_1 = __importDefault(require("./templateCompilerModules/srcset")); |
|
const consolidate = require('consolidate'); |
|
const transpile = require('vue-template-es2015-compiler'); |
|
function compileTemplate(options) { |
|
const { preprocessLang } = options; |
|
const preprocessor = preprocessLang && consolidate[preprocessLang]; |
|
if (preprocessor) { |
|
return actuallyCompile(Object.assign({}, options, { |
|
source: preprocess(options, preprocessor) |
|
})); |
|
} |
|
else if (preprocessLang) { |
|
return { |
|
ast: {}, |
|
code: `var render = function () {}\n` + `var staticRenderFns = []\n`, |
|
source: options.source, |
|
tips: [ |
|
`Component ${options.filename} uses lang ${preprocessLang} for template. Please install the language preprocessor.` |
|
], |
|
errors: [ |
|
`Component ${options.filename} uses lang ${preprocessLang} for template, however it is not installed.` |
|
] |
|
}; |
|
} |
|
else { |
|
return actuallyCompile(options); |
|
} |
|
} |
|
exports.compileTemplate = compileTemplate; |
|
function preprocess(options, preprocessor) { |
|
const { source, filename, preprocessOptions } = options; |
|
const finalPreprocessOptions = Object.assign({ |
|
filename |
|
}, preprocessOptions); |
|
// Consolidate exposes a callback based API, but the callback is in fact |
|
// called synchronously for most templating engines. In our case, we have to |
|
// expose a synchronous API so that it is usable in Jest transforms (which |
|
// have to be sync because they are applied via Node.js require hooks) |
|
let res, err; |
|
preprocessor.render(source, finalPreprocessOptions, (_err, _res) => { |
|
if (_err) |
|
err = _err; |
|
res = _res; |
|
}); |
|
if (err) |
|
throw err; |
|
return res; |
|
} |
|
function actuallyCompile(options) { |
|
const { source, compiler, compilerOptions = {}, transpileOptions = {}, transformAssetUrls, transformAssetUrlsOptions, isProduction = process.env.NODE_ENV === 'production', isFunctional = false, optimizeSSR = false, prettify = true } = options; |
|
const compile = optimizeSSR && compiler.ssrCompile ? compiler.ssrCompile : compiler.compile; |
|
let finalCompilerOptions = compilerOptions; |
|
if (transformAssetUrls) { |
|
const builtInModules = [ |
|
transformAssetUrls === true |
|
? assetUrl_1.default(undefined, transformAssetUrlsOptions) |
|
: assetUrl_1.default(transformAssetUrls, transformAssetUrlsOptions), |
|
srcset_1.default(transformAssetUrlsOptions) |
|
]; |
|
finalCompilerOptions = Object.assign({}, compilerOptions, { |
|
modules: [...builtInModules, ...(compilerOptions.modules || [])], |
|
filename: options.filename |
|
}); |
|
} |
|
const { ast, render, staticRenderFns, tips, errors } = compile(source, finalCompilerOptions); |
|
if (errors && errors.length) { |
|
return { |
|
ast, |
|
code: `var render = function () {}\n` + `var staticRenderFns = []\n`, |
|
source, |
|
tips, |
|
errors |
|
}; |
|
} |
|
else { |
|
const finalTranspileOptions = Object.assign({}, transpileOptions, { |
|
transforms: Object.assign({}, transpileOptions.transforms, { |
|
stripWithFunctional: isFunctional |
|
}) |
|
}); |
|
const toFunction = (code) => { |
|
return `function (${isFunctional ? `_h,_vm` : ``}) {${code}}`; |
|
}; |
|
// transpile code with vue-template-es2015-compiler, which is a forked |
|
// version of Buble that applies ES2015 transforms + stripping `with` usage |
|
let code = transpile(`var __render__ = ${toFunction(render)}\n` + |
|
`var __staticRenderFns__ = [${staticRenderFns.map(toFunction)}]`, finalTranspileOptions) + `\n`; |
|
// #23 we use __render__ to avoid `render` not being prefixed by the |
|
// transpiler when stripping with, but revert it back to `render` to |
|
// maintain backwards compat |
|
code = code.replace(/\s__(render|staticRenderFns)__\s/g, ' $1 '); |
|
if (!isProduction) { |
|
// mark with stripped (this enables Vue to use correct runtime proxy |
|
// detection) |
|
code += `render._withStripped = true`; |
|
if (prettify) { |
|
try { |
|
code = require('prettier').format(code, { |
|
semi: false, |
|
parser: 'babel' |
|
}); |
|
} |
|
catch (e) { |
|
if (e.code === 'MODULE_NOT_FOUND') { |
|
tips.push('The `prettify` option is on, but the dependency `prettier` is not found.\n' + |
|
'Please either turn off `prettify` or manually install `prettier`.'); |
|
} |
|
tips.push(`Failed to prettify component ${options.filename} template source after compilation.`); |
|
} |
|
} |
|
} |
|
return { |
|
ast, |
|
code, |
|
source, |
|
tips, |
|
errors |
|
}; |
|
} |
|
}
|
|
|