diff --git a/package.json b/package.json
index 8f6ed6b4..94308d5d 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
     "@babel/cli": "^7.0.0",
     "@babel/core": "^7.0.0",
     "@babel/preset-env": "^7.0.0",
+    "@babel/preset-typescript": "^7.1.0",
     "ava": "0.25.0",
     "babel-eslint": "^8.0.0",
     "babel-plugin-istanbul": "^4.0.0",
diff --git a/src/index.js b/src/index.js
index 39616d41..f37960d8 100644
--- a/src/index.js
+++ b/src/index.js
@@ -121,8 +121,18 @@ async function loader(source, inputSourceMap, overrides) {
     delete loaderOptions.sourceMap;
   }
 
+  let transformedFileName = filename;
+  if (loaderOptions.transformFileName) {
+    const pattern = loaderOptions.transformFileName.pattern;
+    const replace = loaderOptions.transformFileName.replace;
+
+    if (pattern && replace) {
+      transformedFileName = filename.replace(pattern, replace);
+    }
+  }
+
   const programmaticOptions = Object.assign({}, loaderOptions, {
-    filename,
+    filename: transformedFileName,
     inputSourceMap: inputSourceMap || undefined,
 
     // Set the default sourcemap behavior based on Webpack's mapping flag,
@@ -137,7 +147,9 @@ async function loader(source, inputSourceMap, overrides) {
     // modules.
     sourceFileName: filename,
   });
+
   // Remove loader related options
+  delete programmaticOptions.transformFileName;
   delete programmaticOptions.customize;
   delete programmaticOptions.cacheDirectory;
   delete programmaticOptions.cacheIdentifier;
diff --git a/test/fixtures/TestTS.ts b/test/fixtures/TestTS.ts
new file mode 100644
index 00000000..49d1b33d
--- /dev/null
+++ b/test/fixtures/TestTS.ts
@@ -0,0 +1,12 @@
+export default class TestTsCls{
+  private name: string;
+
+  constructor(){
+    this.name = "SomeName";
+  }
+
+  someMethod(arg1: string): number{
+    return 42;
+  }
+  
+}
diff --git a/test/fixtures/TestTsVUE.vue b/test/fixtures/TestTsVUE.vue
new file mode 100644
index 00000000..edd6f874
--- /dev/null
+++ b/test/fixtures/TestTsVUE.vue
@@ -0,0 +1,12 @@
+export default class TestTsVueCls{
+  private name123: string;
+
+  constructor(){
+    this.name123 = "SomeName123";
+  }
+
+  someMethod123(arg1: string): number{
+    return 42123;
+  }
+
+}
diff --git a/test/loader.test.js b/test/loader.test.js
index db08b8a8..1da2057d 100644
--- a/test/loader.test.js
+++ b/test/loader.test.js
@@ -127,3 +127,80 @@ test.cb(
     });
   },
 );
+
+test.cb(
+  "should perform all *.js, *.ts and *.vue files compilation successfully",
+  t => {
+    const config = {
+      mode: "development",
+      entry: {
+        firstEntry: path.join(__dirname, "fixtures/basic.js"),
+        secondEntry: path.join(__dirname, "fixtures/TestTS.ts"),
+        thirdEntry: path.join(__dirname, "fixtures/TestTsVUE.vue"),
+      },
+      output: {
+        path: t.context.directory,
+      },
+      module: {
+        rules: [
+          {
+            test: /\.((jsx?)|ts|vue)$/,
+            loader: babelLoader,
+            options: {
+              presets: ["@babel/preset-env", "@babel/preset-typescript"],
+              transformFileName: {
+                pattern: /(\.vue)$/,
+                replace: "$1.ts",
+              },
+            },
+            exclude: /node_modules/,
+          },
+        ],
+      },
+    };
+    webpack(config, (err, stats) => {
+      t.is(err, null);
+      t.is(stats.compilation.warnings.length, 0);
+      t.is(stats.compilation.errors.length, 0);
+      t.end();
+    });
+  },
+);
+
+test.cb("should return compilation error about a *.vue file", t => {
+  const config = {
+    mode: "development",
+    entry: {
+      firstEntry: path.join(__dirname, "fixtures/basic.js"),
+      secondEntry: path.join(__dirname, "fixtures/TestTS.ts"),
+      thirdEntry: path.join(__dirname, "fixtures/TestTsVUE.vue"),
+    },
+    output: {
+      path: t.context.directory,
+    },
+    module: {
+      rules: [
+        {
+          test: /\.((jsx?)|ts|vue)$/,
+          loader: babelLoader,
+          options: {
+            presets: ["@babel/preset-env", "@babel/preset-typescript"],
+          },
+          exclude: /node_modules/,
+        },
+      ],
+    },
+  };
+  webpack(config, (err, stats) => {
+    t.is(err, null);
+    t.is(stats.compilation.warnings.length, 0);
+    t.is(stats.compilation.errors.length, 1);
+    const moduleBuildError = stats.compilation.errors[0];
+    const babelLoaderError = moduleBuildError.error;
+    t.regex(
+      babelLoaderError.stack,
+      /SyntaxError.+TestTsVUE.vue.+Unexpected token/,
+    );
+    t.end();
+  });
+});
diff --git a/yarn.lock b/yarn.lock
index 269ceec6..7324c709 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -344,6 +344,13 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
+"@babel/plugin-syntax-typescript@^7.0.0":
+  version "7.1.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.1.5.tgz#956a1f43dec8a9d6b36221f5c865335555fdcb98"
+  integrity sha512-VqK5DFcS6/T8mT5CcJv1BwZLYFxkHiGZmP7Hs87F53lSToE/qfL7TpPrqFSaKyZi9w7Z/b/tmOGZZDupcJjFvw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+
 "@babel/plugin-transform-arrow-functions@^7.0.0":
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749"
@@ -524,6 +531,14 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
+"@babel/plugin-transform-typescript@^7.1.0":
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.1.0.tgz#81e7b4be90e7317cbd04bf1163ebf06b2adee60b"
+  integrity sha512-TOTtVeT+fekAesiCHnPz+PSkYSdOSLyLn42DI45nxg6iCdlQY6LIj/tYqpMB0y+YicoTUiYiXqF8rG6SKfhw6Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/plugin-syntax-typescript" "^7.0.0"
+
 "@babel/plugin-transform-unicode-regex@^7.0.0":
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc"
@@ -578,6 +593,14 @@
     js-levenshtein "^1.1.3"
     semver "^5.3.0"
 
+"@babel/preset-typescript@^7.1.0":
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz#49ad6e2084ff0bfb5f1f7fb3b5e76c434d442c7f"
+  integrity sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/plugin-transform-typescript" "^7.1.0"
+
 "@babel/template@7.0.0-beta.40":
   version "7.0.0-beta.40"
   resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.40.tgz#034988c6424eb5c3268fe6a608626de1f4410fc8"