Skip to content

Commit 68ec1b6

Browse files
authoredAug 8, 2018
Merge pull request #138 from ktsn/vue-fix-blank-line
Avoid false positive of no-consecutive-blank-lines TSLint rule in Vue file
2 parents eca9b1e + aa8d482 commit 68ec1b6

File tree

3 files changed

+66
-3
lines changed

3 files changed

+66
-3
lines changed
 

‎src/VueProgram.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ class VueProgram {
195195
}
196196
}
197197

198-
private static resolveScriptBlock(content: string): ResolvedScript {
198+
static resolveScriptBlock(content: string): ResolvedScript {
199199
// We need to import vue-template-compiler lazily because it cannot be included it
200200
// as direct dependency because it is an optional dependency of fork-ts-checker-webpack-plugin.
201201
// Since its version must not mismatch with user-installed Vue.js,
@@ -209,7 +209,7 @@ class VueProgram {
209209
}
210210

211211
const { script } = parser.parseComponent(content, {
212-
pad: 'line'
212+
pad: 'space'
213213
});
214214

215215
// No <script> block
@@ -240,9 +240,15 @@ class VueProgram {
240240
};
241241
}
242242

243+
// Pad blank lines to retain diagnostics location
244+
// We need to prepend `//` for each line to avoid
245+
// false positive of no-consecutive-blank-lines TSLint rule
246+
const offset = content.slice(0, script.start).split(/\r?\n/g).length;
247+
const paddedContent = Array(offset).join('//\n') + script.content.slice(script.start);
248+
243249
return {
244250
scriptKind,
245-
content: script.content
251+
content: paddedContent
246252
};
247253
}
248254
}

‎test/integration/vue.spec.js

+11
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,17 @@ describe('[INTEGRATION] vue', function () {
145145
});
146146
});
147147

148+
it('should not report no-consecutive-blank-lines tslint rule', function (callback) {
149+
createCompiler({ tslint: true, vue: true });
150+
151+
compiler.run(function(error, stats) {
152+
stats.compilation.warnings.forEach(function(warning) {
153+
expect(warning.rawMessage).to.not.match(/no-consecutive-blank-lines/);
154+
});
155+
callback();
156+
});
157+
});
158+
148159
it('should find syntactic errors when checkSyntacticErrors is true', function (callback) {
149160
createCompiler({ tslint: true, vue: true, checkSyntacticErrors: true });
150161

‎test/unit/VueProgram.spec.js

+46
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
var ts = require('typescript');
12
var describe = require('mocha').describe;
23
var it = require('mocha').it;
34
var expect = require('chai').expect;
@@ -64,4 +65,49 @@ describe('[UNIT] VueProgram', function () {
6465
resolvedModuleName = VueProgram.resolveNonTsModuleName(moduleName, containingFile, basedir, options);
6566
expect(resolvedModuleName).to.be.equal('/baseurl3/src1/src2/test.vue');
6667
});
68+
69+
it('should extract script block', function() {
70+
var content = [
71+
'<script lang="ts">',
72+
'import Vue from "vue";',
73+
'export default Vue.extend({});',
74+
'</script>'
75+
].join('\n');
76+
77+
var result = VueProgram.resolveScriptBlock(content);
78+
79+
expect(result.scriptKind).to.be.equal(ts.ScriptKind.TS);
80+
expect(result.content).to.be.equal([
81+
'',
82+
'import Vue from "vue";',
83+
'export default Vue.extend({});',
84+
''
85+
].join('\n'));
86+
});
87+
88+
it('should pad lines', function() {
89+
var content = [
90+
'<template>',
91+
' <p>Hello</p>',
92+
'</template>',
93+
'',
94+
'<script lang="ts">',
95+
'import Vue from "vue";',
96+
'export default Vue.extend({});',
97+
'</script>'
98+
].join('\n');
99+
100+
var result = VueProgram.resolveScriptBlock(content);
101+
102+
expect(result.content).to.be.equal([
103+
'//',
104+
'//',
105+
'//',
106+
'//',
107+
'',
108+
'import Vue from "vue";',
109+
'export default Vue.extend({});',
110+
''
111+
].join('\n'));
112+
});
67113
});

0 commit comments

Comments
 (0)
Please sign in to comment.