import { compile } from '../src' import { SourceMapConsumer, RawSourceMap } from 'source-map' describe('compiler: integration tests', () => { const source = `
{{ world }}
yes
{{ value + index }}
`.trim() function getPositionInCode(code: string, token: string) { 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 } } return { line, column: lastNewLinePos === -1 ? generatedOffset : generatedOffset - lastNewLinePos - 1 } } test('function mode', async () => { const { code, map } = compile(source, { sourceMap: true, filename: `foo.vue` }) expect(code).toMatch( `const { createVNode: _createVNode, toString: _toString, renderList: _renderList } = _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, `world`)) ).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).toMatch(`const { createVNode, toString, renderList } = 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`)) ).toMatchObject(getPositionInCode(source, `bar`)) expect( consumer.originalPositionFor(getPositionInCode(code, `world`)) ).toMatchObject(getPositionInCode(source, `{{ world }}`)) expect( consumer.originalPositionFor(getPositionInCode(code, `_ctx.world`)) ).toMatchObject(getPositionInCode(source, `{{ world }}`)) expect( consumer.originalPositionFor(getPositionInCode(code, `ok`)) ).toMatchObject(getPositionInCode(source, `ok`)) expect( consumer.originalPositionFor(getPositionInCode(code, `_ctx.ok`)) ).toMatchObject(getPositionInCode(source, `ok`)) expect( consumer.originalPositionFor(getPositionInCode(code, `list`)) ).toMatchObject(getPositionInCode(source, `list`)) expect( consumer.originalPositionFor(getPositionInCode(code, `_ctx.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('module mode', async () => { const { code, map } = compile(source, { mode: 'module', sourceMap: true, filename: `foo.vue` }) expect(code).toMatch( `import { createVNode, toString, renderList } from "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`)) ).toMatchObject(getPositionInCode(source, `bar`)) expect( consumer.originalPositionFor(getPositionInCode(code, `world`)) ).toMatchObject(getPositionInCode(source, `{{ world }}`)) expect( consumer.originalPositionFor(getPositionInCode(code, `_ctx.world`)) ).toMatchObject(getPositionInCode(source, `{{ world }}`)) expect( consumer.originalPositionFor(getPositionInCode(code, `ok`)) ).toMatchObject(getPositionInCode(source, `ok`)) expect( consumer.originalPositionFor(getPositionInCode(code, `_ctx.ok`)) ).toMatchObject(getPositionInCode(source, `ok`)) expect( consumer.originalPositionFor(getPositionInCode(code, `list`)) ).toMatchObject(getPositionInCode(source, `list`)) expect( consumer.originalPositionFor(getPositionInCode(code, `_ctx.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`)) }) })