aboutsummaryrefslogtreecommitdiff
path: root/node_modules/vue/src/compiler/to-function.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/vue/src/compiler/to-function.js')
-rw-r--r--node_modules/vue/src/compiler/to-function.js99
1 files changed, 99 insertions, 0 deletions
diff --git a/node_modules/vue/src/compiler/to-function.js b/node_modules/vue/src/compiler/to-function.js
new file mode 100644
index 00000000..7fe0f13f
--- /dev/null
+++ b/node_modules/vue/src/compiler/to-function.js
@@ -0,0 +1,99 @@
+/* @flow */
+
+import { noop, extend } from 'shared/util'
+import { warn as baseWarn, tip } from 'core/util/debug'
+
+type CompiledFunctionResult = {
+ render: Function;
+ staticRenderFns: Array<Function>;
+};
+
+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 = Object.create(null)
+
+ return function compileToFunctions (
+ template: string,
+ options?: CompilerOptions,
+ vm?: Component
+ ): CompiledFunctionResult {
+ options = extend({}, options)
+ const warn = options.warn || baseWarn
+ delete options.warn
+
+ /* 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)
+ res.staticRenderFns = compiled.staticRenderFns.map(code => {
+ return createFunction(code, 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)
+ }
+}