| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /* @flow */
- import { noop } from 'shared/util'
- import { warn, tip } from 'core/util/debug'
- function createFunction (code, errors) {
- try {
- return new Function(code)
- } catch (err) {
- errors.push({ err, code })
- return noop
- }
- }
- export function createCompileToFunctionFn (compile: Function): Function {
- const cache: {
- [key: string]: CompiledFunctionResult;
- } = Object.create(null)
- return function compileToFunctions (
- template: string,
- options?: CompilerOptions,
- vm?: Component
- ): CompiledFunctionResult {
- options = options || {}
- /* istanbul ignore if */
- if (process.env.NODE_ENV !== 'production') {
- // detect possible CSP restriction
- try {
- new Function('return 1')
- } catch (e) {
- if (e.toString().match(/unsafe-eval|CSP/)) {
- warn(
- 'It seems you are using the standalone build of Vue.js in an ' +
- 'environment with Content Security Policy that prohibits unsafe-eval. ' +
- 'The template compiler cannot work in this environment. Consider ' +
- 'relaxing the policy to allow unsafe-eval or pre-compiling your ' +
- 'templates into render functions.'
- )
- }
- }
- }
- // check cache
- const key = options.delimiters
- ? String(options.delimiters) + template
- : template
- if (cache[key]) {
- return cache[key]
- }
- // compile
- const compiled = compile(template, options)
- // check compilation errors/tips
- if (process.env.NODE_ENV !== 'production') {
- if (compiled.errors && compiled.errors.length) {
- warn(
- `Error compiling template:\n\n${template}\n\n` +
- compiled.errors.map(e => `- ${e}`).join('\n') + '\n',
- vm
- )
- }
- if (compiled.tips && compiled.tips.length) {
- compiled.tips.forEach(msg => tip(msg, vm))
- }
- }
- // turn code into functions
- const res = {}
- const fnGenErrors = []
- res.render = createFunction(compiled.render, fnGenErrors)
- const l = compiled.staticRenderFns.length
- res.staticRenderFns = new Array(l)
- for (let i = 0; i < l; i++) {
- res.staticRenderFns[i] = createFunction(compiled.staticRenderFns[i], fnGenErrors)
- }
- // check function generation errors.
- // this should only happen if there is a bug in the compiler itself.
- // mostly for codegen development use
- /* istanbul ignore if */
- if (process.env.NODE_ENV !== 'production') {
- if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {
- warn(
- `Failed to generate render function:\n\n` +
- fnGenErrors.map(({ err, code }) => `${err.toString()} in\n\n${code}\n`).join('\n'),
- vm
- )
- }
- }
- return (cache[key] = res)
- }
- }
|