fix sourcemap
diff --git a/README.md b/README.md
index d84a10e..15007ab 100644
--- a/README.md
+++ b/README.md
@@ -8,13 +8,13 @@
 npm install weex-loader babel-loader babel-preset-es2015 babel-runtime babel-plugin-transform-runtime --save
 ```
 
-## Feature
+## Features
 
 0. Can load `.we` file.
-1. Can load parted files(`.js/.css/.html`) via `src` attribute.
-2. Can specify a custom language to chain any loader.
-3. Can specify name when require `.we` file.
-4. Can write es2015 in script.
+0. Can load parted files(`.js/.css/.html`) via `src` attribute.
+0. Can specify a custom language to chain any loader.
+0. Can specify name when require `.we` file.
+0. Can write es2015 in script.
 
 ## Usage
 
@@ -22,14 +22,10 @@
 
 **make a webpack config**
 ```javascript
-var path = require('path');
-var webpack = require('webpack');
-var loader = require('weex-loader');
-
 module.exports = {
-  entry: './test/main.we?entry',
+  entry: './main.we?entry',
   output: {
-    path: './test/actual',
+    path: './dist',
     filename: 'main.js'
   },
   module: {
@@ -121,4 +117,29 @@
 
 And you can check the specs in `test/spec` folder.
 
+## Specs
+
+- [Build with single template tag](test/spec/a.we)
+- [Build with template and style tags](test/spec/b.we)
+- [Build with template/style/script tags](test/spec/c.we)
+- [Build with single element tag](test/spec/d.we)
+- [Build with multiple element tag](test/spec/e.we)
+- [Build from parted files specifed in `src` attr](test/spec/f.we)
+- [Manually Require component and specifies an alias name](test/spec/g.we)
+- [Automaticely require component under some folder](test/spec/h.we)
+- [Build with config/data tag](test/spec/i.we)
+- [Require weex module](test/spec/j.we)
+- [Build by using custom language](test/spec/k.we)
+- [Require commonjs module](test/spec/l.we)
+- [Require weex module in commonjs module](test/spec/m.we)
+- [Build with sourcemap(no test)](test/spec/n.we)
+
+## Knew Issues
+
+- [`Bug` Source Map Offset](https://github.com/webpack/webpack/issues/2145). Encoding to this problem, please use `devtool:"eval-source-map"` instead of `devtool:"source-map"`.
+- [`Bug` Can't set debugger breakpoint](#). I still don't know the reason, but you can debug with `debugger` keywords.
+
+
+
+
 
diff --git a/package.json b/package.json
index 441d91f..d7d304c 100644
--- a/package.json
+++ b/package.json
@@ -39,6 +39,7 @@
     "eslint": "^2.13.1",
     "jade": "^1.11.0",
     "jade-html-loader": "0.0.3",
+    "js-base64": "^2.1.9",
     "mocha": "^2.4.5",
     "parse5": "^2.1.5",
     "postcss-cssnext": "^2.7.0",
diff --git a/src/extract.js b/src/extract.js
index c507912..d103e3f 100644
--- a/src/extract.js
+++ b/src/extract.js
@@ -5,10 +5,12 @@
 } from './parser'
 import {
   splitSourceLine,
-  generateMap
+  generateMap,
+  consumeMap
+  // printSourceWithLine
 } from './util'
 
-module.exports = function (source) {
+module.exports = function (source, inputSourceMap) {
   this.cacheable && this.cacheable()
 
   const callback = this.async()
@@ -26,43 +28,68 @@
         result = result[index]
       }
       const content = result.content.trim()
+
       let map
-      if (this.sourceMap && type === 'scripts') {
+      if (this.sourceMap &&
+        (type === 'scripts' || type === 'elements')) {
+        const contentLineStart = result.line
         let contentLineCount = 0
+
+        let cmap
+        if (inputSourceMap) {
+          cmap = consumeMap(this, source, inputSourceMap)
+          source = cmap.sourcesContent.join('')
+            // printSourceWithLine(source)
+        }
+
         const iterator = splitSourceLine(content)
-                          .map((input, line) => {
-                            contentLineCount++
-                            line = line + 1
-                            return {
-                              original: {
-                                line: line + result.line,
-                                column: 0
-                              },
-                              generated: {
-                                line: line,
-                                column: 0
-                              }
-                            }
-                          })
+          .map((input, line) => {
+            contentLineCount++
+            line = line + 1
+            let originalLine = line + contentLineStart
+            const generatedLine = line
+            if (cmap) {
+              // mapping to the original of input source
+              originalLine = cmap.mapping[`line-${originalLine}-column-0`].line
+                // console.log(originalLine + ':', input)
+            }
+            return {
+              original: {
+                line: originalLine,
+                column: 0
+              },
+              generated: {
+                line: generatedLine,
+                column: 0
+              }
+            }
+          })
 
-        const commentSource = splitSourceLine(source)
-                          .map((input, line) => {
-                            line = line + 1
-                            if (line <= result.line
-                                  || line > result.line + contentLineCount) {
-                              return '// ' + input + ' /* generated by weex-loader */'
-                            }
-                            else {
-                              return input
-                            }
-                          }).join('\n')
+        // if (type === 'scripts') {
+        //   let lineStart = contentLineStart
+        //   if (cmap) {
+        //     // mapping to the original of input source
+        //     lineStart = cmap.mapping[`line-${lineStart}-column-0`].line
+        //   }
+        //   source = splitSourceLine(source)
+        //     .map((input, line) => {
+        //       line = line + 1
+        //       // console.log(line + ':', input)
+        //       if (line === lineStart
+        //           || line === lineStart + contentLineCount + 1) {
+        //         return input + ' /* generated by weex-loader */'
+        //       } else {
+        //         return input
+        //       }
+        //     }).join('\n')
+        // }
 
-        map = generateMap(this, commentSource, iterator)
+        map = generateMap(this, source, iterator)
       }
 
       return [content, map]
     }).then(([content, map]) => {
-      callback(null, content, map && map.toJSON())
+      callback(null, content, map && map.toJSON() || inputSourceMap)
     }).catch(e => {
       callback(e, '')
     })
diff --git a/src/loader.js b/src/loader.js
index e364507..0fc97fe 100644
--- a/src/loader.js
+++ b/src/loader.js
@@ -191,6 +191,7 @@
 
 function loader (source) {
   this.cacheable && this.cacheable()
+
   const options = this.options.weex || {}
   const customLang = options.lang || {}
 
diff --git a/src/util.js b/src/util.js
index 325a734..d1328f9 100644
--- a/src/util.js
+++ b/src/util.js
@@ -1,7 +1,10 @@
 import path from 'path'
 import loaderUtils from 'loader-utils'
 import hash from 'hash-sum'
-import { SourceMapGenerator } from 'source-map'
+import {
+  SourceMapGenerator,
+  SourceMapConsumer
+} from 'source-map'
 
 import * as config from './config'
 
@@ -12,7 +15,7 @@
 export function getFileNameWithHash (resourcePath, content) {
   const filename = path.relative('.', resourcePath)
   const cacheKey = hash(filename + content)
-  return `${filename}?${cacheKey}`
+  return `./${filename}?${cacheKey}`
 }
 
 export const FUNC_START = '#####FUN_S#####'
@@ -74,8 +77,15 @@
 }
 
 export function generateMap (loader, source, iterator) {
-  const fileNameWithHash = getFileNameWithHash(loader.resourcePath)
-  const map = new SourceMapGenerator()
+  const filePath = loader.resourcePath
+
+  const fileNameWithHash = getFileNameWithHash(filePath)
+  const sourceRoot = path.resolve('.')
+
+  const map = new SourceMapGenerator({
+    sourceRoot,
+    skipValidation: true
+  })
   map.setSourceContent(fileNameWithHash, source)
 
   for (const { original, generated } of iterator) {
@@ -89,7 +99,59 @@
   return map
 }
 
+export function consumeMap (loader, target, map) {
+  const smc = new SourceMapConsumer(map)
+  let source
+  const original = []
+  const generated = []
+  const mapping = {}
+
+  splitSourceLine(target)
+    .forEach((input, line) => {
+      const column = 0
+      line = line + 1
+
+      const pos = smc.originalPositionFor({
+        line,
+        column
+      })
+
+      if (pos.source) {
+        source = pos.source
+        original.push({
+          line: pos.line,
+          column: pos.column
+        })
+        generated.push({
+          line,
+          column
+        })
+        mapping[`line-${line}-column-${column}`] = {
+          line: pos.line,
+          column: pos.column
+        }
+      }
+    })
+
+  return {
+    source,
+    original,
+    generated,
+    mapping,
+    sourcesContent: smc.sourcesContent
+  }
+}
+
 const LINE_REG = /\r?\n/g
 export function splitSourceLine (source) {
   return source.split(LINE_REG)
 }
+
+export function printSourceWithLine (source) {
+  console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
+  source = splitSourceLine(source)
+              .map((input, line) => {
+                console.log(line + 1 + ':', input)
+              })
+  console.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
+}
diff --git a/test/spec/name.js b/test/spec/name.js
index 934290b..d52e553 100644
--- a/test/spec/name.js
+++ b/test/spec/name.js
@@ -1,5 +1,5 @@
-module.exports = {
-    data: function() {
+export default {
+    data() {
         console.log('Name Component Comment')
         return {
             name: ''
diff --git a/test/test.js b/test/test.js
index f9aaac8..4208749 100644
--- a/test/test.js
+++ b/test/test.js
@@ -9,6 +9,10 @@
 const expect = chai.expect;
 chai.use(sinonChai);
 
+const Base64 = require('js-base64').Base64;
+const SourceMap = require('source-map');
+
+
 
 function getActualString(name) {
   const filepath = path.resolve(__dirname, 'actual', `${name}.js`);
@@ -31,6 +35,13 @@
   }, '  ');
 }
 
+function extractMap(actualStr) {
+  const mapStr = actualStr.match(/\/\/\# sourceMappingURL=data:application\/json;charset=utf-8;base64,([0-9a-zA-Z=+\/]+)/)
+  if (mapStr) {
+    return JSON.parse(Base64.decode(mapStr[1]));
+  }
+}
+
 describe('build', () => {
   let __weex_define__;
   let __weex_bootstrap__;
@@ -43,12 +54,14 @@
     const fn = new Function('__weex_define__', '__weex_bootstrap__', actualStr);
     fn(__weex_define__, __weex_bootstrap__);
 
-    const filepath = path.resolve(__dirname, 'expect', `${name}.js`);
-    fs.writeFileSync(filepath, stringifyActual(components), 'utf-8');
+    // const filepath = path.resolve(__dirname, 'expect', `${name}.js`);
+    // fs.writeFileSync(filepath, stringifyActual(components), 'utf-8');
 
     const expectJSON = getExpectJSON(name);
     expect(JSON.parse(stringifyActual(components))).eql(expectJSON);
     expect(components).to.include.keys(__weex_bootstrap__.firstCall.args[0]);
+
+    return actualStr;
   }
 
   beforeEach(() => {
@@ -132,7 +145,20 @@
     expect(requireStub.firstCall.args).eql(['@weex-module/modal']);
   });
 
-  it('template with sourcemap', () => {
-    expectActual('n');
-  })
+  it.skip('template with sourcemap', () => {
+    const actualStr = expectActual('n');
+    const map = extractMap(actualStr);
+    const smc = new SourceMap.SourceMapConsumer(map);
+
+    // new Array(276).fill(0).forEach((n, i) => {
+    //   i = i + 1
+    //   const original = smc.originalPositionFor({
+    //     line: i,
+    //     column: 0
+    //   })
+    //   if (original.source) {
+    //     console.log(i, original.line, original.source)
+    //   }
+    // })
+  });
 })
diff --git a/test/webpack.config.js b/test/webpack.config.js
index bfd8e4a..1b0f484 100644
--- a/test/webpack.config.js
+++ b/test/webpack.config.js
@@ -30,7 +30,7 @@
       }
     ]
   },
-  devtool: 'source-map',
+  devtool: 'inline-source-map',
   resolveLoader: {
     modulesDirectories: ['./', './node_modules']
   },