diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/@vue/component-compiler-utils/lib/parse.ts | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/@vue/component-compiler-utils/lib/parse.ts')
| -rw-r--r-- | node_modules/@vue/component-compiler-utils/lib/parse.ts | 112 |
1 files changed, 112 insertions, 0 deletions
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() +} |
