Skip to content

Commit 63b7bab

Browse files
committed
fix: correct providing a default tsconfig if none exists
Fixes vuejs#84
1 parent 9cef21f commit 63b7bab

File tree

3 files changed

+103
-45
lines changed

3 files changed

+103
-45
lines changed

lib/compilers/typescript-compiler.js

+2-45
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,12 @@
1-
const tsconfig = require('tsconfig')
21
const ensureRequire = require('../ensure-require')
32
const compileBabel = require('./babel-compiler')
43
const loadBabelConfig = require('../load-babel-config.js')
5-
const cache = require('../cache')
6-
const logger = require('../logger')
7-
8-
const defaultTypescriptConfig = {
9-
'compilerOptions': {
10-
'target': 'es5',
11-
'lib': [
12-
'dom',
13-
'es6'
14-
],
15-
'module': 'es2015',
16-
'moduleResolution': 'node',
17-
'types': ['vue-typescript-import-dts', 'jest', 'node'],
18-
'isolatedModules': false,
19-
'experimentalDecorators': true,
20-
'noImplicitAny': true,
21-
'noImplicitThis': true,
22-
'strictNullChecks': true,
23-
'removeComments': true,
24-
'emitDecoratorMetadata': true,
25-
'suppressImplicitAnyIndexErrors': true,
26-
'allowSyntheticDefaultImports': true,
27-
'sourceMap': true,
28-
'allowJs': true
29-
}
30-
}
31-
32-
function getTypescriptConfig () {
33-
const cachedConfig = cache.get('typescript-config')
34-
if (cachedConfig) {
35-
return cachedConfig
36-
} else {
37-
const { config } = tsconfig.loadSync(process.cwd())
38-
39-
if (!config) {
40-
logger.info('no tsconfig.json found, defaulting to default typescript options')
41-
}
42-
43-
const typescriptConfig = config || defaultTypescriptConfig
44-
cache.set('typescript-config', typescriptConfig)
45-
return typescriptConfig
46-
}
47-
}
4+
const { loadTypescriptConfig } = require('../load-typescript-config')
485

496
module.exports = function compileTypescript (scriptContent) {
507
ensureRequire('typescript', ['typescript'])
518
const typescript = require('typescript')
52-
const tsConfig = getTypescriptConfig()
9+
const tsConfig = loadTypescriptConfig()
5310

5411
const res = typescript.transpileModule(scriptContent, tsConfig)
5512
const inputSourceMap = (res.sourceMapText !== undefined)

lib/load-typescript-config.js

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
const tsconfig = require('tsconfig')
2+
const cache = require('./cache')
3+
const logger = require('./logger')
4+
5+
const defaultTypescriptConfig = {
6+
'compilerOptions': {
7+
'target': 'es5',
8+
'lib': [
9+
'dom',
10+
'es6'
11+
],
12+
'module': 'es2015',
13+
'moduleResolution': 'node',
14+
'types': ['vue-typescript-import-dts', 'jest', 'node'],
15+
'isolatedModules': false,
16+
'experimentalDecorators': true,
17+
'noImplicitAny': true,
18+
'noImplicitThis': true,
19+
'strictNullChecks': true,
20+
'removeComments': true,
21+
'emitDecoratorMetadata': true,
22+
'suppressImplicitAnyIndexErrors': true,
23+
'allowSyntheticDefaultImports': true,
24+
'sourceMap': true,
25+
'allowJs': true
26+
}
27+
}
28+
29+
module.exports.loadTypescriptConfig = function loadTypescriptConfig () {
30+
const cachedConfig = cache.get('typescript-config')
31+
if (cachedConfig) {
32+
return cachedConfig
33+
} else {
34+
const { path, config } = tsconfig.loadSync(process.cwd())
35+
36+
if (!path) {
37+
logger.info('no tsconfig.json found, defaulting to default typescript options')
38+
}
39+
40+
const typescriptConfig = path ? config : defaultTypescriptConfig
41+
cache.set('typescript-config', typescriptConfig)
42+
return typescriptConfig
43+
}
44+
}
45+
46+
module.exports.defaultConfig = defaultTypescriptConfig

test/load-typescript-config.spec.js

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { defaultConfig, loadTypescriptConfig } from '../lib/load-typescript-config'
2+
import { resolve } from 'path'
3+
import {
4+
createReadStream,
5+
createWriteStream,
6+
readFileSync,
7+
renameSync
8+
} from 'fs'
9+
import clearModule from 'clear-module'
10+
import cache from '../lib/cache'
11+
12+
describe('load-typescript-config.js', () => {
13+
beforeEach(() => {
14+
cache.flushAll()
15+
clearModule.all()
16+
})
17+
18+
it('returns the default config if there is no tsconfig.json', () => {
19+
const tsconfigPath = resolve(__dirname, '../tsconfig.json')
20+
const tempPath = resolve(__dirname, '../.renamed')
21+
renameSync(tsconfigPath, tempPath)
22+
23+
const tsConfig = loadTypescriptConfig()
24+
25+
try {
26+
expect(tsConfig).toEqual(defaultConfig)
27+
} catch (err) {
28+
renameSync(tempPath, tsconfigPath)
29+
throw err
30+
}
31+
32+
renameSync(tempPath, tsconfigPath)
33+
const tsconfigCachedConfig = loadTypescriptConfig()
34+
expect(tsconfigCachedConfig).toEqual(defaultConfig)
35+
})
36+
37+
it('reads default tsconfig if there is tsconfig.json', () => {
38+
const tsconfigPath = resolve(__dirname, '../tsconfig.json')
39+
const tsconfigCopiedPath = resolve(__dirname, '../.tsconfig.json_cp')
40+
createReadStream(tsconfigPath).pipe(createWriteStream(tsconfigCopiedPath))
41+
const tsconfigOriginal = JSON.parse(readFileSync(tsconfigPath, { encoding: 'utf8' }))
42+
const tsconfig = loadTypescriptConfig()
43+
expect(tsconfig).toEqual(tsconfigOriginal)
44+
const tempPath = resolve(__dirname, '../.renamed')
45+
renameSync(tsconfigCopiedPath, tempPath)
46+
const tsconfigCached = loadTypescriptConfig()
47+
try {
48+
expect(tsconfig).not.toBe(tsconfigCached)
49+
expect(tsconfig).toEqual(tsconfigCached)
50+
} catch (err) {
51+
renameSync(tempPath, tsconfigCopiedPath)
52+
throw err
53+
}
54+
})
55+
})

0 commit comments

Comments
 (0)