| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- import { baseCompile as compile } from '../src'
- import { SourceMapConsumer, RawSourceMap } from 'source-map'
- 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', async () => {
- 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 = await 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', async () => {
- 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 = await 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', async () => {
- 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 = await 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`))
- })
- })
|