From 4ed1e837a9df4011271ed34d91609b1a52ddf760 Mon Sep 17 00:00:00 2001 From: Nikhil Verma Date: Fri, 22 Jul 2022 09:22:13 +0530 Subject: [PATCH 1/3] Fix source maps for vue2-jest --- .gitignore | 1 + e2e/2.x/basic/__snapshots__/test.js.snap | 79 +++++++++----- e2e/2.x/basic/test.js | 4 +- package.json | 4 + packages/vue2-jest/lib/generate-code.js | 100 ++++++++++-------- packages/vue2-jest/lib/generate-source-map.js | 69 ------------ packages/vue2-jest/lib/process.js | 20 +--- 7 files changed, 119 insertions(+), 158 deletions(-) delete mode 100644 packages/vue2-jest/lib/generate-source-map.js diff --git a/.gitignore b/.gitignore index bd2868af..606f99ec 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ pids package-lock.json /e2e/**/yarn.lock +.vscode diff --git a/e2e/2.x/basic/__snapshots__/test.js.snap b/e2e/2.x/basic/__snapshots__/test.js.snap index 646dd425..3f4747d4 100644 --- a/e2e/2.x/basic/__snapshots__/test.js.snap +++ b/e2e/2.x/basic/__snapshots__/test.js.snap @@ -2,35 +2,48 @@ exports[`generates source maps for .vue files 1`] = ` Object { - "mappings": ";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;AAPA;AASA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AAHA;AAjBA;;;;AAvBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA", - "names": Array [], + "file": "/Volumes/repos/vue-jest/e2e/2.x/basic/components/Basic.vue", + "mappings": ";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;eAEe;AACbA,MAAI,EAAE,OADO;AAEbC,UAAQ,EAAE;AACRC,kBAAc,EAAE,SAASA,cAAT,GAA0B;AACxC,aAAO;AACLC,WAAG,EAAE,KAAKC,OADL;AAELC,YAAI,EAAE,CAAC,KAAKD,OAFP;AAGLE,cAAM,EAAE,KAAKF;AAHR,OAAP;AAKD;AAPO,GAFG;AAWbG,MAAI,EAAE,SAASA,IAAT,GAAgB;AACpB,WAAO;AACLC,SAAG,EAAE,4BADA;AAELJ,aAAO,EAAE;AAFJ,KAAP;AAID,GAhBY;AAiBbK,SAAO,EAAE;AACPC,eAAW,EAAE,SAASA,WAAT,GAAuB;AAClC,WAAKN,OAAL,GAAe,CAAC,KAAKA,OAArB;AACD;AAHM;AAjBI,C", + "names": Array [ + "name", + "computed", + "headingClasses", + "red", + "isCrazy", + "blue", + "shadow", + "data", + "msg", + "methods", + "toggleClass", + ], "sources": Array [ "Basic.vue", ], "sourcesContent": Array [ - " - - - - + "// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// - ", ], "version": 3, @@ -63,8 +75,21 @@ export default { exports[`generates source maps using src attributes 1`] = ` Object { - "mappings": ";;;;;;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;AAPA;AASA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AAHA;AAjBA", - "names": Array [], + "file": "/Volumes/repos/vue-jest/e2e/2.x/basic/components/SourceMapsSrc.vue", + "mappings": ";;;;;;eAAe;AACbA,MAAI,EAAE,OADO;AAEbC,UAAQ,EAAE;AACRC,kBAAc,EAAE,SAASA,cAAT,GAA0B;AACxC,aAAO;AACLC,WAAG,EAAE,KAAKC,OADL;AAELC,YAAI,EAAE,CAAC,KAAKD,OAFP;AAGLE,cAAM,EAAE,KAAKF;AAHR,OAAP;AAKD;AAPO,GAFG;AAWbG,MAAI,EAAE,SAASA,IAAT,GAAgB;AACpB,WAAO;AACLC,SAAG,EAAE,4BADA;AAELJ,aAAO,EAAE;AAFJ,KAAP;AAID,GAhBY;AAiBbK,SAAO,EAAE;AACPC,eAAW,EAAE,SAASA,WAAT,GAAuB;AAClC,WAAKN,OAAL,GAAe,CAAC,KAAKA,OAArB;AACD;AAHM;AAjBI,C", + "names": Array [ + "name", + "computed", + "headingClasses", + "red", + "isCrazy", + "blue", + "shadow", + "data", + "msg", + "methods", + "toggleClass", + ], "sources": Array [ "SourceMapsSrc.vue", ], diff --git a/e2e/2.x/basic/test.js b/e2e/2.x/basic/test.js index 03c124d0..6354139b 100644 --- a/e2e/2.x/basic/test.js +++ b/e2e/2.x/basic/test.js @@ -52,7 +52,7 @@ test('generates source maps for .vue files', () => { config }) - expect(map).toMatchSnapshot() + expect(JSON.parse(map)).toMatchSnapshot() }) test('generates source maps using src attributes', () => { @@ -67,7 +67,7 @@ test('generates source maps using src attributes', () => { config }) - expect(map).toMatchSnapshot() + expect(JSON.parse(map)).toMatchSnapshot() }) test('processes .vue file using jsx', () => { diff --git a/package.json b/package.json index 6522ba8f..bdcea211 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,10 @@ "pre-commit": "lint-staged" } }, + "prettier": { + "semi": false, + "singleQuote": true + }, "lint-staged": { "*.{js,json,css,md,vue}": [ "yarn format", diff --git a/packages/vue2-jest/lib/generate-code.js b/packages/vue2-jest/lib/generate-code.js index 97737f39..97f49fef 100644 --- a/packages/vue2-jest/lib/generate-code.js +++ b/packages/vue2-jest/lib/generate-code.js @@ -1,51 +1,66 @@ const namespace = require('./constants').vueOptionsNamespace +const { SourceNode, SourceMapConsumer } = require('source-map') -const splitRE = /\r?\n/g +function addToSourceMap(node, result) { + if (result && result.code) { + if (result.map) { + node.add( + SourceNode.fromStringWithSourceMap( + result.code, + new SourceMapConsumer(result.map) + ) + ) + } else { + node.add(result.code) + } + } +} module.exports = function generateCode( scriptResult, templateResult, stylesResult, customBlocksResult, - isFunctional + isFunctional, + filename ) { - let output = '' - let renderFnStartLine - let renderFnEndLine + var node = new SourceNode(null, null) + addToSourceMap(node, scriptResult) - if (scriptResult) { - output += `${scriptResult.code};\n` - } else { - output += + if (!scriptResult) { + node.add( `Object.defineProperty(exports, "__esModule", {\n` + - ` value: true\n` + - `});\n` + - 'module.exports.default = {};\n' + ` value: true\n` + + `});\n` + + 'module.exports.default = {};\n' + ) } - output += + node.add( `var ${namespace} = typeof exports.default === 'function' ` + - `? exports.default.options ` + - `: exports.default\n` + `? exports.default.options ` + + `: exports.default\n` + ) if (templateResult) { - renderFnStartLine = output.split(splitRE).length - templateResult.code = templateResult.code.replace( + addToSourceMap(node, templateResult) + + node.replaceRight( 'var _c = _vm._self._c || _h', '/* istanbul ignore next */\nvar _c = _vm._self._c || _h' ) - output += `${templateResult.code}\n` - renderFnEndLine = output.split(splitRE).length - - output += + node.add( `__options__.render = render\n` + - `${namespace}.staticRenderFns = staticRenderFns\n` + `${namespace}.staticRenderFns = staticRenderFns\n` + ) if (isFunctional) { - output += `${namespace}.functional = true\n` - output += `${namespace}._compiled = true\n` + node.add(`${namespace}.functional = true\n`) + node.add(`${namespace}._compiled = true\n`) } + + addToSourceMap(node, templateResult) } if (stylesResult) { @@ -60,31 +75,30 @@ module.exports = function generateCode( ) .join('') if (isFunctional) { - output += + node.add( `;(function() {\n` + - ` var originalRender = ${namespace}.render\n` + - ` var styleFn = function () { ${styleStr} }\n` + - ` ${namespace}.render = function renderWithStyleInjection (h, context) {\n` + - ` styleFn.call(context)\n` + - ` return originalRender(h, context)\n` + - ` }\n` + - `})()\n` + ` var originalRender = ${namespace}.render\n` + + ` var styleFn = function () { ${styleStr} }\n` + + ` ${namespace}.render = function renderWithStyleInjection (h, context) {\n` + + ` styleFn.call(context)\n` + + ` return originalRender(h, context)\n` + + ` }\n` + + `})()\n` + ) } else { - output += + node.add( `;(function() {\n` + - ` var beforeCreate = ${namespace}.beforeCreate\n` + - ` var styleFn = function () { ${styleStr} }\n` + - ` ${namespace}.beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]\n` + - `})()\n` + ` var beforeCreate = ${namespace}.beforeCreate\n` + + ` var styleFn = function () { ${styleStr} }\n` + + ` ${namespace}.beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]\n` + + `})()\n` + ) } } if (customBlocksResult) { - output += `;\n ${customBlocksResult}` - } - return { - code: output, - renderFnStartLine, - renderFnEndLine + node.add(`;\n ${customBlocksResult}`) } + + return node.toStringWithSourceMap({ file: filename }) } diff --git a/packages/vue2-jest/lib/generate-source-map.js b/packages/vue2-jest/lib/generate-source-map.js deleted file mode 100644 index ec9ec089..00000000 --- a/packages/vue2-jest/lib/generate-source-map.js +++ /dev/null @@ -1,69 +0,0 @@ -const path = require('path') -const sourceMap = require('source-map') -const splitRE = /\r?\n/g - -module.exports = function generateSourceMap( - scriptResult, - src, - filename, - renderFnStartLine, - renderFnEndLine, - templateLine -) { - const file = path.basename(filename) - const map = new sourceMap.SourceMapGenerator() - - const scriptFromExternalSrc = scriptResult && scriptResult.externalSrc - - // If script uses external file for content (using the src attribute) then - // map result to this file, instead of original. - const srcContent = scriptFromExternalSrc ? scriptResult.externalSrc : src - - map.setSourceContent(file, srcContent) - if (scriptResult) { - let inputMapConsumer = - scriptResult.map && new sourceMap.SourceMapConsumer(scriptResult.map) - scriptResult.code.split(splitRE).forEach(function(line, index) { - let ln = index + 1 - let originalLine = inputMapConsumer - ? inputMapConsumer.originalPositionFor({ line: ln, column: 0 }).line - : ln - if (originalLine) { - map.addMapping({ - source: file, - generated: { - line: ln, - column: 0 - }, - original: { - line: originalLine, - column: 0 - } - }) - } - }) - } - - // If script is from external src then the source map will only show the - // script section. We won't map the generated render function to this file, - // because the coverage report would be confusing - if (scriptFromExternalSrc) { - return map - } - - for (; renderFnStartLine < renderFnEndLine; renderFnStartLine++) { - map.addMapping({ - source: file, - generated: { - line: renderFnStartLine, - column: 0 - }, - original: { - line: templateLine, - column: 0 - } - }) - } - - return map -} diff --git a/packages/vue2-jest/lib/process.js b/packages/vue2-jest/lib/process.js index b87cd295..4a0589c7 100644 --- a/packages/vue2-jest/lib/process.js +++ b/packages/vue2-jest/lib/process.js @@ -1,7 +1,4 @@ -const splitRE = /\r?\n/g - const VueTemplateCompiler = require('vue-template-compiler') -const generateSourceMap = require('./generate-source-map') const coffeescriptTransformer = require('./transformers/coffee') const _processStyle = require('./process-style') const processCustomBlocks = require('./process-custom-blocks') @@ -115,28 +112,17 @@ module.exports = function(src, filename, config) { descriptor.script.content && /functional:\s*true/.test(descriptor.script.content)) - const templateStart = descriptor.template && descriptor.template.start - const templateLine = src.slice(0, templateStart).split(splitRE).length - const output = generateCode( scriptResult, templateResult, stylesResult, customBlocksResult, - isFunctional + isFunctional, + filename ) - const map = generateSourceMap( - scriptResult, - src, - filename, - output.renderFnStartLine, - output.renderFnEndLine, - templateLine - ).toJSON() - return { code: output.code, - map + map: output.map.toString() } } From db1a8baed160d4bd13e78b59e090fd0250659bd7 Mon Sep 17 00:00:00 2001 From: Nikhil Verma Date: Fri, 22 Jul 2022 09:30:21 +0530 Subject: [PATCH 2/3] Remove duplicate append --- packages/vue2-jest/lib/generate-code.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/vue2-jest/lib/generate-code.js b/packages/vue2-jest/lib/generate-code.js index 97f49fef..bdb9ce13 100644 --- a/packages/vue2-jest/lib/generate-code.js +++ b/packages/vue2-jest/lib/generate-code.js @@ -59,8 +59,6 @@ module.exports = function generateCode( node.add(`${namespace}.functional = true\n`) node.add(`${namespace}._compiled = true\n`) } - - addToSourceMap(node, templateResult) } if (stylesResult) { From 41b2156b1fbb40fbb83b82a5cf9fefb6ed5c14dd Mon Sep 17 00:00:00 2001 From: Nikhil Verma Date: Wed, 3 Aug 2022 10:53:11 +0530 Subject: [PATCH 3/3] Fix snapshot paths to match github CI --- e2e/2.x/basic/__snapshots__/test.js.snap | 4 ++-- packages/vue2-jest/lib/generate-code.js | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/e2e/2.x/basic/__snapshots__/test.js.snap b/e2e/2.x/basic/__snapshots__/test.js.snap index 3f4747d4..e3eb7458 100644 --- a/e2e/2.x/basic/__snapshots__/test.js.snap +++ b/e2e/2.x/basic/__snapshots__/test.js.snap @@ -2,7 +2,7 @@ exports[`generates source maps for .vue files 1`] = ` Object { - "file": "/Volumes/repos/vue-jest/e2e/2.x/basic/components/Basic.vue", + "file": "/home/runner/work/vue-jest/vue-jest/e2e/2.x/basic/components/Basic.vue", "mappings": ";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;eAEe;AACbA,MAAI,EAAE,OADO;AAEbC,UAAQ,EAAE;AACRC,kBAAc,EAAE,SAASA,cAAT,GAA0B;AACxC,aAAO;AACLC,WAAG,EAAE,KAAKC,OADL;AAELC,YAAI,EAAE,CAAC,KAAKD,OAFP;AAGLE,cAAM,EAAE,KAAKF;AAHR,OAAP;AAKD;AAPO,GAFG;AAWbG,MAAI,EAAE,SAASA,IAAT,GAAgB;AACpB,WAAO;AACLC,SAAG,EAAE,4BADA;AAELJ,aAAO,EAAE;AAFJ,KAAP;AAID,GAhBY;AAiBbK,SAAO,EAAE;AACPC,eAAW,EAAE,SAASA,WAAT,GAAuB;AAClC,WAAKN,OAAL,GAAe,CAAC,KAAKA,OAArB;AACD;AAHM;AAjBI,C", "names": Array [ "name", @@ -75,7 +75,7 @@ export default { exports[`generates source maps using src attributes 1`] = ` Object { - "file": "/Volumes/repos/vue-jest/e2e/2.x/basic/components/SourceMapsSrc.vue", + "file": "/home/runner/work/vue-jest/vue-jest/e2e/2.x/basic/components/SourceMapsSrc.vue", "mappings": ";;;;;;eAAe;AACbA,MAAI,EAAE,OADO;AAEbC,UAAQ,EAAE;AACRC,kBAAc,EAAE,SAASA,cAAT,GAA0B;AACxC,aAAO;AACLC,WAAG,EAAE,KAAKC,OADL;AAELC,YAAI,EAAE,CAAC,KAAKD,OAFP;AAGLE,cAAM,EAAE,KAAKF;AAHR,OAAP;AAKD;AAPO,GAFG;AAWbG,MAAI,EAAE,SAASA,IAAT,GAAgB;AACpB,WAAO;AACLC,SAAG,EAAE,4BADA;AAELJ,aAAO,EAAE;AAFJ,KAAP;AAID,GAhBY;AAiBbK,SAAO,EAAE;AACPC,eAAW,EAAE,SAASA,WAAT,GAAuB;AAClC,WAAKN,OAAL,GAAe,CAAC,KAAKA,OAArB;AACD;AAHM;AAjBI,C", "names": Array [ "name", diff --git a/packages/vue2-jest/lib/generate-code.js b/packages/vue2-jest/lib/generate-code.js index bdb9ce13..2ca9a488 100644 --- a/packages/vue2-jest/lib/generate-code.js +++ b/packages/vue2-jest/lib/generate-code.js @@ -25,9 +25,10 @@ module.exports = function generateCode( filename ) { var node = new SourceNode(null, null) - addToSourceMap(node, scriptResult) - if (!scriptResult) { + if (scriptResult) { + addToSourceMap(node, scriptResult) + } else { node.add( `Object.defineProperty(exports, "__esModule", {\n` + ` value: true\n` + @@ -72,6 +73,7 @@ module.exports = function generateCode( `this['${moduleName}'], ${code});\n` ) .join('') + if (isFunctional) { node.add( `;(function() {\n` +