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, 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 }