utils.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import {
  2. type SFCParseOptions,
  3. type SFCScriptBlock,
  4. type SFCScriptCompileOptions,
  5. compileScript,
  6. parse,
  7. } from '../src'
  8. import { parse as babelParse } from '@babel/parser'
  9. export const mockId = 'xxxxxxxx'
  10. export function compileSFCScript(
  11. src: string,
  12. options?: Partial<SFCScriptCompileOptions>,
  13. parseOptions?: SFCParseOptions,
  14. ): SFCScriptBlock {
  15. const { descriptor, errors } = parse(src, parseOptions)
  16. if (errors.length) {
  17. console.warn(errors[0])
  18. }
  19. return compileScript(descriptor, {
  20. ...options,
  21. id: mockId,
  22. })
  23. }
  24. export function assertCode(code: string): void {
  25. // parse the generated code to make sure it is valid
  26. try {
  27. babelParse(code, {
  28. sourceType: 'module',
  29. plugins: [
  30. 'typescript',
  31. ['importAttributes', { deprecatedAssertSyntax: true }],
  32. ],
  33. })
  34. } catch (e: any) {
  35. console.log(code)
  36. throw e
  37. }
  38. expect(code).toMatchSnapshot()
  39. }
  40. interface Pos {
  41. line: number
  42. column: number
  43. name?: string
  44. }
  45. export function getPositionInCode(
  46. code: string,
  47. token: string,
  48. expectName: string | boolean = false,
  49. ): Pos {
  50. const generatedOffset = code.indexOf(token)
  51. let line = 1
  52. let lastNewLinePos = -1
  53. for (let i = 0; i < generatedOffset; i++) {
  54. if (code.charCodeAt(i) === 10 /* newline char code */) {
  55. line++
  56. lastNewLinePos = i
  57. }
  58. }
  59. const res: Pos = {
  60. line,
  61. column:
  62. lastNewLinePos === -1
  63. ? generatedOffset
  64. : generatedOffset - lastNewLinePos - 1,
  65. }
  66. if (expectName) {
  67. res.name = typeof expectName === 'string' ? expectName : token
  68. }
  69. return res
  70. }