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"