1 | const path = require('path')
|
2 | const consola = require('consola')
|
3 |
|
4 | const defaults = {
|
5 | ignoreNotFoundWarnings: false,
|
6 | typeCheck: true
|
7 | }
|
8 |
|
9 | function tsModule (_moduleOptions) {
|
10 |
|
11 | const moduleOptions = Object.assign(
|
12 | defaults,
|
13 | this.options.typescript,
|
14 | _moduleOptions
|
15 | )
|
16 |
|
17 |
|
18 | this.options.extensions.push('ts')
|
19 |
|
20 |
|
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,
|
58 | formatter: 'codeframe',
|
59 | logger: consola.withScope('nuxt:typescript')
|
60 | }, moduleOptions.typeCheck)))
|
61 | }
|
62 | })
|
63 | }
|
64 |
|
65 | module.exports = tsModule
|
66 | module.exports.meta = require('../package.json')
|