123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- /* @flow */
- import { extend } from 'shared/util'
- import { detectErrors } from './error-detector'
- import { createCompileToFunctionFn } from './to-function'
- export function createCompilerCreator (baseCompile: Function): Function {
- return function createCompiler (baseOptions: CompilerOptions) {
- function compile (
- template: string,
- options?: CompilerOptions
- ): CompiledResult {
- const finalOptions = Object.create(baseOptions)
- const errors = []
- const tips = []
- let warn = (msg, range, tip) => {
- (tip ? tips : errors).push(msg)
- }
- if (options) {
- if (process.env.NODE_ENV !== 'production' && options.outputSourceRange) {
- // $flow-disable-line
- const leadingSpaceLength = template.match(/^\s*/)[0].length
- warn = (msg, range, tip) => {
- const data: WarningMessage = { msg }
- if (range) {
- if (range.start != null) {
- data.start = range.start + leadingSpaceLength
- }
- if (range.end != null) {
- data.end = range.end + leadingSpaceLength
- }
- }
- (tip ? tips : errors).push(data)
- }
- }
- // merge custom modules
- if (options.modules) {
- finalOptions.modules =
- (baseOptions.modules || []).concat(options.modules)
- }
- // merge custom directives
- if (options.directives) {
- finalOptions.directives = extend(
- Object.create(baseOptions.directives || null),
- options.directives
- )
- }
- // copy other options
- for (const key in options) {
- if (key !== 'modules' && key !== 'directives') {
- finalOptions[key] = options[key]
- }
- }
- }
- finalOptions.warn = warn
- const compiled = baseCompile(template.trim(), finalOptions)
- if (process.env.NODE_ENV !== 'production') {
- detectErrors(compiled.ast, warn)
- }
- compiled.errors = errors
- compiled.tips = tips
- return compiled
- }
- return {
- compile,
- compileToFunctions: createCompileToFunctionFn(compile)
- }
- }
- }
|