UNPKG

2.14 kBJavaScriptView Raw
1const path = require('path')
2const consola = require('consola')
3
4const defaults = {
5 ignoreNotFoundWarnings: false,
6 typeCheck: true
7}
8
9function tsModule (_moduleOptions) {
10 // Combine options
11 const moduleOptions = Object.assign(
12 defaults,
13 this.options.typescript,
14 _moduleOptions
15 )
16
17 // Allow TypeScript extension for severMiddlewares (`nuxt.resolver.resolvePath` uses `options.extensions`)
18 this.options.extensions.push('ts')
19
20 // Extend Builder to handle .ts/.tsx files as routes and watch them
21 this.options.build.additionalExtensions = ['ts', 'tsx']
22
23 if (moduleOptions.ignoreNotFoundWarnings) {
24 this.options.build.warningIgnoreFilters.push(warn =>
25 warn.name === 'ModuleDependencyWarning' && /export .* was not found in /.test(warn.message)
26 )
27 }
28
29 this.extendBuild((config, { isClient, isModern }) => {
30 config.resolve.extensions.push('.ts', '.tsx')
31
32 const jsxRule = config.module.rules.find(r => r.test.test('.jsx'))
33 const babelLoader = jsxRule.use[jsxRule.use.length - 1]
34
35 config.module.rules.push(...['ts', 'tsx'].map(ext =>
36 ({
37 test: new RegExp(`\\.${ext}$`, 'i'),
38 use: [
39 babelLoader,
40 {
41 loader: 'ts-loader',
42 options: {
43 transpileOnly: true,
44 [`append${ext.charAt(0).toUpperCase() + ext.slice(1)}SuffixTo`]: [/\.vue$/],
45 ...(moduleOptions.loaders && moduleOptions.loaders[ext])
46 }
47 }
48 ]
49 })
50 ))
51
52 if (moduleOptions.typeCheck && isClient && !isModern) {
53 const ForkTsCheckerWebpackPlugin = require(this.nuxt.resolver.resolveModule('fork-ts-checker-webpack-plugin'))
54 config.plugins.push(new ForkTsCheckerWebpackPlugin(Object.assign({
55 vue: true,
56 tsconfig: path.resolve(this.options.rootDir, 'tsconfig.json'),
57 tslint: false, // We recommend using ESLint so we set this option to `false` by default
58 formatter: 'codeframe',
59 logger: consola.withScope('nuxt:typescript')
60 }, moduleOptions.typeCheck)))
61 }
62 })
63}
64
65module.exports = tsModule
66module.exports.meta = require('../package.json')