| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- import { baseCompile as compile } from '../src'
- import { type RawSourceMap, SourceMapConsumer } from 'source-map-js'
- describe('compiler: integration tests', () => {
- const source = `
- <div id="foo" :class="bar.baz">
- {{ world.burn() }}
- <div v-if="ok">yes</div>
- <template v-else>no</template>
- <div v-for="(value, index) in list"><span>{{ value + index }}</span></div>
- </div>
- `.trim()
- interface Pos {
- line: number
- column: number
- name?: string
- }
- 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
- }
- test('function mode', () => {
- const { code, map } = compile(source, {
- sourceMap: true,
- filename: `foo.vue`,
- })
- expect(code).toMatchSnapshot()
- expect(map!.sources).toEqual([`foo.vue`])
- expect(map!.sourcesContent).toEqual([source])
- const consumer = new SourceMapConsumer(map as RawSourceMap)
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `id`)),
- ).toMatchObject(getPositionInCode(source, `id`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `"foo"`)),
- ).toMatchObject(getPositionInCode(source, `"foo"`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `class:`)),
- ).toMatchObject(getPositionInCode(source, `class=`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `bar`)),
- ).toMatchObject(getPositionInCode(source, `bar`))
- // without prefixIdentifiers: true, identifiers inside compound expressions
- // are mapped to closest parent expression.
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `baz`)),
- ).toMatchObject(getPositionInCode(source, `bar`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `world`)),
- ).toMatchObject(getPositionInCode(source, `world`))
- // without prefixIdentifiers: true, identifiers inside compound expressions
- // are mapped to closest parent expression.
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `burn()`)),
- ).toMatchObject(getPositionInCode(source, `world`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `ok`)),
- ).toMatchObject(getPositionInCode(source, `ok`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `list`)),
- ).toMatchObject(getPositionInCode(source, `list`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `value`)),
- ).toMatchObject(getPositionInCode(source, `value`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `index`)),
- ).toMatchObject(getPositionInCode(source, `index`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `value + index`)),
- ).toMatchObject(getPositionInCode(source, `value + index`))
- })
- test('function mode w/ prefixIdentifiers: true', () => {
- const { code, map } = compile(source, {
- sourceMap: true,
- filename: `foo.vue`,
- prefixIdentifiers: true,
- })
- expect(code).toMatchSnapshot()
- expect(map!.sources).toEqual([`foo.vue`])
- expect(map!.sourcesContent).toEqual([source])
- const consumer = new SourceMapConsumer(map as RawSourceMap)
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `id`)),
- ).toMatchObject(getPositionInCode(source, `id`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `"foo"`)),
- ).toMatchObject(getPositionInCode(source, `"foo"`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `class:`)),
- ).toMatchObject(getPositionInCode(source, `class=`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `bar`)),
- ).toMatchObject(getPositionInCode(source, `bar`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `_ctx.bar`, `bar`)),
- ).toMatchObject(getPositionInCode(source, `bar`, true))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `baz`)),
- ).toMatchObject(getPositionInCode(source, `baz`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `world`, true)),
- ).toMatchObject(getPositionInCode(source, `world`, `world`))
- expect(
- consumer.originalPositionFor(
- getPositionInCode(code, `_ctx.world`, `world`),
- ),
- ).toMatchObject(getPositionInCode(source, `world`, `world`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `burn()`)),
- ).toMatchObject(getPositionInCode(source, `burn()`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `ok`)),
- ).toMatchObject(getPositionInCode(source, `ok`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `_ctx.ok`, `ok`)),
- ).toMatchObject(getPositionInCode(source, `ok`, true))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `list`)),
- ).toMatchObject(getPositionInCode(source, `list`))
- expect(
- consumer.originalPositionFor(
- getPositionInCode(code, `_ctx.list`, `list`),
- ),
- ).toMatchObject(getPositionInCode(source, `list`, true))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `value`)),
- ).toMatchObject(getPositionInCode(source, `value`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `index`)),
- ).toMatchObject(getPositionInCode(source, `index`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `value + index`)),
- ).toMatchObject(getPositionInCode(source, `value + index`))
- })
- test('module mode', () => {
- const { code, map } = compile(source, {
- mode: 'module',
- sourceMap: true,
- filename: `foo.vue`,
- })
- expect(code).toMatchSnapshot()
- expect(map!.sources).toEqual([`foo.vue`])
- expect(map!.sourcesContent).toEqual([source])
- const consumer = new SourceMapConsumer(map as RawSourceMap)
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `id`)),
- ).toMatchObject(getPositionInCode(source, `id`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `"foo"`)),
- ).toMatchObject(getPositionInCode(source, `"foo"`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `class:`)),
- ).toMatchObject(getPositionInCode(source, `class=`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `bar`)),
- ).toMatchObject(getPositionInCode(source, `bar`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `_ctx.bar`, `bar`)),
- ).toMatchObject(getPositionInCode(source, `bar`, true))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `baz`)),
- ).toMatchObject(getPositionInCode(source, `baz`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `world`, true)),
- ).toMatchObject(getPositionInCode(source, `world`, `world`))
- expect(
- consumer.originalPositionFor(
- getPositionInCode(code, `_ctx.world`, `world`),
- ),
- ).toMatchObject(getPositionInCode(source, `world`, `world`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `burn()`)),
- ).toMatchObject(getPositionInCode(source, `burn()`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `ok`)),
- ).toMatchObject(getPositionInCode(source, `ok`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `_ctx.ok`, `ok`)),
- ).toMatchObject(getPositionInCode(source, `ok`, true))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `list`)),
- ).toMatchObject(getPositionInCode(source, `list`))
- expect(
- consumer.originalPositionFor(
- getPositionInCode(code, `_ctx.list`, `list`),
- ),
- ).toMatchObject(getPositionInCode(source, `list`, true))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `value`)),
- ).toMatchObject(getPositionInCode(source, `value`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `index`)),
- ).toMatchObject(getPositionInCode(source, `index`))
- expect(
- consumer.originalPositionFor(getPositionInCode(code, `value + index`)),
- ).toMatchObject(getPositionInCode(source, `value + index`))
- })
- })
|