From 4627f29829eff9e47ed8e0facf9d9160d8fc914c Mon Sep 17 00:00:00 2001
From: ktsn <ktsn55@gmail.com>
Date: Wed, 14 Feb 2018 23:46:07 +0900
Subject: [PATCH 1/2] fix(sfc): avoid to deindent when pad option is specified

---
 src/sfc/parser.js                        |  8 ++++++--
 test/unit/modules/sfc/sfc-parser.spec.js | 24 ++++++++++++++++++------
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/src/sfc/parser.js b/src/sfc/parser.js
index 868a43ca082..6223f1770c3 100644
--- a/src/sfc/parser.js
+++ b/src/sfc/parser.js
@@ -83,11 +83,15 @@ export function parseComponent (
   function end (tag: string, start: number, end: number) {
     if (depth === 1 && currentBlock) {
       currentBlock.end = start
-      let text = deindent(content.slice(currentBlock.start, currentBlock.end))
+      let text = content.slice(currentBlock.start, currentBlock.end)
       // pad content so that linters and pre-processors can output correct
       // line numbers in errors and warnings
-      if (currentBlock.type !== 'template' && options.pad) {
+      if (options.pad) {
         text = padContent(currentBlock, options.pad) + text
+      } else {
+        // avoid to deindent if pad option is specified
+        // to retain original source position.
+        text = deindent(text)
       }
       currentBlock.content = text
       currentBlock = null
diff --git a/test/unit/modules/sfc/sfc-parser.spec.js b/test/unit/modules/sfc/sfc-parser.spec.js
index 4cf6bad574a..6588a54dee6 100644
--- a/test/unit/modules/sfc/sfc-parser.spec.js
+++ b/test/unit/modules/sfc/sfc-parser.spec.js
@@ -71,21 +71,33 @@ describe('Single File Component parser', () => {
     const padLine = parseComponent(content.trim(), { pad: 'line' })
     const padSpace = parseComponent(content.trim(), { pad: 'space' })
 
-    expect(padDefault.script.content).toBe(Array(3 + 1).join('//\n') + '\nexport default {}\n')
-    expect(padDefault.styles[0].content).toBe(Array(6 + 1).join('\n') + '\nh1 { color: red }\n')
-    expect(padLine.script.content).toBe(Array(3 + 1).join('//\n') + '\nexport default {}\n')
-    expect(padLine.styles[0].content).toBe(Array(6 + 1).join('\n') + '\nh1 { color: red }\n')
+    expect(padDefault.script.content).toBe(Array(3 + 1).join('//\n') + `
+        export default {}
+      `)
+    expect(padDefault.styles[0].content).toBe(Array(6 + 1).join('\n') + `
+        h1 { color: red }
+      `)
+    expect(padLine.script.content).toBe(Array(3 + 1).join('//\n') + `
+        export default {}
+      `)
+    expect(padLine.styles[0].content).toBe(Array(6 + 1).join('\n') + `
+        h1 { color: red }
+      `)
     expect(padSpace.script.content).toBe(`<template>
         <div></div>
       </template>
-      <script>`.replace(/./g, ' ') + '\nexport default {}\n')
+      <script>`.replace(/./g, ' ') + `
+        export default {}
+      `)
     expect(padSpace.styles[0].content).toBe(`<template>
         <div></div>
       </template>
       <script>
         export default {}
       </script>
-      <style>`.replace(/./g, ' ') + '\nh1 { color: red }\n')
+      <style>`.replace(/./g, ' ') + `
+        h1 { color: red }
+      `)
   })
 
   it('should handle template blocks with lang as special text', () => {

From d9d1a5f13602c116b0702a7ceea4c4f544c40f5f Mon Sep 17 00:00:00 2001
From: ktsn <ktsn55@gmail.com>
Date: Wed, 14 Feb 2018 23:53:03 +0900
Subject: [PATCH 2/2] test(sfc): add test of template block pad

---
 test/unit/modules/sfc/sfc-parser.spec.js | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/test/unit/modules/sfc/sfc-parser.spec.js b/test/unit/modules/sfc/sfc-parser.spec.js
index 6588a54dee6..30a9f9e2c43 100644
--- a/test/unit/modules/sfc/sfc-parser.spec.js
+++ b/test/unit/modules/sfc/sfc-parser.spec.js
@@ -71,18 +71,27 @@ describe('Single File Component parser', () => {
     const padLine = parseComponent(content.trim(), { pad: 'line' })
     const padSpace = parseComponent(content.trim(), { pad: 'space' })
 
+    expect(padDefault.template.content).toBe(Array(1).join('\n') + `
+        <div></div>
+      `)
     expect(padDefault.script.content).toBe(Array(3 + 1).join('//\n') + `
         export default {}
       `)
     expect(padDefault.styles[0].content).toBe(Array(6 + 1).join('\n') + `
         h1 { color: red }
       `)
+    expect(padLine.template.content).toBe(Array(1).join('\n') + `
+        <div></div>
+      `)
     expect(padLine.script.content).toBe(Array(3 + 1).join('//\n') + `
         export default {}
       `)
     expect(padLine.styles[0].content).toBe(Array(6 + 1).join('\n') + `
         h1 { color: red }
       `)
+    expect(padSpace.template.content).toBe(`<template>`.replace(/./g, ' ') + `
+        <div></div>
+      `)
     expect(padSpace.script.content).toBe(`<template>
         <div></div>
       </template>