mirror of https://github.com/vuejs/core.git
76 lines
1.6 KiB
TypeScript
76 lines
1.6 KiB
TypeScript
import {
|
|
type SFCParseOptions,
|
|
type SFCScriptBlock,
|
|
type SFCScriptCompileOptions,
|
|
compileScript,
|
|
parse,
|
|
} from '../src'
|
|
import { parse as babelParse } from '@babel/parser'
|
|
|
|
export const mockId = 'xxxxxxxx'
|
|
|
|
export function compileSFCScript(
|
|
src: string,
|
|
options?: Partial<SFCScriptCompileOptions>,
|
|
parseOptions?: SFCParseOptions,
|
|
): SFCScriptBlock {
|
|
const { descriptor, errors } = parse(src, parseOptions)
|
|
if (errors.length) {
|
|
console.warn(errors[0])
|
|
}
|
|
return compileScript(descriptor, {
|
|
...options,
|
|
id: mockId,
|
|
})
|
|
}
|
|
|
|
export function assertCode(code: string): void {
|
|
// parse the generated code to make sure it is valid
|
|
try {
|
|
babelParse(code, {
|
|
sourceType: 'module',
|
|
plugins: [
|
|
'typescript',
|
|
['importAttributes', { deprecatedAssertSyntax: true }],
|
|
],
|
|
})
|
|
} catch (e: any) {
|
|
console.log(code)
|
|
throw e
|
|
}
|
|
expect(code).toMatchSnapshot()
|
|
}
|
|
|
|
interface Pos {
|
|
line: number
|
|
column: number
|
|
name?: string
|
|
}
|
|
|
|
export function getPositionInCode(
|
|
code: string,
|
|
token: string,
|
|
expectName: string | boolean = false,
|
|
): Pos {
|
|
const generatedOffset = code.indexOf(token)
|
|
let line = 1
|
|
let lastNewLinePos = -1
|
|
for (let i = 0; i < generatedOffset; i++) {
|
|
if (code.charCodeAt(i) === 10 /* newline char code */) {
|
|
line++
|
|
lastNewLinePos = i
|
|
}
|
|
}
|
|
const res: Pos = {
|
|
line,
|
|
column:
|
|
lastNewLinePos === -1
|
|
? generatedOffset
|
|
: generatedOffset - lastNewLinePos - 1,
|
|
}
|
|
if (expectName) {
|
|
res.name = typeof expectName === 'string' ? expectName : token
|
|
}
|
|
return res
|
|
}
|