diff --git a/lib/compilers/typescript-compiler.js b/lib/compilers/typescript-compiler.js index 98cdaab3..1b5f3256 100644 --- a/lib/compilers/typescript-compiler.js +++ b/lib/compilers/typescript-compiler.js @@ -1,55 +1,12 @@ -const tsconfig = require('tsconfig') const ensureRequire = require('../ensure-require') const compileBabel = require('./babel-compiler') const loadBabelConfig = require('../load-babel-config.js') -const cache = require('../cache') -const logger = require('../logger') - -const defaultTypescriptConfig = { - 'compilerOptions': { - 'target': 'es5', - 'lib': [ - 'dom', - 'es6' - ], - 'module': 'es2015', - 'moduleResolution': 'node', - 'types': ['vue-typescript-import-dts', 'jest', 'node'], - 'isolatedModules': false, - 'experimentalDecorators': true, - 'noImplicitAny': true, - 'noImplicitThis': true, - 'strictNullChecks': true, - 'removeComments': true, - 'emitDecoratorMetadata': true, - 'suppressImplicitAnyIndexErrors': true, - 'allowSyntheticDefaultImports': true, - 'sourceMap': true, - 'allowJs': true - } -} - -function getTypescriptConfig () { - const cachedConfig = cache.get('typescript-config') - if (cachedConfig) { - return cachedConfig - } else { - const { config } = tsconfig.loadSync(process.cwd()) - - if (!config) { - logger.info('no tsconfig.json found, defaulting to default typescript options') - } - - const typescriptConfig = config || defaultTypescriptConfig - cache.set('typescript-config', typescriptConfig) - return typescriptConfig - } -} +const { loadTypescriptConfig } = require('../load-typescript-config') module.exports = function compileTypescript (scriptContent) { ensureRequire('typescript', ['typescript']) const typescript = require('typescript') - const tsConfig = getTypescriptConfig() + const tsConfig = loadTypescriptConfig() const res = typescript.transpileModule(scriptContent, tsConfig) const inputSourceMap = (res.sourceMapText !== undefined) diff --git a/lib/load-typescript-config.js b/lib/load-typescript-config.js new file mode 100644 index 00000000..8d72a477 --- /dev/null +++ b/lib/load-typescript-config.js @@ -0,0 +1,46 @@ +const tsconfig = require('tsconfig') +const cache = require('./cache') +const logger = require('./logger') + +const defaultTypescriptConfig = { + 'compilerOptions': { + 'target': 'es5', + 'lib': [ + 'dom', + 'es6' + ], + 'module': 'es2015', + 'moduleResolution': 'node', + 'types': ['vue-typescript-import-dts', 'jest', 'node'], + 'isolatedModules': false, + 'experimentalDecorators': true, + 'noImplicitAny': true, + 'noImplicitThis': true, + 'strictNullChecks': true, + 'removeComments': true, + 'emitDecoratorMetadata': true, + 'suppressImplicitAnyIndexErrors': true, + 'allowSyntheticDefaultImports': true, + 'sourceMap': true, + 'allowJs': true + } +} + +module.exports.loadTypescriptConfig = function loadTypescriptConfig () { + const cachedConfig = cache.get('typescript-config') + if (cachedConfig) { + return cachedConfig + } else { + const { path, config } = tsconfig.loadSync(process.cwd()) + + if (!path) { + logger.info('no tsconfig.json found, defaulting to default typescript options') + } + + const typescriptConfig = path ? config : defaultTypescriptConfig + cache.set('typescript-config', typescriptConfig) + return typescriptConfig + } +} + +module.exports.defaultConfig = defaultTypescriptConfig diff --git a/test/load-typescript-config.spec.js b/test/load-typescript-config.spec.js new file mode 100644 index 00000000..b41ef330 --- /dev/null +++ b/test/load-typescript-config.spec.js @@ -0,0 +1,55 @@ +import { defaultConfig, loadTypescriptConfig } from '../lib/load-typescript-config' +import { resolve } from 'path' +import { + createReadStream, + createWriteStream, + readFileSync, + renameSync +} from 'fs' +import clearModule from 'clear-module' +import cache from '../lib/cache' + +describe('load-typescript-config.js', () => { + beforeEach(() => { + cache.flushAll() + clearModule.all() + }) + + it('returns the default config if there is no tsconfig.json', () => { + const tsconfigPath = resolve(__dirname, '../tsconfig.json') + const tempPath = resolve(__dirname, '../.renamed') + renameSync(tsconfigPath, tempPath) + + const tsConfig = loadTypescriptConfig() + + try { + expect(tsConfig).toEqual(defaultConfig) + } catch (err) { + renameSync(tempPath, tsconfigPath) + throw err + } + + renameSync(tempPath, tsconfigPath) + const tsconfigCachedConfig = loadTypescriptConfig() + expect(tsconfigCachedConfig).toEqual(defaultConfig) + }) + + it('reads default tsconfig if there is tsconfig.json', () => { + const tsconfigPath = resolve(__dirname, '../tsconfig.json') + const tsconfigCopiedPath = resolve(__dirname, '../.tsconfig.json_cp') + createReadStream(tsconfigPath).pipe(createWriteStream(tsconfigCopiedPath)) + const tsconfigOriginal = JSON.parse(readFileSync(tsconfigPath, { encoding: 'utf8' })) + const tsconfig = loadTypescriptConfig() + expect(tsconfig).toEqual(tsconfigOriginal) + const tempPath = resolve(__dirname, '../.renamed') + renameSync(tsconfigCopiedPath, tempPath) + const tsconfigCached = loadTypescriptConfig() + try { + expect(tsconfig).not.toBe(tsconfigCached) + expect(tsconfig).toEqual(tsconfigCached) + } catch (err) { + renameSync(tempPath, tsconfigCopiedPath) + throw err + } + }) +})