From 26105034da4fcce7ac883c899d781f016559310d Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 8 Nov 2018 00:38:48 +0800 Subject: switch to vuepress --- .../@vue/component-compiler-utils/lib/parse.ts | 112 +++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 node_modules/@vue/component-compiler-utils/lib/parse.ts (limited to 'node_modules/@vue/component-compiler-utils/lib/parse.ts') diff --git a/node_modules/@vue/component-compiler-utils/lib/parse.ts b/node_modules/@vue/component-compiler-utils/lib/parse.ts new file mode 100644 index 00000000..8fbd70ee --- /dev/null +++ b/node_modules/@vue/component-compiler-utils/lib/parse.ts @@ -0,0 +1,112 @@ +import { + RawSourceMap, + VueTemplateCompiler, + VueTemplateCompilerParseOptions +} from './types' + +const hash = require('hash-sum') +const cache = require('lru-cache')(100) +const { SourceMapGenerator } = require('source-map') + +const splitRE = /\r?\n/g +const emptyRE = /^(?:\/\/)?\s*$/ + +export interface ParseOptions { + source: string + filename?: string + compiler: VueTemplateCompiler + compilerParseOptions?: VueTemplateCompilerParseOptions + sourceRoot?: string + needMap?: boolean +} + +export interface SFCCustomBlock { + type: string + content: string + attrs: { [key: string]: string | true } + start: number + end: number + map?: RawSourceMap +} + +export interface SFCBlock extends SFCCustomBlock { + lang?: string + src?: string + scoped?: boolean + module?: string | boolean +} + +export interface SFCDescriptor { + template: SFCBlock | null + script: SFCBlock | null + styles: SFCBlock[] + customBlocks: SFCCustomBlock[] +} + +export function parse(options: ParseOptions): SFCDescriptor { + const { + source, + filename = '', + compiler, + compilerParseOptions = { pad: 'line' }, + sourceRoot = process.cwd(), + needMap = true + } = options + const cacheKey = hash(filename + source) + let output: SFCDescriptor = cache.get(cacheKey) + if (output) return output + output = compiler.parseComponent(source, compilerParseOptions) + if (needMap) { + if (output.script && !output.script.src) { + output.script.map = generateSourceMap( + filename, + source, + output.script.content, + sourceRoot + ) + } + if (output.styles) { + output.styles.forEach(style => { + if (!style.src) { + style.map = generateSourceMap( + filename, + source, + style.content, + sourceRoot + ) + } + }) + } + } + cache.set(cacheKey, output) + return output +} + +function generateSourceMap( + filename: string, + source: string, + generated: string, + sourceRoot: string +): RawSourceMap { + const map = new SourceMapGenerator({ + file: filename, + sourceRoot + }) + map.setSourceContent(filename, source) + generated.split(splitRE).forEach((line, index) => { + if (!emptyRE.test(line)) { + map.addMapping({ + source: filename, + original: { + line: index + 1, + column: 0 + }, + generated: { + line: index + 1, + column: 0 + } + }) + } + }) + return map.toJSON() +} -- cgit v1.2.3