From 02722ee44ede29dabbe190b95a91be702416c7a7 Mon Sep 17 00:00:00 2001 From: Ahn Date: Wed, 22 Apr 2020 19:01:38 +0200 Subject: [PATCH 01/12] chore: release 25.5.0-alpha.0 --- appveyor.yml | 48 --------- .../__snapshots__/logger.test.ts.snap | 12 +-- package.json | 2 +- src/__helpers__/fakers.ts | 2 + src/compiler/compiler-utils.spec.ts | 67 ------------ src/compiler/compiler-utils.ts | 9 +- src/compiler/instance.ts | 100 +++++++++--------- src/compiler/language-service.spec.ts | 18 ++-- src/compiler/language-service.ts | 90 +++++++++------- src/compiler/transpiler.spec.ts | 14 ++- src/compiler/transpiler.ts | 27 ++--- src/config/config-set.spec.ts | 6 +- src/types.ts | 4 +- 13 files changed, 147 insertions(+), 252 deletions(-) delete mode 100644 appveyor.yml delete mode 100644 src/compiler/compiler-utils.spec.ts diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index f99c0e7ad8..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,48 +0,0 @@ -# http://www.appveyor.com/docs/appveyor-yml -version: '{build}' -pull_requests: - do_not_increment_build_number: true -skip_tags: true -shallow_clone: true -build: off -deploy: off -platform: x64 -branches: - except: - - gh-pages - -# clear the cache if commit contains given text -init: -- ps: IF ($env:APPVEYOR_REPO_COMMIT_MESSAGE -Match "\[clean ci-cache\]" ) {$env:APPVEYOR_CACHE_SKIP_RESTORE = "true"} -- ps: IF ($env:APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED -Match "\[clean ci-cache\]") {$env:APPVEYOR_CACHE_SKIP_RESTORE = "true"} - -# Install scripts. (runs after repo cloning) -install: - - ps: Install-Product node 8 x64 - - npm install -g npm@^5 - # Typical npm stuff. - # - set CI=true - # Our E2E work dir - - set TS_JEST_E2E_WORKDIR=%APPDATA%\ts-jest-e2e - - set TS_JEST_E2E_OPTIMIZATIONS=1 - - npm ci --ignore-scripts - - npm run clean -- --when-ci-commit-message - -cache: - - .cache -> package.json - - '%APPDATA%\npm-cache' - - '%APPDATA%\ts-jest-e2e\__templates__' - -# Post-install test scripts. -test_script: - - cmd: npm run test:e2e - -# skip_commits: -# files: -# - 'docs/**/*' -# - '**/*.md' -# - .gitignore -# - .gitattributes -# - .travis.yml -# - icon.png -# - commitlint.config.js diff --git a/e2e/__tests__/__snapshots__/logger.test.ts.snap b/e2e/__tests__/__snapshots__/logger.test.ts.snap index f1998d5850..e388cdb108 100644 --- a/e2e/__tests__/__snapshots__/logger.test.ts.snap +++ b/e2e/__tests__/__snapshots__/logger.test.ts.snap @@ -22,14 +22,14 @@ Array [ "[level:20] file caching disabled", "[level:20] initializeLanguageServiceInstance(): create typescript compiler", "[level:20] compileUsingLanguageService(): creating language service", - "[level:20] readThrough(): no cache", + "[level:20] compileAndCacheResult(): no cache", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", "[level:20] compileFn(): computing diagnostics for /Hello.spec.ts using language service", "[level:20] computing cache key for /Hello.ts", "[level:20] processing /Hello.ts", - "[level:20] readThrough(): no cache", + "[level:20] compileAndCacheResult(): no cache", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", @@ -63,7 +63,7 @@ Array [ "[level:20] file caching disabled", "[level:20] initializeLanguageServiceInstance(): create typescript compiler", "[level:20] compileUsingLanguageService(): creating language service", - "[level:20] readThrough(): no cache", + "[level:20] compileAndCacheResult(): no cache", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", @@ -71,7 +71,7 @@ Array [ "[level:20] calling babel-jest processor", "[level:20] computing cache key for /Hello.ts", "[level:20] processing /Hello.ts", - "[level:20] readThrough(): no cache", + "[level:20] compileAndCacheResult(): no cache", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", @@ -107,7 +107,7 @@ Array [ "[level:20] file caching disabled", "[level:20] initializeLanguageServiceInstance(): create typescript compiler", "[level:20] compileUsingLanguageService(): creating language service", - "[level:20] readThrough(): no cache", + "[level:20] compileAndCacheResult(): no cache", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", @@ -115,7 +115,7 @@ Array [ "[level:20] calling babel-jest processor", "[level:20] computing cache key for /Hello.ts", "[level:20] processing /Hello.ts", - "[level:20] readThrough(): no cache", + "[level:20] compileAndCacheResult(): no cache", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", diff --git a/package.json b/package.json index 12644b96a8..fd4816e483 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-jest", - "version": "25.4.0", + "version": "25.5.0-alpha.0", "main": "dist/index.js", "types": "dist/index.d.ts", "bin": "cli.js", diff --git a/src/__helpers__/fakers.ts b/src/__helpers__/fakers.ts index 210e129c24..42aff8eec0 100644 --- a/src/__helpers__/fakers.ts +++ b/src/__helpers__/fakers.ts @@ -72,6 +72,8 @@ export function makeCompiler({ ...jestConfig, testMatch: ['^.+\\.tsx?$'], testRegex: jestConfig?.testRegex ? [...testRegex, ...jestConfig.testRegex] : testRegex, + setupFiles: [], + setupFilesAfterEnv: [], } const cs = new ConfigSet(getJestConfig(jestConfig, tsJestConfig), parentConfig) diff --git a/src/compiler/compiler-utils.spec.ts b/src/compiler/compiler-utils.spec.ts deleted file mode 100644 index e53f1687ee..0000000000 --- a/src/compiler/compiler-utils.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { logger } from 'bs-logger' -import * as fs from 'fs' -import { resolve } from 'path' - -import { makeCompiler } from '../__helpers__/fakers' -import { tempDir } from '../__helpers__/path' -import { MemoryCache, TSFile } from '../types' - -import { cacheResolvedModules, getResolvedModulesCache } from './compiler-utils' - -const memoryCache: MemoryCache = { - contents: Object.create(null), - versions: Object.create(null), - outputs: Object.create(null), - resolvedModules: Object.create(null), - files: new Map(), -} - -describe('cacheResolvedModules', () => { - let spy: jest.SpyInstance - - beforeAll(() => { - // tslint:disable-next-line:no-empty - spy = jest.spyOn(fs, 'writeFileSync') - }) - - beforeEach(() => { - memoryCache.resolvedModules = Object.create(null) - }) - - afterEach(() => { - spy.mockRestore() - }) - - it('should store resolved modules in memory cache and file system when there are resolved modules', () => { - const tmp = tempDir('compiler') - const compiler = makeCompiler({ - jestConfig: { cache: true, cacheDirectory: tmp }, - tsJestConfig: { tsConfig: false }, - }) - const fileName = 'src/__mocks__/main.spec.ts' - const source = JSON.stringify(require('../__mocks__/main.spec')) - - compiler.compile(source, fileName) - cacheResolvedModules(fileName, source, memoryCache, compiler.program!, tmp, logger) - - expect(memoryCache.resolvedModules[fileName].modulePaths).toContain(resolve('src/__mocks__/main.ts')) - expect(memoryCache.resolvedModules[fileName].testFileContent).toEqual(source) - expect(spy).toHaveBeenCalledWith(getResolvedModulesCache(tmp), JSON.stringify(memoryCache.resolvedModules)) - }) - - it(`should store resolved modules in memory cache but not file system when there aren't resolved modules`, () => { - const tmp = tempDir('compiler') - const compiler = makeCompiler({ - jestConfig: { cache: true, cacheDirectory: tmp }, - tsJestConfig: { tsConfig: false }, - }) - const fileName = 'src/__mocks__/thing.spec.ts' - const source = JSON.stringify(require('../__mocks__/thing.spec')) - - compiler.compile(source, fileName) - cacheResolvedModules(fileName, source, memoryCache, compiler.program!, tmp, logger) - - expect(memoryCache.resolvedModules[fileName]).toBeUndefined() - expect(spy).not.toHaveBeenCalled() - }) -}) diff --git a/src/compiler/compiler-utils.ts b/src/compiler/compiler-utils.ts index 7685a9bee7..d459f7dfba 100644 --- a/src/compiler/compiler-utils.ts +++ b/src/compiler/compiler-utils.ts @@ -12,18 +12,15 @@ import { sha1 } from '../util/sha1' /** * @internal */ -export const hasOwn = Object.prototype.hasOwnProperty -/** - * @internal - */ -export function getResolvedModulesCache(cachedir: string): string { - return join(cachedir, sha1('ts-jest-resolved-modules', '\x00')) +export function getResolvedModulesCache(cacheDir: string): string { + return join(cacheDir, sha1('ts-jest-resolved-modules', '\x00')) } /** * @internal * Get resolved modules of a test file and put into memory cache */ +/* istanbul ignore next (we leave this for e2e) */ export function cacheResolvedModules( fileName: string, fileContent: string, diff --git a/src/compiler/instance.ts b/src/compiler/instance.ts index 4058380927..1ea45a1b5c 100644 --- a/src/compiler/instance.ts +++ b/src/compiler/instance.ts @@ -32,7 +32,7 @@ import { Logger } from 'bs-logger' import { readFileSync, writeFileSync } from 'fs' import mkdirp = require('mkdirp') -import { basename, extname, join, normalize } from 'path' +import { basename, extname, join } from 'path' import { ConfigSet } from '../config/config-set' import { CompileFn, CompilerInstance, MemoryCache, TSFile, TsCompiler } from '../types' @@ -92,60 +92,54 @@ const isValidCacheContent = (contents: string): boolean => { * cache mode */ const compileAndCacheResult = ( - cachedir: string | undefined, + cacheDir: string | undefined, memoryCache: MemoryCache, compileFn: CompileFn, getExtension: (fileName: string) => string, logger: Logger, ) => { - if (!cachedir) { - return (code: string, fileName: string, lineOffset?: number) => { - const normalizedFileName = normalize(fileName) - - logger.debug({ normalizedFileName }, 'readThrough(): no cache') - - const [value, sourceMap] = compileFn(code, normalizedFileName, lineOffset) + return (code: string, fileName: string, lineOffset?: number) => { + function getCompileOutput(): string { + const [value, sourceMap] = compileFn(code, fileName, lineOffset) const output = updateOutput(value, fileName, sourceMap, getExtension) - memoryCache.outputs[normalizedFileName] = output + memoryCache.files.set(fileName, { + ...memoryCache.files.get(fileName)!, + output, + }) return output } - } - - // Make sure the cache directory exists before continuing. - mkdirp.sync(cachedir) - try { - const resolvedModulesCache = readFileSync(getResolvedModulesCache(cachedir), 'utf-8') - /* istanbul ignore next (covered by e2e) */ - memoryCache.resolvedModules = JSON.parse(resolvedModulesCache) - } catch (e) {} + if (!cacheDir) { + logger.debug({ fileName }, 'compileAndCacheResult(): no cache') - return (code: string, fileName: string, lineOffset?: number) => { - const normalizedFileName = normalize(fileName) - const cachePath = join(cachedir, getCacheName(code, normalizedFileName)) - const extension = getExtension(normalizedFileName) - const outputPath = `${cachePath}${extension}` - try { - const output = readFileSync(outputPath, 'utf8') - if (isValidCacheContent(output)) { - logger.debug({ normalizedFileName }, 'readThrough(): cache hit') - memoryCache.outputs[normalizedFileName] = output + return getCompileOutput() + } else { + const cachePath = join(cacheDir, getCacheName(code, fileName)) + const extension = getExtension(fileName) + const outputPath = `${cachePath}${extension}` + try { + const output = readFileSync(outputPath, 'utf8') + if (isValidCacheContent(output)) { + logger.debug({ fileName }, 'compileAndCacheResult(): cache hit') + memoryCache.files.set(fileName, { + ...memoryCache.files.get(fileName)!, + output, + }) - return output - } - } catch (err) {} + return output + } + } catch (err) {} - logger.debug({ fileName }, 'readThrough(): cache miss') + logger.debug({ fileName }, 'compileAndCacheResult(): cache miss') - const [value, sourceMap] = compileFn(code, normalizedFileName, lineOffset) - const output = updateOutput(value, normalizedFileName, sourceMap, getExtension) + const output = getCompileOutput() - logger.debug({ normalizedFileName, outputPath }, 'readThrough(): writing caches') + logger.debug({ fileName, outputPath }, 'compileAndCacheResult(): writing caches') - memoryCache.outputs[normalizedFileName] = output - writeFileSync(outputPath, output) + writeFileSync(outputPath, output) - return output + return output + } } } @@ -156,16 +150,13 @@ const compileAndCacheResult = ( export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { const logger = configs.logger.child({ namespace: 'ts-compiler' }) const { - typescript: { options: compilerOptions, fileNames }, + typescript: { options: compilerOptions }, tsJest, } = configs - const cachedir = configs.tsCacheDir + const cacheDir = configs.tsCacheDir const ts = configs.compilerModule // Require the TypeScript compiler and configuration. const extensions = ['.ts', '.tsx'] const memoryCache: MemoryCache = { - contents: Object.create(null), - versions: Object.create(null), - outputs: Object.create(null), resolvedModules: Object.create(null), files: new Map(), } @@ -174,14 +165,21 @@ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { extensions.push('.js') extensions.push('.jsx') } - // Initialize files from TypeScript into project. - for (const path of fileNames) { - const normalizedFilePath = normalize(path) - memoryCache.versions[normalizedFilePath] = 1 - memoryCache.files.set(normalizedFilePath, { + if (cacheDir) { + // Make sure the cache directory exists before continuing. + mkdirp.sync(cacheDir) + try { + const resolvedModulesCache = readFileSync(getResolvedModulesCache(cacheDir), 'utf-8') + /* istanbul ignore next (covered by e2e) */ + memoryCache.resolvedModules = JSON.parse(resolvedModulesCache) + } catch (e) {} + } + /* istanbul ignore next (we leave this for e2e) */ + configs.jest.setupFiles.concat(configs.jest.setupFilesAfterEnv).forEach(setupFile => { + memoryCache.files.set(setupFile, { version: 0, }) - } + }) /** * Get the extension for a transpiled file. */ @@ -196,7 +194,7 @@ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { } else { compilerInstance = initializeTranspilerInstance(configs, memoryCache, logger) } - const compile = compileAndCacheResult(cachedir, memoryCache, compilerInstance.compileFn, getExtension, logger) + const compile = compileAndCacheResult(cacheDir, memoryCache, compilerInstance.compileFn, getExtension, logger) return { cwd: configs.cwd, compile, program: compilerInstance.program } } diff --git a/src/compiler/language-service.spec.ts b/src/compiler/language-service.spec.ts index cb4e0abb39..90b0efa08a 100644 --- a/src/compiler/language-service.spec.ts +++ b/src/compiler/language-service.spec.ts @@ -1,11 +1,11 @@ import { LogLevels } from 'bs-logger' import { removeSync, writeFileSync } from 'fs-extra' -import { normalize } from 'path' import { makeCompiler } from '../__helpers__/fakers' import { logTargetMock } from '../__helpers__/mocks' import { tempDir } from '../__helpers__/path' import ProcessedSource from '../__helpers__/processed-source' +import { normalizeSlashes } from '../util/normalize-slashes' import * as compilerUtils from './compiler-utils' @@ -32,7 +32,7 @@ describe('Language service', () => { expect(logTarget.filteredLines(LogLevels.debug, Infinity)).toMatchInlineSnapshot(` Array [ - "[level:20] readThrough(): cache miss + "[level:20] compileAndCacheResult(): cache miss ", "[level:20] compileFn(): compiling using language service ", @@ -42,7 +42,7 @@ describe('Language service', () => { ", "[level:20] compileFn(): computing diagnostics for test-cache.ts using language service ", - "[level:20] readThrough(): writing caches + "[level:20] compileAndCacheResult(): writing caches ", ] `) @@ -52,7 +52,7 @@ describe('Language service', () => { expect(logTarget.lines).toMatchInlineSnapshot(` Array [ - "[level:20] readThrough(): cache hit + "[level:20] compileAndCacheResult(): cache hit ", ] `) @@ -123,12 +123,14 @@ describe('Language service', () => { tsJestConfig: { tsConfig: false }, }) const fileName = 'src/__mocks__/main.spec.ts' - const source = JSON.stringify(require('../__mocks__/main.spec')) + const source = `import { Thing } from './main' + +export const thing: Thing = { a: 1 }` compiler.compile(source, fileName) expect(spy).toHaveBeenCalled() - expect(spy.mock.calls[0][0]).toEqual(normalize(fileName)) + expect(spy.mock.calls[0][0]).toEqual(normalizeSlashes(fileName)) expect(spy.mock.calls[0][1]).toEqual(source) spy.mockRestore() @@ -143,7 +145,9 @@ describe('Language service', () => { tsJestConfig: { tsConfig: false }, }) const fileName = 'src/__mocks__/main.spec.ts' - const source = JSON.stringify(require('../__mocks__/main.spec')) + const source = `import { Thing } from './main' + +export const thing: Thing = { a: 1 }` compiler.compile(source, fileName) diff --git a/src/compiler/language-service.ts b/src/compiler/language-service.ts index 1f462e2aef..b0483e518f 100644 --- a/src/compiler/language-service.ts +++ b/src/compiler/language-service.ts @@ -12,7 +12,6 @@ import { cacheResolvedModules, getAndCacheProjectReference, getCompileResultFromReferencedProject, - hasOwn, isTestFile, } from './compiler-utils' @@ -38,7 +37,7 @@ export const initializeLanguageServiceInstance = ( const ts = configs.compilerModule const cwd = configs.cwd const cacheDir = configs.tsCacheDir - const { options, projectReferences } = configs.typescript + const { options, projectReferences, fileNames } = configs.typescript const serviceHostTraceCtx = { namespace: 'ts:serviceHost', call: null, @@ -46,29 +45,36 @@ export const initializeLanguageServiceInstance = ( } let projectVersion = 1 // Set the file contents into cache. + /* istanbul ignore next (cover by e2e) */ const updateMemoryCache = (contents: string, fileName: string) => { logger.debug({ fileName }, `updateMemoryCache(): update memory cache for language service`) - const file = memoryCache.files.get(fileName) - /* istanbul ignore next (covered by e2e) */ - if (file && file?.text !== contents) { - file.version++ - file.text = contents - } let shouldIncrementProjectVersion = false - const fileVersion = memoryCache.versions[fileName] ?? 0 - const isFileInCache = fileVersion !== 0 + const isFileInCache = memoryCache.files.has(fileName) && memoryCache.files.get(fileName)!.version !== 0 if (!isFileInCache) { - memoryCache.versions[fileName] = 1 + memoryCache.files.set(fileName, { + text: contents, + version: 1, + }) shouldIncrementProjectVersion = true - } - const previousContents = memoryCache.contents[fileName] - // Avoid incrementing cache when nothing has changed. - if (previousContents !== contents) { - memoryCache.versions[fileName] = fileVersion + 1 - memoryCache.contents[fileName] = contents - // Only bump project version when file is modified in cache, not when discovered for the first time - if (isFileInCache) shouldIncrementProjectVersion = true + } else { + const previousContents = memoryCache.files.get(fileName)!.text + // Avoid incrementing cache when nothing has changed. + if (previousContents !== contents) { + memoryCache.files.set(fileName, { + version: memoryCache.files.get(fileName)!.version + 1, + text: contents, + }) + // Only bump project version when file is modified in cache, not when discovered for the first time + if (isFileInCache) shouldIncrementProjectVersion = true + } + /** + * When a file is from node_modules or referenced to a referenced project and jest wants to transform it, we need + * to make sure that the Program is updated with this information + */ + if (!fileNames.includes(fileName)) { + shouldIncrementProjectVersion = true + } } if (shouldIncrementProjectVersion) projectVersion++ @@ -76,10 +82,10 @@ export const initializeLanguageServiceInstance = ( const serviceHost: _ts.LanguageServiceHost = { getProjectVersion: () => String(projectVersion), getProjectReferences: () => projectReferences, - getScriptFileNames: () => Object.keys(memoryCache.versions), + getScriptFileNames: () => [...memoryCache.files.keys()], getScriptVersion: (fileName: string) => { const normalizedFileName = normalize(fileName) - const version = memoryCache.versions[normalizedFileName] + const version = memoryCache.files.get(normalizedFileName)!.version // We need to return `undefined` and not a string here because TypeScript will use // `getScriptVersion` and compare against their own version - which can be `undefined`. @@ -90,13 +96,18 @@ export const initializeLanguageServiceInstance = ( }, getScriptSnapshot(fileName: string) { const normalizedFileName = normalize(fileName) - const hit = hasOwn.call(memoryCache.contents, normalizedFileName) + const hit = memoryCache.files.has(normalizedFileName) && memoryCache.files.get(normalizedFileName)!.version !== 0 logger.trace({ normalizedFileName, cacheHit: hit }, `getScriptSnapshot():`, 'cache', hit ? 'hit' : 'miss') // Read contents from TypeScript memory cache. - if (!hit) memoryCache.contents[normalizedFileName] = ts.sys.readFile(normalizedFileName) - const contents = memoryCache.contents[normalizedFileName] + if (!hit) { + memoryCache.files.set(normalizedFileName, { + version: 1, + text: ts.sys.readFile(normalizedFileName), + }) + } + const contents = memoryCache.files.get(normalizedFileName)!.text if (contents === undefined) return @@ -116,37 +127,37 @@ export const initializeLanguageServiceInstance = ( } logger.debug('compileUsingLanguageService(): creating language service') + const service: _ts.LanguageService = ts.createLanguageService(serviceHost, ts.createDocumentRegistry()) return { compileFn: (code: string, fileName: string): SourceOutput => { - const normalizedFileName = normalize(fileName) + logger.debug({ fileName }, 'compileFn(): compiling using language service') - logger.debug({ normalizedFileName }, 'compileFn(): compiling using language service') // Must set memory cache before attempting to read file. - updateMemoryCache(code, normalizedFileName) + updateMemoryCache(code, fileName) const referencedProject = getAndCacheProjectReference( - normalizedFileName, + fileName, service.getProgram()!, memoryCache.files, projectReferences, ) if (referencedProject !== undefined) { - logger.debug({ normalizedFileName }, 'compileFn(): get compile result from referenced project') + logger.debug({ fileName }, 'compileFn(): get compile result from referenced project') - return getCompileResultFromReferencedProject(normalizedFileName, configs, memoryCache.files, referencedProject) + return getCompileResultFromReferencedProject(fileName, configs, memoryCache.files, referencedProject) } else { - const output: _ts.EmitOutput = service.getEmitOutput(normalizedFileName) + const output: _ts.EmitOutput = service.getEmitOutput(fileName) // Do type checking by getting TypeScript diagnostics - logger.debug(`compileFn(): computing diagnostics for ${normalizedFileName} using language service`) + logger.debug(`compileFn(): computing diagnostics for ${fileName} using language service`) - doTypeChecking(configs, normalizedFileName, service, logger) + doTypeChecking(configs, fileName, service, logger) /** * We don't need the following logic with no cache run because no cache always gives correct typing */ if (cacheDir) { - if (isTestFile(configs.testMatchPatterns, normalizedFileName)) { - cacheResolvedModules(normalizedFileName, code, memoryCache, service.getProgram()!, cacheDir, logger) + if (isTestFile(configs.testMatchPatterns, fileName)) { + cacheResolvedModules(fileName, code, memoryCache, service.getProgram()!, cacheDir, logger) } else { /* istanbul ignore next (covered by e2e) */ Object.entries(memoryCache.resolvedModules) @@ -157,13 +168,12 @@ export const initializeLanguageServiceInstance = ( * test file for 1st time run after clearing cache because */ return ( - entry[1].modulePaths.find(modulePath => modulePath === normalizedFileName) && - !hasOwn.call(memoryCache.outputs, entry[0]) + entry[1].modulePaths.find(modulePath => modulePath === fileName) && !memoryCache.files.has(entry[0]) ) }) .forEach(entry => { logger.debug( - `compileFn(): computing diagnostics for test file that imports ${normalizedFileName} using language service`, + `compileFn(): computing diagnostics for test file that imports ${fileName} using language service`, ) const testFileName = entry[0] @@ -174,13 +184,13 @@ export const initializeLanguageServiceInstance = ( } /* istanbul ignore next (this should never happen but is kept for security) */ if (output.emitSkipped) { - throw new TypeError(`${relative(cwd, normalizedFileName)}: Emit skipped for language service`) + throw new TypeError(`${relative(cwd, fileName)}: Emit skipped for language service`) } // Throw an error when requiring `.d.ts` files. if (!output.outputFiles.length) { throw new TypeError( interpolate(Errors.UnableToRequireDefinitionFile, { - file: basename(normalizedFileName), + file: basename(fileName), }), ) } diff --git a/src/compiler/transpiler.spec.ts b/src/compiler/transpiler.spec.ts index e79bf0cb48..3e6066781a 100644 --- a/src/compiler/transpiler.spec.ts +++ b/src/compiler/transpiler.spec.ts @@ -31,7 +31,7 @@ describe('Transpiler', () => { expect(spy).toHaveBeenCalled() expect(logTarget.filteredLines(LogLevels.debug, Infinity)).toMatchInlineSnapshot(` Array [ - "[level:20] readThrough(): no cache + "[level:20] compileAndCacheResult(): no cache ", "[level:20] compileFn(): compiling as isolated module ", @@ -170,14 +170,18 @@ describe('Transpiler', () => { it('should have correct source maps', () => { const compiler = makeCompiler({ tsJestConfig: { ...baseTsJestConfig, tsConfig: false } }) const source = 'const f = (v: number) => v\nconst t: number = f(5)' + const fileName = 'test-source-map-transpiler.ts' + writeFileSync(fileName, source, 'utf8') - const compiled = compiler.compile(source, __filename) + const compiled = compiler.compile(source, fileName) - expect(new ProcessedSource(compiled, __filename).outputSourceMaps).toMatchObject({ - file: __filename, - sources: [__filename], + expect(new ProcessedSource(compiled, fileName).outputSourceMaps).toMatchObject({ + file: fileName, + sources: [fileName], sourcesContent: [source], }) + + removeSync(fileName) }) it('should not report diagnostics related to typings', () => { diff --git a/src/compiler/transpiler.ts b/src/compiler/transpiler.ts index a93fcfb23d..c25b844234 100644 --- a/src/compiler/transpiler.ts +++ b/src/compiler/transpiler.ts @@ -1,5 +1,4 @@ import { Logger } from 'bs-logger' -import { normalize } from 'path' import * as _ts from 'typescript' import { ConfigSet } from '../config/config-set' @@ -26,6 +25,7 @@ export const initializeTranspilerInstance = ( projectReferences, }) : ts.createProgram([], options) + /* istanbul ignore next (we leave this for e2e) */ const updateFileInCache = (contents: string, filePath: string) => { const file = memoryCache.files.get(filePath) if (file && file.text !== contents) { @@ -36,31 +36,24 @@ export const initializeTranspilerInstance = ( return { compileFn: (code: string, fileName: string): SourceOutput => { - const normalizedFileName = normalize(fileName) - - updateFileInCache(code, normalizedFileName) - const referencedProject = getAndCacheProjectReference( - normalizedFileName, - program, - memoryCache.files, - projectReferences, - ) + updateFileInCache(code, fileName) + const referencedProject = getAndCacheProjectReference(fileName, program, memoryCache.files, projectReferences) /* istanbul ignore next (referencedProject object is too complex to mock so we leave this for e2e) */ if (referencedProject !== undefined) { - logger.debug({ normalizedFileName }, 'compileFn(): get compile result from referenced project') + logger.debug({ fileName }, 'compileFn(): get compile result from referenced project') - return getCompileResultFromReferencedProject(normalizedFileName, configs, memoryCache.files, referencedProject) + return getCompileResultFromReferencedProject(fileName, configs, memoryCache.files, referencedProject) } else { - logger.debug({ normalizedFileName }, 'compileFn(): compiling as isolated module') + logger.debug({ fileName }, 'compileFn(): compiling as isolated module') const result: _ts.TranspileOutput = ts.transpileModule(code, { - fileName: normalizedFileName, + fileName, transformers: configs.tsCustomTransformers, compilerOptions: options, - reportDiagnostics: configs.shouldReportDiagnostic(normalizedFileName), + reportDiagnostics: configs.shouldReportDiagnostic(fileName), }) - if (result.diagnostics && configs.shouldReportDiagnostic(normalizedFileName)) { - configs.raiseDiagnostics(result.diagnostics, normalizedFileName, logger) + if (result.diagnostics && configs.shouldReportDiagnostic(fileName)) { + configs.raiseDiagnostics(result.diagnostics, fileName, logger) } return [result.outputText, result.sourceMapText!] diff --git a/src/config/config-set.spec.ts b/src/config/config-set.spec.ts index 6f4a250141..4f6cdf8664 100644 --- a/src/config/config-set.spec.ts +++ b/src/config/config-set.spec.ts @@ -52,6 +52,7 @@ function createConfigSet({ Object.keys(others).forEach(key => { Object.defineProperty(cs, key, { value: others[key] }) }) + return cs } @@ -875,7 +876,10 @@ describe('shouldReportDiagnostic', () => { describe('tsCompiler', () => { it('should be a compiler object', () => { - const cs = createConfigSet({ tsJestConfig: { tsConfig: false } as any }) + const cs = createConfigSet({ + tsJestConfig: { tsConfig: false } as any, + jestConfig: { setupFiles: [], setupFilesAfterEnv: [] } as any, + }) const compiler = cs.tsCompiler expect(compiler.cwd).toBe(cs.cwd) expect(typeof compiler.compile).toBe('function') diff --git a/src/types.ts b/src/types.ts index 6061dba0d6..8118577fdc 100644 --- a/src/types.ts +++ b/src/types.ts @@ -211,9 +211,6 @@ export type SourceOutput = [string, string] * @internal */ export interface MemoryCache { - contents: { [filePath: string]: string | undefined } - versions: { [filePath: string]: number } - outputs: { [filePath: string]: string } resolvedModules: { [testFilePath: string]: { testFileContent: string @@ -245,6 +242,7 @@ export interface AstTransformerDesc { export type TSFiles = Map export interface TSFile { text?: string + output?: string version: number projectReference?: { /** From d11a4ea290ff3316e935dee926ec102ae7bb14cf Mon Sep 17 00:00:00 2001 From: Ahn Date: Fri, 24 Apr 2020 08:03:12 +0200 Subject: [PATCH 02/12] =?UTF-8?q?perf(compiler):=20don=E2=80=99t=20write?= =?UTF-8?q?=20compile=20output=20to=20file=20system=20but=20rely=20on=20je?= =?UTF-8?q?st=20cache=20(#1561)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__snapshots__/logger.test.ts.snap | 30 ++--- .../language-service.spec.ts.snap | 16 --- .../__snapshots__/transpiler.spec.ts.snap | 18 --- src/compiler/compiler-utils.ts | 12 +- src/compiler/instance.ts | 111 +++--------------- src/compiler/language-service.spec.ts | 48 -------- src/compiler/language-service.ts | 45 +++---- src/compiler/transpiler.spec.ts | 31 ----- src/compiler/transpiler.ts | 2 +- src/types.ts | 4 +- 10 files changed, 68 insertions(+), 249 deletions(-) diff --git a/e2e/__tests__/__snapshots__/logger.test.ts.snap b/e2e/__tests__/__snapshots__/logger.test.ts.snap index e388cdb108..85fd10dfcd 100644 --- a/e2e/__tests__/__snapshots__/logger.test.ts.snap +++ b/e2e/__tests__/__snapshots__/logger.test.ts.snap @@ -21,19 +21,19 @@ Array [ "[level:20] processing /Hello.spec.ts", "[level:20] file caching disabled", "[level:20] initializeLanguageServiceInstance(): create typescript compiler", - "[level:20] compileUsingLanguageService(): creating language service", - "[level:20] compileAndCacheResult(): no cache", + "[level:20] initializeLanguageServiceInstance(): creating language service", + "[level:20] compileAndCacheResult(): get compile output", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", - "[level:20] compileFn(): computing diagnostics for /Hello.spec.ts using language service", + "[level:20] compileFn(): computing diagnostics using language service", "[level:20] computing cache key for /Hello.ts", "[level:20] processing /Hello.ts", - "[level:20] compileAndCacheResult(): no cache", + "[level:20] compileAndCacheResult(): get compile output", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", - "[level:20] compileFn(): computing diagnostics for /Hello.ts using language service", + "[level:20] compileFn(): computing diagnostics using language service", ] `; @@ -62,20 +62,20 @@ Array [ "[level:20] checking version of babel-jest: OK", "[level:20] file caching disabled", "[level:20] initializeLanguageServiceInstance(): create typescript compiler", - "[level:20] compileUsingLanguageService(): creating language service", - "[level:20] compileAndCacheResult(): no cache", + "[level:20] initializeLanguageServiceInstance(): creating language service", + "[level:20] compileAndCacheResult(): get compile output", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", - "[level:20] compileFn(): computing diagnostics for /Hello.spec.ts using language service", + "[level:20] compileFn(): computing diagnostics using language service", "[level:20] calling babel-jest processor", "[level:20] computing cache key for /Hello.ts", "[level:20] processing /Hello.ts", - "[level:20] compileAndCacheResult(): no cache", + "[level:20] compileAndCacheResult(): get compile output", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", - "[level:20] compileFn(): computing diagnostics for /Hello.ts using language service", + "[level:20] compileFn(): computing diagnostics using language service", "[level:20] calling babel-jest processor", ] `; @@ -106,20 +106,20 @@ Array [ "[level:20] checking version of babel-jest: OK", "[level:20] file caching disabled", "[level:20] initializeLanguageServiceInstance(): create typescript compiler", - "[level:20] compileUsingLanguageService(): creating language service", - "[level:20] compileAndCacheResult(): no cache", + "[level:20] initializeLanguageServiceInstance(): creating language service", + "[level:20] compileAndCacheResult(): get compile output", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", - "[level:20] compileFn(): computing diagnostics for /Hello.spec.ts using language service", + "[level:20] compileFn(): computing diagnostics using language service", "[level:20] calling babel-jest processor", "[level:20] computing cache key for /Hello.ts", "[level:20] processing /Hello.ts", - "[level:20] compileAndCacheResult(): no cache", + "[level:20] compileAndCacheResult(): get compile output", "[level:20] compileFn(): compiling using language service", "[level:20] updateMemoryCache(): update memory cache for language service", "[level:20] visitSourceFileNode(): hoisting", - "[level:20] compileFn(): computing diagnostics for /Hello.ts using language service", + "[level:20] compileFn(): computing diagnostics using language service", "[level:20] calling babel-jest processor", ] `; diff --git a/src/compiler/__snapshots__/language-service.spec.ts.snap b/src/compiler/__snapshots__/language-service.spec.ts.snap index c6383bdc3c..4c8fb3d4f2 100644 --- a/src/compiler/__snapshots__/language-service.spec.ts.snap +++ b/src/compiler/__snapshots__/language-service.spec.ts.snap @@ -90,19 +90,3 @@ exports[`Language service should throw error when cannot compile 1`] = ` "Unable to require \`.d.ts\` file for file: test-cannot-compile.d.ts. This is usually the result of a faulty configuration or import. Make sure there is a \`.js\`, \`.json\` or another executable extension available alongside \`test-cannot-compile.d.ts\`." `; - -exports[`Language service should use the cache 3`] = ` - ===[ FILE: test-cache.ts ]====================================================== - console.log("hello"); - //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoidGVzdC1jYWNoZS50cyIsIm1hcHBpbmdzIjoiQUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbInRlc3QtY2FjaGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc29sZS5sb2coXCJoZWxsb1wiKSJdLCJ2ZXJzaW9uIjozfQ== - ===[ INLINE SOURCE MAPS ]======================================================= - file: test-cache.ts - mappings: 'AAAA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA' - names: [] - sources: - - test-cache.ts - sourcesContent: - - console.log("hello") - version: 3 - ================================================================================ -`; diff --git a/src/compiler/__snapshots__/transpiler.spec.ts.snap b/src/compiler/__snapshots__/transpiler.spec.ts.snap index bf6af90209..cb2aba9d45 100644 --- a/src/compiler/__snapshots__/transpiler.spec.ts.snap +++ b/src/compiler/__snapshots__/transpiler.spec.ts.snap @@ -66,24 +66,6 @@ exports[`Transpiler should compile tsx file for other jsx options 1`] = ` ================================================================================ `; -exports[`Transpiler should compile using transpileModule and not use cache 1`] = ` - ===[ FILE: src/compiler/transpiler.spec.ts ]==================================== - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.default = 42; - //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiPGN3ZD4vc3JjL2NvbXBpbGVyL3RyYW5zcGlsZXIuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLGtCQUFlLEVBQUUsQ0FBQSIsIm5hbWVzIjpbXSwic291cmNlcyI6WyI8Y3dkPi9zcmMvY29tcGlsZXIvdHJhbnNwaWxlci5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IDQyIl0sInZlcnNpb24iOjN9 - ===[ INLINE SOURCE MAPS ]======================================================= - file: /src/compiler/transpiler.spec.ts - mappings: ';;AAAA,kBAAe,EAAE,CAAA' - names: [] - sources: - - /src/compiler/transpiler.spec.ts - sourcesContent: - - export default 42 - version: 3 - ================================================================================ -`; - exports[`Transpiler should report diagnostics related to codes with pathRegex config is undefined 1`] = `"foo.ts(2,23): error TS1005: '=>' expected."`; exports[`Transpiler should report diagnostics related to codes with pathRegex config matches file name 1`] = `"foo.ts(2,23): error TS1005: '=>' expected."`; diff --git a/src/compiler/compiler-utils.ts b/src/compiler/compiler-utils.ts index d459f7dfba..3d2ae0f309 100644 --- a/src/compiler/compiler-utils.ts +++ b/src/compiler/compiler-utils.ts @@ -9,6 +9,10 @@ import { EXTENSION_REGEX, JSON_REGEX, TS_TSX_REGEX } from '../constants' import { MemoryCache, SourceOutput, TSFiles } from '../types' import { sha1 } from '../util/sha1' +/** + * @internal + */ +export const hasOwn = Object.prototype.hasOwnProperty /** * @internal */ @@ -35,7 +39,7 @@ export function cacheResolvedModules( * Ugly trick while waiting for https://github.com/microsoft/TypeScript/issues/33994 */ if (importReferences.length) { - logger.debug({ fileName }, `cacheResolvedModules(): get resolved modules of test file ${fileName}`) + logger.debug({ fileName }, `cacheResolvedModules(): get resolved modules`) memoryCache.resolvedModules[fileName] = Object.create(null) memoryCache.resolvedModules[fileName].modulePaths = importReferences @@ -113,7 +117,7 @@ export function getAndCacheProjectReference( files: TSFiles, projectReferences: ReadonlyArray<_ts.ProjectReference> | undefined, ) { - const file = files.get(filePath) + const file = files[filePath] if (file !== undefined && file.projectReference) { return file.projectReference.project } @@ -152,8 +156,8 @@ function getAndCacheOutputJSFileName( projectReference: _ts.ResolvedProjectReference, files: TSFiles, ) { - const file = files.get(inputFileName) - if (file && file.projectReference && file.projectReference.outputFileName) { + const file = files[inputFileName] + if (file?.projectReference && file.projectReference.outputFileName) { return file.projectReference.outputFileName } diff --git a/src/compiler/instance.ts b/src/compiler/instance.ts index 1ea45a1b5c..8ef63a39d8 100644 --- a/src/compiler/instance.ts +++ b/src/compiler/instance.ts @@ -1,42 +1,10 @@ -/** - * This code is heavily inspired from - * https://github.com/JsCommunity/make-error/blob/v1.3.4/index.js - * ...but more modified than expected :-D - * Below is the original license anyway: - * - * --- - * - * The MIT License (MIT) - * - * Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - import { Logger } from 'bs-logger' -import { readFileSync, writeFileSync } from 'fs' +import { readFileSync } from 'fs' import mkdirp = require('mkdirp') -import { basename, extname, join } from 'path' +import { basename, extname } from 'path' import { ConfigSet } from '../config/config-set' -import { CompileFn, CompilerInstance, MemoryCache, TSFile, TsCompiler } from '../types' -import { sha1 } from '../util/sha1' +import { CompileFn, CompilerInstance, MemoryCache, TsCompiler } from '../types' import { getResolvedModulesCache } from './compiler-utils' import { initializeLanguageServiceInstance } from './language-service' @@ -72,74 +40,27 @@ const updateSourceMap = (sourceMapText: string, normalizedFileName: string): str return JSON.stringify(sourceMap) } -/** - * Get the file name for the cache entry. - */ -const getCacheName = (sourceCode: string, normalizedFileName: string): string => { - return sha1(normalizedFileName, '\x00', sourceCode) -} - -/** - * Ensure the given cached content is valid by sniffing for a base64 encoded '}' - * at the end of the content, which should exist if there is a valid sourceMap present. - */ -const isValidCacheContent = (contents: string): boolean => { - return /(?:9|0=|Q==)$/.test(contents.slice(-3)) -} - /** * Compile files which are provided by jest via transform config and cache the result in file system if users run with * cache mode */ const compileAndCacheResult = ( - cacheDir: string | undefined, memoryCache: MemoryCache, compileFn: CompileFn, getExtension: (fileName: string) => string, logger: Logger, ) => { return (code: string, fileName: string, lineOffset?: number) => { - function getCompileOutput(): string { - const [value, sourceMap] = compileFn(code, fileName, lineOffset) - const output = updateOutput(value, fileName, sourceMap, getExtension) - memoryCache.files.set(fileName, { - ...memoryCache.files.get(fileName)!, - output, - }) + logger.debug({ fileName }, 'compileAndCacheResult(): get compile output') - return output + const [value, sourceMap] = compileFn(code, fileName, lineOffset) + const output = updateOutput(value, fileName, sourceMap, getExtension) + memoryCache.files[fileName] = { + ...memoryCache.files[fileName], + output, } - if (!cacheDir) { - logger.debug({ fileName }, 'compileAndCacheResult(): no cache') - - return getCompileOutput() - } else { - const cachePath = join(cacheDir, getCacheName(code, fileName)) - const extension = getExtension(fileName) - const outputPath = `${cachePath}${extension}` - try { - const output = readFileSync(outputPath, 'utf8') - if (isValidCacheContent(output)) { - logger.debug({ fileName }, 'compileAndCacheResult(): cache hit') - memoryCache.files.set(fileName, { - ...memoryCache.files.get(fileName)!, - output, - }) - - return output - } - } catch (err) {} - - logger.debug({ fileName }, 'compileAndCacheResult(): cache miss') - - const output = getCompileOutput() - logger.debug({ fileName, outputPath }, 'compileAndCacheResult(): writing caches') - - writeFileSync(outputPath, output) - - return output - } + return output } } @@ -157,8 +78,8 @@ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { const ts = configs.compilerModule // Require the TypeScript compiler and configuration. const extensions = ['.ts', '.tsx'] const memoryCache: MemoryCache = { + files: Object.create(null), resolvedModules: Object.create(null), - files: new Map(), } // Enable `allowJs` when flag is set. if (compilerOptions.allowJs) { @@ -169,16 +90,16 @@ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { // Make sure the cache directory exists before continuing. mkdirp.sync(cacheDir) try { - const resolvedModulesCache = readFileSync(getResolvedModulesCache(cacheDir), 'utf-8') + const fsMemoryCache = readFileSync(getResolvedModulesCache(cacheDir), 'utf-8') /* istanbul ignore next (covered by e2e) */ - memoryCache.resolvedModules = JSON.parse(resolvedModulesCache) + memoryCache.resolvedModules = JSON.parse(fsMemoryCache) } catch (e) {} } /* istanbul ignore next (we leave this for e2e) */ configs.jest.setupFiles.concat(configs.jest.setupFilesAfterEnv).forEach(setupFile => { - memoryCache.files.set(setupFile, { + memoryCache.files[setupFile] = { version: 0, - }) + } }) /** * Get the extension for a transpiled file. @@ -194,7 +115,7 @@ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { } else { compilerInstance = initializeTranspilerInstance(configs, memoryCache, logger) } - const compile = compileAndCacheResult(cacheDir, memoryCache, compilerInstance.compileFn, getExtension, logger) + const compile = compileAndCacheResult(memoryCache, compilerInstance.compileFn, getExtension, logger) return { cwd: configs.cwd, compile, program: compilerInstance.program } } diff --git a/src/compiler/language-service.spec.ts b/src/compiler/language-service.spec.ts index 90b0efa08a..5bd671d8d9 100644 --- a/src/compiler/language-service.spec.ts +++ b/src/compiler/language-service.spec.ts @@ -1,4 +1,3 @@ -import { LogLevels } from 'bs-logger' import { removeSync, writeFileSync } from 'fs-extra' import { makeCompiler } from '../__helpers__/fakers' @@ -16,53 +15,6 @@ describe('Language service', () => { logTarget.clear() }) - it('should use the cache', () => { - const tmp = tempDir('compiler') - const compiler = makeCompiler({ - jestConfig: { cache: true, cacheDirectory: tmp }, - tsJestConfig: { tsConfig: false }, - }) - const source = 'console.log("hello")' - const fileName = 'test-cache.ts' - - writeFileSync(fileName, source, 'utf8') - - logTarget.clear() - const compiled1 = compiler.compile(source, fileName) - - expect(logTarget.filteredLines(LogLevels.debug, Infinity)).toMatchInlineSnapshot(` - Array [ - "[level:20] compileAndCacheResult(): cache miss - ", - "[level:20] compileFn(): compiling using language service - ", - "[level:20] updateMemoryCache(): update memory cache for language service - ", - "[level:20] visitSourceFileNode(): hoisting - ", - "[level:20] compileFn(): computing diagnostics for test-cache.ts using language service - ", - "[level:20] compileAndCacheResult(): writing caches - ", - ] - `) - - logTarget.clear() - const compiled2 = compiler.compile(source, fileName) - - expect(logTarget.lines).toMatchInlineSnapshot(` - Array [ - "[level:20] compileAndCacheResult(): cache hit - ", - ] - `) - - expect(new ProcessedSource(compiled1, fileName)).toMatchSnapshot() - expect(compiled2).toBe(compiled1) - - removeSync(fileName) - }) - it('should get compile result from referenced project when there is a built reference project', () => { const tmp = tempDir('compiler') const compiler = makeCompiler({ diff --git a/src/compiler/language-service.ts b/src/compiler/language-service.ts index b0483e518f..5fa511e6f2 100644 --- a/src/compiler/language-service.ts +++ b/src/compiler/language-service.ts @@ -12,6 +12,7 @@ import { cacheResolvedModules, getAndCacheProjectReference, getCompileResultFromReferencedProject, + hasOwn, isTestFile, } from './compiler-utils' @@ -50,21 +51,21 @@ export const initializeLanguageServiceInstance = ( logger.debug({ fileName }, `updateMemoryCache(): update memory cache for language service`) let shouldIncrementProjectVersion = false - const isFileInCache = memoryCache.files.has(fileName) && memoryCache.files.get(fileName)!.version !== 0 + const isFileInCache = hasOwn.call(memoryCache.files, fileName) && memoryCache.files[fileName].version !== 0 if (!isFileInCache) { - memoryCache.files.set(fileName, { + memoryCache.files[fileName] = { text: contents, version: 1, - }) + } shouldIncrementProjectVersion = true } else { - const previousContents = memoryCache.files.get(fileName)!.text + const previousContents = memoryCache.files[fileName].text // Avoid incrementing cache when nothing has changed. if (previousContents !== contents) { - memoryCache.files.set(fileName, { - version: memoryCache.files.get(fileName)!.version + 1, + memoryCache.files[fileName] = { text: contents, - }) + version: memoryCache.files[fileName].version + 1, + } // Only bump project version when file is modified in cache, not when discovered for the first time if (isFileInCache) shouldIncrementProjectVersion = true } @@ -82,10 +83,10 @@ export const initializeLanguageServiceInstance = ( const serviceHost: _ts.LanguageServiceHost = { getProjectVersion: () => String(projectVersion), getProjectReferences: () => projectReferences, - getScriptFileNames: () => [...memoryCache.files.keys()], + getScriptFileNames: () => Object.keys(memoryCache.files), getScriptVersion: (fileName: string) => { const normalizedFileName = normalize(fileName) - const version = memoryCache.files.get(normalizedFileName)!.version + const version = memoryCache.files[normalizedFileName].version // We need to return `undefined` and not a string here because TypeScript will use // `getScriptVersion` and compare against their own version - which can be `undefined`. @@ -96,18 +97,19 @@ export const initializeLanguageServiceInstance = ( }, getScriptSnapshot(fileName: string) { const normalizedFileName = normalize(fileName) - const hit = memoryCache.files.has(normalizedFileName) && memoryCache.files.get(normalizedFileName)!.version !== 0 + const hit = + hasOwn.call(memoryCache.files, normalizedFileName) && memoryCache.files[normalizedFileName].version !== 0 logger.trace({ normalizedFileName, cacheHit: hit }, `getScriptSnapshot():`, 'cache', hit ? 'hit' : 'miss') // Read contents from TypeScript memory cache. if (!hit) { - memoryCache.files.set(normalizedFileName, { - version: 1, + memoryCache.files[normalizedFileName] = { text: ts.sys.readFile(normalizedFileName), - }) + version: 1, + } } - const contents = memoryCache.files.get(normalizedFileName)!.text + const contents = memoryCache.files[normalizedFileName]?.text if (contents === undefined) return @@ -126,7 +128,7 @@ export const initializeLanguageServiceInstance = ( getCustomTransformers: () => configs.tsCustomTransformers, } - logger.debug('compileUsingLanguageService(): creating language service') + logger.debug('initializeLanguageServiceInstance(): creating language service') const service: _ts.LanguageService = ts.createLanguageService(serviceHost, ts.createDocumentRegistry()) @@ -149,7 +151,7 @@ export const initializeLanguageServiceInstance = ( } else { const output: _ts.EmitOutput = service.getEmitOutput(fileName) // Do type checking by getting TypeScript diagnostics - logger.debug(`compileFn(): computing diagnostics for ${fileName} using language service`) + logger.debug({ fileName }, `compileFn(): computing diagnostics using language service`) doTypeChecking(configs, fileName, service, logger) /** @@ -168,16 +170,19 @@ export const initializeLanguageServiceInstance = ( * test file for 1st time run after clearing cache because */ return ( - entry[1].modulePaths.find(modulePath => modulePath === fileName) && !memoryCache.files.has(entry[0]) + entry[1].modulePaths.find(modulePath => modulePath === fileName) && + !hasOwn.call(memoryCache.files, entry[0]) ) }) .forEach(entry => { + const testFileName = entry[0] + const testFileContent = entry[1].testFileContent logger.debug( - `compileFn(): computing diagnostics for test file that imports ${fileName} using language service`, + { fileName }, + `compileFn(): computing diagnostics for test file that imports this module using language service`, ) - const testFileName = entry[0] - updateMemoryCache(entry[1].testFileContent, testFileName) + updateMemoryCache(testFileContent, testFileName) doTypeChecking(configs, testFileName, service, logger) }) } diff --git a/src/compiler/transpiler.spec.ts b/src/compiler/transpiler.spec.ts index 3e6066781a..dc00ed9fcd 100644 --- a/src/compiler/transpiler.spec.ts +++ b/src/compiler/transpiler.spec.ts @@ -1,48 +1,17 @@ -import { LogLevels } from 'bs-logger' import { removeSync, writeFileSync } from 'fs-extra' import * as _ts from 'typescript' import { makeCompiler } from '../__helpers__/fakers' -import { logTargetMock } from '../__helpers__/mocks' import ProcessedSource from '../__helpers__/processed-source' import { TS_JEST_OUT_DIR } from '../config/config-set' import * as compilerUtils from './compiler-utils' -const logTarget = logTargetMock() - describe('Transpiler', () => { const baseTsJestConfig = { isolatedModules: true, } - beforeEach(() => { - logTarget.clear() - }) - - it('should compile using transpileModule and not use cache', () => { - const compiler = makeCompiler({ tsJestConfig: { ...baseTsJestConfig, tsConfig: false } }) - const spy = jest.spyOn(_ts, 'transpileModule') - - logTarget.clear() - const compiled = compiler.compile('export default 42', __filename) - - expect(new ProcessedSource(compiled, __filename)).toMatchSnapshot() - expect(spy).toHaveBeenCalled() - expect(logTarget.filteredLines(LogLevels.debug, Infinity)).toMatchInlineSnapshot(` - Array [ - "[level:20] compileAndCacheResult(): no cache - ", - "[level:20] compileFn(): compiling as isolated module - ", - "[level:20] visitSourceFileNode(): hoisting - ", - ] - `) - - spy.mockRestore() - }) - it( 'should call createProgram() with projectReferences, call getAndCacheProjectReference()' + ' and getCompileResultFromReferenceProject() when there are projectReferences from tsconfig', diff --git a/src/compiler/transpiler.ts b/src/compiler/transpiler.ts index c25b844234..fce084ac87 100644 --- a/src/compiler/transpiler.ts +++ b/src/compiler/transpiler.ts @@ -27,7 +27,7 @@ export const initializeTranspilerInstance = ( : ts.createProgram([], options) /* istanbul ignore next (we leave this for e2e) */ const updateFileInCache = (contents: string, filePath: string) => { - const file = memoryCache.files.get(filePath) + const file = memoryCache.files[filePath] if (file && file.text !== contents) { file.version++ file.text = contents diff --git a/src/types.ts b/src/types.ts index 8118577fdc..e22c61c0a0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -239,7 +239,9 @@ export interface AstTransformerDesc { factory(cs: ConfigSet): _ts.TransformerFactory<_ts.SourceFile> } /** where key is filepath */ -export type TSFiles = Map +export interface TSFiles { + [filePath: string]: TSFile +} export interface TSFile { text?: string output?: string From f7a7c6e0b517cd1de5d76a9a3a26b5229af8d396 Mon Sep 17 00:00:00 2001 From: Ahn Date: Sat, 25 Apr 2020 08:05:08 +0200 Subject: [PATCH 03/12] chore: remove resolve dependency (#1563) --- package-lock.json | 6 ++++-- package.json | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 545976c8cd..c291359b6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-jest", - "version": "25.4.0", + "version": "25.5.0-beta.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -7745,7 +7745,8 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, "path-type": { "version": "3.0.0", @@ -8200,6 +8201,7 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, "requires": { "path-parse": "^1.0.6" } diff --git a/package.json b/package.json index fd4816e483..d5ef52b33b 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,6 @@ "make-error": "1.x", "micromatch": "4.x", "mkdirp": "0.x", - "resolve": "1.x", "semver": "6.x", "yargs-parser": "18.x" }, From a9f02bdf3483ac6faff2a2f60592f587642576d8 Mon Sep 17 00:00:00 2001 From: Ahn Date: Sat, 25 Apr 2020 08:15:48 +0200 Subject: [PATCH 04/12] fix(compiler)(**BREAKING**): allow using `files` provided by `tsconfig` (#1562) BREAKING CHANGE: Any custom typing files or files which are needed to be compiled and intended to use with `jest` need to be defined in `files` option of `tsconfig`. For example ``` // tsconfig.json { // ...other configs "files": [ "my-custom-typings.d.ts". "my-global-module.ts" ] } ``` --- .../custom-typings/.gitignore | 115 + .../custom-typings/__tests__/index.test.ts | 9 + .../custom-typings/jest.config.js | 4 + .../custom-typings/jquery.d.ts | 7 + .../custom-typings/package.json | 16 + .../custom-typings/tsconfig.json | 10 + .../custom-typings/yarn.lock | 3559 +++++++++++++++++ scripts/test-external-project.js | 1 + src/__helpers__/fakers.ts | 2 - src/compiler/compiler-utils.ts | 8 +- src/compiler/instance.ts | 4 +- src/config/config-set.spec.ts | 50 +- src/config/config-set.ts | 7 +- tsconfig.json | 8 +- 14 files changed, 3780 insertions(+), 20 deletions(-) create mode 100644 e2e/__external-repos__/custom-typings/.gitignore create mode 100644 e2e/__external-repos__/custom-typings/__tests__/index.test.ts create mode 100644 e2e/__external-repos__/custom-typings/jest.config.js create mode 100644 e2e/__external-repos__/custom-typings/jquery.d.ts create mode 100644 e2e/__external-repos__/custom-typings/package.json create mode 100644 e2e/__external-repos__/custom-typings/tsconfig.json create mode 100644 e2e/__external-repos__/custom-typings/yarn.lock diff --git a/e2e/__external-repos__/custom-typings/.gitignore b/e2e/__external-repos__/custom-typings/.gitignore new file mode 100644 index 0000000000..51c5b1084c --- /dev/null +++ b/e2e/__external-repos__/custom-typings/.gitignore @@ -0,0 +1,115 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.pnp.* diff --git a/e2e/__external-repos__/custom-typings/__tests__/index.test.ts b/e2e/__external-repos__/custom-typings/__tests__/index.test.ts new file mode 100644 index 0000000000..725366c4b1 --- /dev/null +++ b/e2e/__external-repos__/custom-typings/__tests__/index.test.ts @@ -0,0 +1,9 @@ +import $ from "jquery" + +function foo() { + $.ajax("/foo") +} + +test("foo", () => { + expect(2).toBe(2) +}) diff --git a/e2e/__external-repos__/custom-typings/jest.config.js b/e2e/__external-repos__/custom-typings/jest.config.js new file mode 100644 index 0000000000..87c30aa4a7 --- /dev/null +++ b/e2e/__external-repos__/custom-typings/jest.config.js @@ -0,0 +1,4 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +} diff --git a/e2e/__external-repos__/custom-typings/jquery.d.ts b/e2e/__external-repos__/custom-typings/jquery.d.ts new file mode 100644 index 0000000000..a9d9340917 --- /dev/null +++ b/e2e/__external-repos__/custom-typings/jquery.d.ts @@ -0,0 +1,7 @@ +declare global { + interface JQueryStatic { + ajax(url: string, settings?: JQuery.AjaxSettings): JQuery.jqXHR + } +} + +export {} diff --git a/e2e/__external-repos__/custom-typings/package.json b/e2e/__external-repos__/custom-typings/package.json new file mode 100644 index 0000000000..67d96f8695 --- /dev/null +++ b/e2e/__external-repos__/custom-typings/package.json @@ -0,0 +1,16 @@ +{ + "name": "custom-typings", + "private": true, + "scripts": { + "test": "jest" + }, + "dependencies": { + "jquery": "^3.5.0" + }, + "devDependencies": { + "@types/jest": "^25.2.1", + "@types/jquery": "^3.3.35", + "jest": "^25.4.0", + "typescript": "^3.8.3" + } +} diff --git a/e2e/__external-repos__/custom-typings/tsconfig.json b/e2e/__external-repos__/custom-typings/tsconfig.json new file mode 100644 index 0000000000..ea489cdd6f --- /dev/null +++ b/e2e/__external-repos__/custom-typings/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "esModuleInterop": true + }, + "files": [ + "jquery.d.ts" + ] +} diff --git a/e2e/__external-repos__/custom-typings/yarn.lock b/e2e/__external-repos__/custom-typings/yarn.lock new file mode 100644 index 0000000000..4180ff2892 --- /dev/null +++ b/e2e/__external-repos__/custom-typings/yarn.lock @@ -0,0 +1,3559 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/core@^7.1.0", "@babel/core@^7.7.5": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.9.0", "@babel/generator@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" + integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== + dependencies: + "@babel/types" "^7.9.5" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" + integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" + integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" + integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.5" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" + integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" + integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + +"@jest/console@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.4.0.tgz#e2760b532701137801ba824dcff6bc822c961bac" + integrity sha512-CfE0erx4hdJ6t7RzAcE1wLG6ZzsHSmybvIBQDoCkDM1QaSeWL9wJMzID/2BbHHa7ll9SsbbK43HjbERbBaFX2A== + dependencies: + "@jest/types" "^25.4.0" + chalk "^3.0.0" + jest-message-util "^25.4.0" + jest-util "^25.4.0" + slash "^3.0.0" + +"@jest/core@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.4.0.tgz#cc1fe078df69b8f0fbb023bb0bcee23ef3b89411" + integrity sha512-h1x9WSVV0+TKVtATGjyQIMJENs8aF6eUjnCoi4jyRemYZmekLr8EJOGQqTWEX8W6SbZ6Skesy9pGXrKeAolUJw== + dependencies: + "@jest/console" "^25.4.0" + "@jest/reporters" "^25.4.0" + "@jest/test-result" "^25.4.0" + "@jest/transform" "^25.4.0" + "@jest/types" "^25.4.0" + ansi-escapes "^4.2.1" + chalk "^3.0.0" + exit "^0.1.2" + graceful-fs "^4.2.3" + jest-changed-files "^25.4.0" + jest-config "^25.4.0" + jest-haste-map "^25.4.0" + jest-message-util "^25.4.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.4.0" + jest-resolve-dependencies "^25.4.0" + jest-runner "^25.4.0" + jest-runtime "^25.4.0" + jest-snapshot "^25.4.0" + jest-util "^25.4.0" + jest-validate "^25.4.0" + jest-watcher "^25.4.0" + micromatch "^4.0.2" + p-each-series "^2.1.0" + realpath-native "^2.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.4.0.tgz#45071f525f0d8c5a51ed2b04fd42b55a8f0c7cb3" + integrity sha512-KDctiak4mu7b4J6BIoN/+LUL3pscBzoUCP+EtSPd2tK9fqyDY5OF+CmkBywkFWezS9tyH5ACOQNtpjtueEDH6Q== + dependencies: + "@jest/fake-timers" "^25.4.0" + "@jest/types" "^25.4.0" + jest-mock "^25.4.0" + +"@jest/fake-timers@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.4.0.tgz#3a9a4289ba836abd084953dca406389a57e00fbd" + integrity sha512-lI9z+VOmVX4dPPFzyj0vm+UtaB8dCJJ852lcDnY0uCPRvZAaVGnMwBBc1wxtf+h7Vz6KszoOvKAt4QijDnHDkg== + dependencies: + "@jest/types" "^25.4.0" + jest-message-util "^25.4.0" + jest-mock "^25.4.0" + jest-util "^25.4.0" + lolex "^5.0.0" + +"@jest/reporters@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.4.0.tgz#836093433b32ce4e866298af2d6fcf6ed351b0b0" + integrity sha512-bhx/buYbZgLZm4JWLcRJ/q9Gvmd3oUh7k2V7gA4ZYBx6J28pIuykIouclRdiAC6eGVX1uRZT+GK4CQJLd/PwPg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^25.4.0" + "@jest/test-result" "^25.4.0" + "@jest/transform" "^25.4.0" + "@jest/types" "^25.4.0" + chalk "^3.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^25.4.0" + jest-resolve "^25.4.0" + jest-util "^25.4.0" + jest-worker "^25.4.0" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^3.1.0" + terminal-link "^2.0.0" + v8-to-istanbul "^4.1.3" + optionalDependencies: + node-notifier "^6.0.0" + +"@jest/source-map@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.6.tgz#0ef2209514c6d445ebccea1438c55647f22abb4c" + integrity sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.3" + source-map "^0.6.0" + +"@jest/test-result@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.4.0.tgz#6f2ec2c8da9981ef013ad8651c1c6f0cb20c6324" + integrity sha512-8BAKPaMCHlL941eyfqhWbmp3MebtzywlxzV+qtngQ3FH+RBqnoSAhNEPj4MG7d2NVUrMOVfrwuzGpVIK+QnMAA== + dependencies: + "@jest/console" "^25.4.0" + "@jest/types" "^25.4.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.4.0.tgz#2b96f9d37f18dc3336b28e3c8070f97f9f55f43b" + integrity sha512-240cI+nsM3attx2bMp9uGjjHrwrpvxxrZi8Tyqp/cfOzl98oZXVakXBgxODGyBYAy/UGXPKXLvNc2GaqItrsJg== + dependencies: + "@jest/test-result" "^25.4.0" + jest-haste-map "^25.4.0" + jest-runner "^25.4.0" + jest-runtime "^25.4.0" + +"@jest/transform@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.4.0.tgz#eef36f0367d639e2fd93dccd758550377fbb9962" + integrity sha512-t1w2S6V1sk++1HHsxboWxPEuSpN8pxEvNrZN+Ud/knkROWtf8LeUmz73A4ezE8476a5AM00IZr9a8FO9x1+j3g== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^25.4.0" + babel-plugin-istanbul "^6.0.0" + chalk "^3.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.3" + jest-haste-map "^25.4.0" + jest-regex-util "^25.2.6" + jest-util "^25.4.0" + micromatch "^4.0.2" + pirates "^4.0.1" + realpath-native "^2.0.0" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.4.0.tgz#5afeb8f7e1cba153a28e5ac3c9fe3eede7206d59" + integrity sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + +"@sinonjs/commons@^1.7.0": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" + integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw== + dependencies: + type-detect "4.0.8" + +"@types/babel__core@^7.1.7": + version "7.1.7" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" + integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.10" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.10.tgz#d9a99f017317d9b3d1abc2ced45d3bca68df0daf" + integrity sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/jest@25.2.1": + version "25.2.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.1.tgz#9544cd438607955381c1bdbdb97767a249297db5" + integrity sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA== + dependencies: + jest-diff "^25.2.1" + pretty-format "^25.2.1" + +"@types/jquery@3.3.35": + version "3.3.35" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.35.tgz#ab2cbf97e7a04b4dc0faee22b93c633fa540891c" + integrity sha512-pnIELWhHXJ7RgoFylhiTxD+96QlKBJfEx8JCLj963/dh7zBOKFkZ6rlNqbaCcn2JZrsAxCI8WhgRXznBx2iDsA== + dependencies: + "@types/sizzle" "*" + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/prettier@^1.19.0": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" + integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== + +"@types/sizzle@*": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" + integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^15.0.0": + version "15.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" + integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== + dependencies: + "@types/yargs-parser" "*" + +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + +acorn-globals@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^6.0.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + +ajv@^6.5.5: + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +babel-jest@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.4.0.tgz#409eb3e2ddc2ad9a92afdbb00991f1633f8018d0" + integrity sha512-p+epx4K0ypmHuCnd8BapfyOwWwosNCYhedetQey1awddtfmEX0MmdxctGl956uwUmjwXR5VSS5xJcGX9DvdIog== + dependencies: + "@jest/transform" "^25.4.0" + "@jest/types" "^25.4.0" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^25.4.0" + chalk "^3.0.0" + slash "^3.0.0" + +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.4.0.tgz#0c122c1b93fb76f52d2465be2e8069e798e9d442" + integrity sha512-M3a10JCtTyKevb0MjuH6tU+cP/NVQZ82QPADqI1RQYY1OphztsCeIeQmTsHmF/NS6m0E51Zl4QNsI3odXSQF5w== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz#fb4a4c51fe38ca60fede1dc74ab35eb843cb41d6" + integrity sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +babel-preset-jest@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.4.0.tgz#10037cc32b751b994b260964629e49dc479abf4c" + integrity sha512-PwFiEWflHdu3JCeTr0Pb9NcHHE34qWFnPQRVPvqQITx4CsDCzs6o05923I10XvLvn9nNsRHuiVgB72wG/90ZHQ== + dependencies: + babel-plugin-jest-hoist "^25.4.0" + babel-preset-current-node-syntax "^0.1.2" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@1.x, buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" + integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== + dependencies: + cssom "~0.3.6" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.11.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" + integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-25.4.0.tgz#0b16c17401906d1679d173e59f0d4580b22f8dc8" + integrity sha512-7BDIX99BTi12/sNGJXA9KMRcby4iAmu1xccBOhyKCyEhjcVKS3hPmHdA/4nSI9QGIOkUropKqr3vv7WMDM5lvQ== + dependencies: + "@jest/types" "^25.4.0" + ansi-styles "^4.0.0" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.4.0" + jest-message-util "^25.4.0" + jest-regex-util "^25.2.6" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" + integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + +isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6" + integrity sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg== + dependencies: + "@babel/core" "^7.7.5" + "@babel/parser" "^7.7.5" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.4.0.tgz#e573db32c2fd47d2b90357ea2eda0622c5c5cbd6" + integrity sha512-VR/rfJsEs4BVMkwOTuStRyS630fidFVekdw/lBaBQjx9KK3VZFOZ2c0fsom2fRp8pMCrCTP6LGna00o/DXGlqA== + dependencies: + "@jest/types" "^25.4.0" + execa "^3.2.0" + throat "^5.0.0" + +jest-cli@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.4.0.tgz#5dac8be0fece6ce39f0d671395a61d1357322bab" + integrity sha512-usyrj1lzCJZMRN1r3QEdnn8e6E6yCx/QN7+B1sLoA68V7f3WlsxSSQfy0+BAwRiF4Hz2eHauf11GZG3PIfWTXQ== + dependencies: + "@jest/core" "^25.4.0" + "@jest/test-result" "^25.4.0" + "@jest/types" "^25.4.0" + chalk "^3.0.0" + exit "^0.1.2" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^25.4.0" + jest-util "^25.4.0" + jest-validate "^25.4.0" + prompts "^2.0.1" + realpath-native "^2.0.0" + yargs "^15.3.1" + +jest-config@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.4.0.tgz#56e5df3679a96ff132114b44fb147389c8c0a774" + integrity sha512-egT9aKYxMyMSQV1aqTgam0SkI5/I2P9qrKexN5r2uuM2+68ypnc+zPGmfUxK7p1UhE7dYH9SLBS7yb+TtmT1AA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^25.4.0" + "@jest/types" "^25.4.0" + babel-jest "^25.4.0" + chalk "^3.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + jest-environment-jsdom "^25.4.0" + jest-environment-node "^25.4.0" + jest-get-type "^25.2.6" + jest-jasmine2 "^25.4.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.4.0" + jest-util "^25.4.0" + jest-validate "^25.4.0" + micromatch "^4.0.2" + pretty-format "^25.4.0" + realpath-native "^2.0.0" + +jest-diff@^25.2.1, jest-diff@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.4.0.tgz#260b70f19a46c283adcad7f081cae71eb784a634" + integrity sha512-kklLbJVXW0y8UKOWOdYhI6TH5MG6QAxrWiBMgQaPIuhj3dNFGirKCd+/xfplBXICQ7fI+3QcqHm9p9lWu1N6ug== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.4.0" + +jest-docblock@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" + integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.4.0.tgz#ad4e46164764e8e77058f169a0076a7f86f6b7d4" + integrity sha512-lwRIJ8/vQU/6vq3nnSSUw1Y3nz5tkYSFIywGCZpUBd6WcRgpn8NmJoQICojbpZmsJOJNHm0BKdyuJ6Xdx+eDQQ== + dependencies: + "@jest/types" "^25.4.0" + chalk "^3.0.0" + jest-get-type "^25.2.6" + jest-util "^25.4.0" + pretty-format "^25.4.0" + +jest-environment-jsdom@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.4.0.tgz#bbfc7f85bb6ade99089062a830c79cb454565cf0" + integrity sha512-KTitVGMDrn2+pt7aZ8/yUTuS333w3pWt1Mf88vMntw7ZSBNDkRS6/4XLbFpWXYfWfp1FjcjQTOKzbK20oIehWQ== + dependencies: + "@jest/environment" "^25.4.0" + "@jest/fake-timers" "^25.4.0" + "@jest/types" "^25.4.0" + jest-mock "^25.4.0" + jest-util "^25.4.0" + jsdom "^15.2.1" + +jest-environment-node@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.4.0.tgz#188aef01ae6418e001c03fdd1c299961e1439082" + integrity sha512-wryZ18vsxEAKFH7Z74zi/y/SyI1j6UkVZ6QsllBuT/bWlahNfQjLNwFsgh/5u7O957dYFoXj4yfma4n4X6kU9A== + dependencies: + "@jest/environment" "^25.4.0" + "@jest/fake-timers" "^25.4.0" + "@jest/types" "^25.4.0" + jest-mock "^25.4.0" + jest-util "^25.4.0" + semver "^6.3.0" + +jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== + +jest-haste-map@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.4.0.tgz#da7c309dd7071e0a80c953ba10a0ec397efb1ae2" + integrity sha512-5EoCe1gXfGC7jmXbKzqxESrgRcaO3SzWXGCnvp9BcT0CFMyrB1Q6LIsjl9RmvmJGQgW297TCfrdgiy574Rl9HQ== + dependencies: + "@jest/types" "^25.4.0" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.3" + jest-serializer "^25.2.6" + jest-util "^25.4.0" + jest-worker "^25.4.0" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + which "^2.0.2" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.4.0.tgz#3d3d19514022e2326e836c2b66d68b4cb63c5861" + integrity sha512-QccxnozujVKYNEhMQ1vREiz859fPN/XklOzfQjm2j9IGytAkUbSwjFRBtQbHaNZ88cItMpw02JnHGsIdfdpwxQ== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^25.4.0" + "@jest/source-map" "^25.2.6" + "@jest/test-result" "^25.4.0" + "@jest/types" "^25.4.0" + chalk "^3.0.0" + co "^4.6.0" + expect "^25.4.0" + is-generator-fn "^2.0.0" + jest-each "^25.4.0" + jest-matcher-utils "^25.4.0" + jest-message-util "^25.4.0" + jest-runtime "^25.4.0" + jest-snapshot "^25.4.0" + jest-util "^25.4.0" + pretty-format "^25.4.0" + throat "^5.0.0" + +jest-leak-detector@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.4.0.tgz#cf94a160c78e53d810e7b2f40b5fd7ee263375b3" + integrity sha512-7Y6Bqfv2xWsB+7w44dvZuLs5SQ//fzhETgOGG7Gq3TTGFdYvAgXGwV8z159RFZ6fXiCPm/szQ90CyfVos9JIFQ== + dependencies: + jest-get-type "^25.2.6" + pretty-format "^25.4.0" + +jest-matcher-utils@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.4.0.tgz#dc3e7aec402a1e567ed80b572b9ad285878895e6" + integrity sha512-yPMdtj7YDgXhnGbc66bowk8AkQ0YwClbbwk3Kzhn5GVDrciiCr27U4NJRbrqXbTdtxjImONITg2LiRIw650k5A== + dependencies: + chalk "^3.0.0" + jest-diff "^25.4.0" + jest-get-type "^25.2.6" + pretty-format "^25.4.0" + +jest-message-util@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.4.0.tgz#2899e8bc43f5317acf8dfdfe89ea237d354fcdab" + integrity sha512-LYY9hRcVGgMeMwmdfh9tTjeux1OjZHMusq/E5f3tJN+dAoVVkJtq5ZUEPIcB7bpxDUt2zjUsrwg0EGgPQ+OhXQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^25.4.0" + "@types/stack-utils" "^1.0.1" + chalk "^3.0.0" + micromatch "^4.0.2" + slash "^3.0.0" + stack-utils "^1.0.1" + +jest-mock@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.4.0.tgz#ded7d64b5328d81d78d2138c825d3a45e30ec8ca" + integrity sha512-MdazSfcYAUjJjuVTTnusLPzE0pE4VXpOUzWdj8sbM+q6abUjm3bATVPXFqTXrxSieR8ocpvQ9v/QaQCftioQFg== + dependencies: + "@jest/types" "^25.4.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" + integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== + +jest-resolve-dependencies@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.4.0.tgz#783937544cfc40afcc7c569aa54748c4b3f83f5a" + integrity sha512-A0eoZXx6kLiuG1Ui7wITQPl04HwjLErKIJTt8GR3c7UoDAtzW84JtCrgrJ6Tkw6c6MwHEyAaLk7dEPml5pf48A== + dependencies: + "@jest/types" "^25.4.0" + jest-regex-util "^25.2.6" + jest-snapshot "^25.4.0" + +jest-resolve@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.4.0.tgz#6f4540ce0d419c4c720e791e871da32ba4da7a60" + integrity sha512-wOsKqVDFWUiv8BtLMCC6uAJ/pHZkfFgoBTgPtmYlsprAjkxrr2U++ZnB3l5ykBMd2O24lXvf30SMAjJIW6k2aA== + dependencies: + "@jest/types" "^25.4.0" + browser-resolve "^1.11.3" + chalk "^3.0.0" + jest-pnp-resolver "^1.2.1" + read-pkg-up "^7.0.1" + realpath-native "^2.0.0" + resolve "^1.15.1" + slash "^3.0.0" + +jest-runner@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.4.0.tgz#6ca4a3d52e692bbc081228fa68f750012f1f29e5" + integrity sha512-wWQSbVgj2e/1chFdMRKZdvlmA6p1IPujhpLT7TKNtCSl1B0PGBGvJjCaiBal/twaU2yfk8VKezHWexM8IliBfA== + dependencies: + "@jest/console" "^25.4.0" + "@jest/environment" "^25.4.0" + "@jest/test-result" "^25.4.0" + "@jest/types" "^25.4.0" + chalk "^3.0.0" + exit "^0.1.2" + graceful-fs "^4.2.3" + jest-config "^25.4.0" + jest-docblock "^25.3.0" + jest-haste-map "^25.4.0" + jest-jasmine2 "^25.4.0" + jest-leak-detector "^25.4.0" + jest-message-util "^25.4.0" + jest-resolve "^25.4.0" + jest-runtime "^25.4.0" + jest-util "^25.4.0" + jest-worker "^25.4.0" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.4.0.tgz#1e5227a9e2159d26ae27dcd426ca6bc041983439" + integrity sha512-lgNJlCDULtXu9FumnwCyWlOub8iytijwsPNa30BKrSNtgoT6NUMXOPrZvsH06U6v0wgD/Igwz13nKA2wEKU2VA== + dependencies: + "@jest/console" "^25.4.0" + "@jest/environment" "^25.4.0" + "@jest/source-map" "^25.2.6" + "@jest/test-result" "^25.4.0" + "@jest/transform" "^25.4.0" + "@jest/types" "^25.4.0" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.3" + jest-config "^25.4.0" + jest-haste-map "^25.4.0" + jest-message-util "^25.4.0" + jest-mock "^25.4.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.4.0" + jest-snapshot "^25.4.0" + jest-util "^25.4.0" + jest-validate "^25.4.0" + realpath-native "^2.0.0" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.3.1" + +jest-serializer@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.6.tgz#3bb4cc14fe0d8358489dbbefbb8a4e708ce039b7" + integrity sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ== + +jest-snapshot@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.4.0.tgz#e0b26375e2101413fd2ccb4278a5711b1922545c" + integrity sha512-J4CJ0X2SaGheYRZdLz9CRHn9jUknVmlks4UBeu270hPAvdsauFXOhx9SQP2JtRzhnR3cvro/9N9KP83/uvFfRg== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^25.4.0" + "@types/prettier" "^1.19.0" + chalk "^3.0.0" + expect "^25.4.0" + jest-diff "^25.4.0" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.4.0" + jest-message-util "^25.4.0" + jest-resolve "^25.4.0" + make-dir "^3.0.0" + natural-compare "^1.4.0" + pretty-format "^25.4.0" + semver "^6.3.0" + +jest-util@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.4.0.tgz#6a093d09d86d2b41ef583e5fe7dd3976346e1acd" + integrity sha512-WSZD59sBtAUjLv1hMeKbNZXmMcrLRWcYqpO8Dz8b4CeCTZpfNQw2q9uwrYAD+BbJoLJlu4ezVPwtAmM/9/SlZA== + dependencies: + "@jest/types" "^25.4.0" + chalk "^3.0.0" + is-ci "^2.0.0" + make-dir "^3.0.0" + +jest-validate@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.4.0.tgz#2e177a93b716a137110eaf2768f3d9095abd3f38" + integrity sha512-hvjmes/EFVJSoeP1yOl8qR8mAtMR3ToBkZeXrD/ZS9VxRyWDqQ/E1C5ucMTeSmEOGLipvdlyipiGbHJ+R1MQ0g== + dependencies: + "@jest/types" "^25.4.0" + camelcase "^5.3.1" + chalk "^3.0.0" + jest-get-type "^25.2.6" + leven "^3.1.0" + pretty-format "^25.4.0" + +jest-watcher@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.4.0.tgz#63ec0cd5c83bb9c9d1ac95be7558dd61c995ff05" + integrity sha512-36IUfOSRELsKLB7k25j/wutx0aVuHFN6wO94gPNjQtQqFPa2rkOymmx9rM5EzbF3XBZZ2oqD9xbRVoYa2w86gw== + dependencies: + "@jest/test-result" "^25.4.0" + "@jest/types" "^25.4.0" + ansi-escapes "^4.2.1" + chalk "^3.0.0" + jest-util "^25.4.0" + string-length "^3.1.0" + +jest-worker@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.4.0.tgz#ee0e2ceee5a36ecddf5172d6d7e0ab00df157384" + integrity sha512-ghAs/1FtfYpMmYQ0AHqxV62XPvKdUDIBBApMZfly+E9JEmYh2K45G0R5dWxx986RN12pRCxsViwQVtGl+N4whw== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-25.4.0.tgz#fb96892c5c4e4a6b9bcb12068849cddf4c5f8cc7" + integrity sha512-XWipOheGB4wai5JfCYXd6vwsWNwM/dirjRoZgAa7H2wd8ODWbli2AiKjqG8AYhyx+8+5FBEdpO92VhGlBydzbw== + dependencies: + "@jest/core" "^25.4.0" + import-local "^3.0.2" + jest-cli "^25.4.0" + +jquery@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.0.tgz#9980b97d9e4194611c36530e7dc46a58d7340fc9" + integrity sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^15.2.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" + integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== + dependencies: + abab "^2.0.0" + acorn "^7.1.0" + acorn-globals "^4.3.2" + array-equal "^1.0.0" + cssom "^0.4.1" + cssstyle "^2.0.0" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.1" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.2.0" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.7" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^7.0.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@2.x, json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash@^4.17.13, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lolex@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" + integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== + dependencies: + "@sinonjs/commons" "^1.7.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@4.x, micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.x: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" + integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== + dependencies: + growly "^1.3.0" + is-wsl "^2.1.1" + semver "^6.3.0" + shellwords "^0.1.1" + which "^1.3.1" + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +p-each-series@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" + integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.5: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +pretty-format@^25.2.1, pretty-format@^25.4.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.4.0.tgz#c58801bb5c4926ff4a677fe43f9b8b99812c7830" + integrity sha512-PI/2dpGjXK5HyXexLPZU/jw5T9Q6S1YVXxxVxco+LIqzUFHXIbKZKdUVt7GcX7QUCr31+3fzhi4gN4/wUYPVxQ== + dependencies: + "@jest/types" "^25.4.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + +prompts@^2.0.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.4" + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +react-is@^16.12.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +realpath-native@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" + integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@1.x, resolve@^1.10.0, resolve@^1.15.1, resolve@^1.3.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@6.x, semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6: + version "0.5.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.18.tgz#f5f33489e270bd7f7d7e7b8debf283f3a4066960" + integrity sha512-9luZr/BZ2QeU6tO2uG8N2aZpVSli4TSAOAqFOyTO51AJcD9P99c0K1h6dD6r6qo5dyT44BR5exweOaLLeldTkQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" + integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +ts-jest@25.5.0-alpha.0: + version "25.5.0-alpha.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.5.0-alpha.0.tgz#53d8c149a1e39fb0d48514639f7b2adff07b84ef" + integrity sha512-dAXeEqpRuHdDrQdR5Tte922L822oDczNMwVrjfplYd1TNE6cOCsF95qR+KcLFEaPaUpJI7/ol2FeFY04H7z0sg== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + micromatch "4.x" + mkdirp "0.x" + resolve "1.x" + semver "6.x" + yargs-parser "18.x" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" + integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-to-istanbul@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz#22fe35709a64955f49a08a7c7c959f6520ad6f20" + integrity sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.0.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" + integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yargs-parser@18.x, yargs-parser@^18.1.1: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.1" diff --git a/scripts/test-external-project.js b/scripts/test-external-project.js index 902a36cc6f..8bc47e0c25 100755 --- a/scripts/test-external-project.js +++ b/scripts/test-external-project.js @@ -15,6 +15,7 @@ const jestArgs = process.argv.slice(3) let gitUrl = false const externalRepoPath = 'e2e/__external-repos__' const PROJECTS_TO_RUN = [ + `${externalRepoPath}/custom-typings`, `${externalRepoPath}/simple/with-dependency`, `${externalRepoPath}/simple-project-references`, `${externalRepoPath}/yarn-workspace-composite`, diff --git a/src/__helpers__/fakers.ts b/src/__helpers__/fakers.ts index 42aff8eec0..210e129c24 100644 --- a/src/__helpers__/fakers.ts +++ b/src/__helpers__/fakers.ts @@ -72,8 +72,6 @@ export function makeCompiler({ ...jestConfig, testMatch: ['^.+\\.tsx?$'], testRegex: jestConfig?.testRegex ? [...testRegex, ...jestConfig.testRegex] : testRegex, - setupFiles: [], - setupFilesAfterEnv: [], } const cs = new ConfigSet(getJestConfig(jestConfig, tsJestConfig), parentConfig) diff --git a/src/compiler/compiler-utils.ts b/src/compiler/compiler-utils.ts index 3d2ae0f309..dfc4ee81a0 100644 --- a/src/compiler/compiler-utils.ts +++ b/src/compiler/compiler-utils.ts @@ -81,7 +81,7 @@ function isUsingProjectReferences( function getResolvedProjectReferences( program: _ts.Program, ): ReadonlyArray<_ts.ResolvedProjectReference | undefined> | undefined { - const getProjectReferences = program.getResolvedProjectReferences || program.getProjectReferences + const getProjectReferences = program.getResolvedProjectReferences ?? program.getProjectReferences if (getProjectReferences) { return getProjectReferences() } @@ -118,7 +118,7 @@ export function getAndCacheProjectReference( projectReferences: ReadonlyArray<_ts.ProjectReference> | undefined, ) { const file = files[filePath] - if (file !== undefined && file.projectReference) { + if (file?.projectReference) { return file.projectReference.project } @@ -157,13 +157,13 @@ function getAndCacheOutputJSFileName( files: TSFiles, ) { const file = files[inputFileName] - if (file?.projectReference && file.projectReference.outputFileName) { + if (file?.projectReference?.outputFileName) { return file.projectReference.outputFileName } const outputFileName = getOutputJavaScriptFileName(inputFileName, projectReference) if (file !== undefined) { - file.projectReference = file.projectReference || { + file.projectReference = file.projectReference ?? { project: projectReference, } file.projectReference.outputFileName = outputFileName diff --git a/src/compiler/instance.ts b/src/compiler/instance.ts index 8ef63a39d8..19fdfc01a2 100644 --- a/src/compiler/instance.ts +++ b/src/compiler/instance.ts @@ -96,8 +96,8 @@ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { } catch (e) {} } /* istanbul ignore next (we leave this for e2e) */ - configs.jest.setupFiles.concat(configs.jest.setupFilesAfterEnv).forEach(setupFile => { - memoryCache.files[setupFile] = { + configs.typescript.fileNames.forEach(fileName => { + memoryCache.files[fileName] = { version: 0, } }) diff --git a/src/config/config-set.spec.ts b/src/config/config-set.spec.ts index 4f6cdf8664..4d804f3680 100644 --- a/src/config/config-set.spec.ts +++ b/src/config/config-set.spec.ts @@ -474,9 +474,8 @@ describe('typescript', () => { createConfigSet({ tsJestConfig: tsJest, parentConfig }).typescript it('should read file list from default tsconfig', () => { - // since the default is to lookup for tsconfig, - // we should have this file in the list - expect(get().fileNames).toContain(normalizeSlashes(__filename)) + // since the default is to lookup for tsconfig, but we set include to [] so we should not have this file in the list + expect(get().fileNames).toEqual([]) }) it.each(['tsConfig', 'tsconfig'])('should include compiler config from `%s` option key', (key: string) => { @@ -614,6 +613,11 @@ describe('readTsConfig', () => { const conf = cs.readTsConfig() expect(conf.input).toBeUndefined() expect(readConfig).not.toHaveBeenCalled() + expect(parseConfig.mock.calls[0][0]).toEqual( + expect.objectContaining({ + include: [], + }), + ) expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBeUndefined() }) @@ -656,16 +660,27 @@ describe('readTsConfig', () => { expect(conf.input.path).toBe('/root/tsconfig.json') expect(findConfig.mock.calls[0][0]).toBe('/root') expect(readConfig.mock.calls[0][0]).toBe('/root/tsconfig.json') + expect(parseConfig.mock.calls[0][0]).toEqual( + expect.objectContaining({ + include: [], + }), + ) expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBe('/root/tsconfig.json') expect(conf.resolved.options.allowSyntheticDefaultImports).toEqual(true) expect(conf.resolved.errors).toMatchSnapshot() }) + it('should use given tsconfig path', () => { const conf = cs.readTsConfig(undefined, '/foo/tsconfig.bar.json') expect(conf.input.path).toBe('/foo/tsconfig.bar.json') expect(findConfig).not.toBeCalled() expect(readConfig.mock.calls[0][0]).toBe('/foo/tsconfig.bar.json') + expect(parseConfig.mock.calls[0][0]).toEqual( + expect.objectContaining({ + include: [], + }), + ) expect(parseConfig.mock.calls[0][2]).toBe('/foo') expect(parseConfig.mock.calls[0][4]).toBe('/foo/tsconfig.bar.json') expect(conf.resolved.errors).toMatchSnapshot() @@ -693,11 +708,17 @@ describe('readTsConfig', () => { expect(conf.input.path).toBe('/root/tsconfig.json') expect(findConfig.mock.calls[0][0]).toBe('/root') expect(readConfig.mock.calls[0][0]).toBe('/root/tsconfig.json') + expect(parseConfig.mock.calls[0][0]).toEqual( + expect.objectContaining({ + include: [], + }), + ) expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBe('/root/tsconfig.json') expect(conf.resolved.options.allowSyntheticDefaultImports).toEqual(true) expect(conf.resolved.errors).toMatchSnapshot() }) + it('should use given tsconfig path', () => { const conf = cs.readTsConfig(undefined, '/foo/tsconfig.bar.json') expect(conf.input.path).toBe('/foo/tsconfig.bar.json') @@ -730,16 +751,27 @@ describe('readTsConfig', () => { expect(conf.input.path).toBe('/root/tsconfig.json') expect(findConfig.mock.calls[0][0]).toBe('/root') expect(readConfig.mock.calls[0][0]).toBe('/root/tsconfig.json') + expect(parseConfig.mock.calls[0][0]).toEqual( + expect.objectContaining({ + include: [], + }), + ) expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBe('/root/tsconfig.json') expect(conf.resolved.options.allowSyntheticDefaultImports).toBeUndefined() expect(conf.resolved.errors).toEqual([]) }) + it('should use given tsconfig path', () => { const conf = cs.readTsConfig(undefined, '/foo/tsconfig.bar.json') expect(conf.input.path).toBe('/foo/tsconfig.bar.json') expect(findConfig).not.toBeCalled() expect(readConfig.mock.calls[0][0]).toBe('/foo/tsconfig.bar.json') + expect(parseConfig.mock.calls[0][0]).toEqual( + expect.objectContaining({ + include: [], + }), + ) expect(parseConfig.mock.calls[0][2]).toBe('/foo') expect(parseConfig.mock.calls[0][4]).toBe('/foo/tsconfig.bar.json') expect(conf.resolved.errors).toEqual([]) @@ -767,16 +799,27 @@ describe('readTsConfig', () => { expect(conf.input.path).toBe('/root/tsconfig.json') expect(findConfig.mock.calls[0][0]).toBe('/root') expect(readConfig.mock.calls[0][0]).toBe('/root/tsconfig.json') + expect(parseConfig.mock.calls[0][0]).toEqual( + expect.objectContaining({ + include: [], + }), + ) expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBe('/root/tsconfig.json') expect(conf.resolved.errors).toEqual([]) expect(conf.resolved.options.allowSyntheticDefaultImports).toEqual(true) }) + it('should use given tsconfig path', () => { const conf = cs.readTsConfig(undefined, '/foo/tsconfig.bar.json') expect(conf.input.path).toBe('/foo/tsconfig.bar.json') expect(findConfig).not.toBeCalled() expect(readConfig.mock.calls[0][0]).toBe('/foo/tsconfig.bar.json') + expect(parseConfig.mock.calls[0][0]).toEqual( + expect.objectContaining({ + include: [], + }), + ) expect(parseConfig.mock.calls[0][2]).toBe('/foo') expect(parseConfig.mock.calls[0][4]).toBe('/foo/tsconfig.bar.json') expect(conf.resolved.errors).toEqual([]) @@ -878,7 +921,6 @@ describe('tsCompiler', () => { it('should be a compiler object', () => { const cs = createConfigSet({ tsJestConfig: { tsConfig: false } as any, - jestConfig: { setupFiles: [], setupFilesAfterEnv: [] } as any, }) const compiler = cs.tsCompiler expect(compiler.cwd).toBe(cs.cwd) diff --git a/src/config/config-set.ts b/src/config/config-set.ts index f0c7e8eca8..35412af6bb 100644 --- a/src/config/config-set.ts +++ b/src/config/config-set.ts @@ -717,7 +717,7 @@ export class ConfigSet { resolvedConfigFile?: string | null, noProject?: boolean | null, ): ReadTsConfigResult { - let config = { compilerOptions: {} } + let config = { compilerOptions: {}, include: [] } let basePath = normalizeSlashes(this.rootDir) let configFileName: string | undefined const ts = this.compilerModule @@ -759,6 +759,11 @@ export class ConfigSet { ...config.compilerOptions, ...compilerOptions, } + /** + * Always set include to empty array so fileNames after parseJsonConfigFileContent only contains the least minimum initial + * files to utilize LanguageService incremental feature + */ + config.include = [] // parse json, merge config extending others, ... const result = ts.parseJsonConfigFileContent(config, ts.sys, basePath, undefined, configFileName) diff --git a/tsconfig.json b/tsconfig.json index 0053873f94..aac3940f77 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -31,13 +31,7 @@ "react" ] }, - "include": [ - "e2e/__helpers__", - "e2e/__serializer__", - "e2e/__tests__", - "scripts/", - "src" - ], + "include": [], "exclude": [ "e2e/__cases__", "e2e/__templates__", From 5a349e270eec5c3da17209c18ae7c3416ac4422c Mon Sep 17 00:00:00 2001 From: Ahn Date: Wed, 29 Apr 2020 11:14:21 +0200 Subject: [PATCH 05/12] chore: use Map for compiler memory cache (#1575) --- src/compiler/compiler-utils.ts | 4 ++-- src/compiler/instance.ts | 16 +++++++-------- src/compiler/language-service.ts | 34 +++++++++++++++++--------------- src/compiler/transpiler.ts | 2 +- src/types.ts | 4 +--- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/compiler/compiler-utils.ts b/src/compiler/compiler-utils.ts index dfc4ee81a0..3666a714b2 100644 --- a/src/compiler/compiler-utils.ts +++ b/src/compiler/compiler-utils.ts @@ -117,7 +117,7 @@ export function getAndCacheProjectReference( files: TSFiles, projectReferences: ReadonlyArray<_ts.ProjectReference> | undefined, ) { - const file = files[filePath] + const file = files.get(filePath) if (file?.projectReference) { return file.projectReference.project } @@ -156,7 +156,7 @@ function getAndCacheOutputJSFileName( projectReference: _ts.ResolvedProjectReference, files: TSFiles, ) { - const file = files[inputFileName] + const file = files.get(inputFileName) if (file?.projectReference?.outputFileName) { return file.projectReference.outputFileName } diff --git a/src/compiler/instance.ts b/src/compiler/instance.ts index 19fdfc01a2..901f05bdca 100644 --- a/src/compiler/instance.ts +++ b/src/compiler/instance.ts @@ -4,7 +4,7 @@ import mkdirp = require('mkdirp') import { basename, extname } from 'path' import { ConfigSet } from '../config/config-set' -import { CompileFn, CompilerInstance, MemoryCache, TsCompiler } from '../types' +import { CompileFn, CompilerInstance, MemoryCache, TSFile, TsCompiler } from '../types' import { getResolvedModulesCache } from './compiler-utils' import { initializeLanguageServiceInstance } from './language-service' @@ -55,10 +55,10 @@ const compileAndCacheResult = ( const [value, sourceMap] = compileFn(code, fileName, lineOffset) const output = updateOutput(value, fileName, sourceMap, getExtension) - memoryCache.files[fileName] = { - ...memoryCache.files[fileName], + memoryCache.files.set(fileName, { + ...memoryCache.files.get(fileName)!, output, - } + }) return output } @@ -78,7 +78,7 @@ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { const ts = configs.compilerModule // Require the TypeScript compiler and configuration. const extensions = ['.ts', '.tsx'] const memoryCache: MemoryCache = { - files: Object.create(null), + files: new Map(), resolvedModules: Object.create(null), } // Enable `allowJs` when flag is set. @@ -95,11 +95,11 @@ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { memoryCache.resolvedModules = JSON.parse(fsMemoryCache) } catch (e) {} } - /* istanbul ignore next (we leave this for e2e) */ + // Initialize memory cache for typescript compiler configs.typescript.fileNames.forEach(fileName => { - memoryCache.files[fileName] = { + memoryCache.files.set(fileName, { version: 0, - } + }) }) /** * Get the extension for a transpiled file. diff --git a/src/compiler/language-service.ts b/src/compiler/language-service.ts index 5fa511e6f2..9465d43447 100644 --- a/src/compiler/language-service.ts +++ b/src/compiler/language-service.ts @@ -44,6 +44,9 @@ export const initializeLanguageServiceInstance = ( call: null, [LogContexts.logLevel]: LogLevels.trace, } + function isFileInCache(fileName: string) { + return memoryCache.files.has(fileName) && memoryCache.files.get(fileName)!.version !== 0 + } let projectVersion = 1 // Set the file contents into cache. /* istanbul ignore next (cover by e2e) */ @@ -51,23 +54,23 @@ export const initializeLanguageServiceInstance = ( logger.debug({ fileName }, `updateMemoryCache(): update memory cache for language service`) let shouldIncrementProjectVersion = false - const isFileInCache = hasOwn.call(memoryCache.files, fileName) && memoryCache.files[fileName].version !== 0 - if (!isFileInCache) { - memoryCache.files[fileName] = { + const hit = isFileInCache(fileName) + if (!hit) { + memoryCache.files.set(fileName, { text: contents, version: 1, - } + }) shouldIncrementProjectVersion = true } else { - const previousContents = memoryCache.files[fileName].text + const previousContents = memoryCache.files.get(fileName)!.text // Avoid incrementing cache when nothing has changed. if (previousContents !== contents) { - memoryCache.files[fileName] = { + memoryCache.files.set(fileName, { text: contents, - version: memoryCache.files[fileName].version + 1, - } + version: memoryCache.files.get(fileName)!.version + 1, + }) // Only bump project version when file is modified in cache, not when discovered for the first time - if (isFileInCache) shouldIncrementProjectVersion = true + if (hit) shouldIncrementProjectVersion = true } /** * When a file is from node_modules or referenced to a referenced project and jest wants to transform it, we need @@ -83,10 +86,10 @@ export const initializeLanguageServiceInstance = ( const serviceHost: _ts.LanguageServiceHost = { getProjectVersion: () => String(projectVersion), getProjectReferences: () => projectReferences, - getScriptFileNames: () => Object.keys(memoryCache.files), + getScriptFileNames: () => [...memoryCache.files.keys()], getScriptVersion: (fileName: string) => { const normalizedFileName = normalize(fileName) - const version = memoryCache.files[normalizedFileName].version + const version = memoryCache.files.get(normalizedFileName)!.version // We need to return `undefined` and not a string here because TypeScript will use // `getScriptVersion` and compare against their own version - which can be `undefined`. @@ -97,19 +100,18 @@ export const initializeLanguageServiceInstance = ( }, getScriptSnapshot(fileName: string) { const normalizedFileName = normalize(fileName) - const hit = - hasOwn.call(memoryCache.files, normalizedFileName) && memoryCache.files[normalizedFileName].version !== 0 + const hit = memoryCache.files.has(normalizedFileName) && memoryCache.files.get(normalizedFileName)!.version !== 0 logger.trace({ normalizedFileName, cacheHit: hit }, `getScriptSnapshot():`, 'cache', hit ? 'hit' : 'miss') // Read contents from TypeScript memory cache. if (!hit) { - memoryCache.files[normalizedFileName] = { + memoryCache.files.set(normalizedFileName, { text: ts.sys.readFile(normalizedFileName), version: 1, - } + }) } - const contents = memoryCache.files[normalizedFileName]?.text + const contents = memoryCache.files.get(normalizedFileName)?.text if (contents === undefined) return diff --git a/src/compiler/transpiler.ts b/src/compiler/transpiler.ts index fce084ac87..c25b844234 100644 --- a/src/compiler/transpiler.ts +++ b/src/compiler/transpiler.ts @@ -27,7 +27,7 @@ export const initializeTranspilerInstance = ( : ts.createProgram([], options) /* istanbul ignore next (we leave this for e2e) */ const updateFileInCache = (contents: string, filePath: string) => { - const file = memoryCache.files[filePath] + const file = memoryCache.files.get(filePath) if (file && file.text !== contents) { file.version++ file.text = contents diff --git a/src/types.ts b/src/types.ts index e22c61c0a0..8118577fdc 100644 --- a/src/types.ts +++ b/src/types.ts @@ -239,9 +239,7 @@ export interface AstTransformerDesc { factory(cs: ConfigSet): _ts.TransformerFactory<_ts.SourceFile> } /** where key is filepath */ -export interface TSFiles { - [filePath: string]: TSFile -} +export type TSFiles = Map export interface TSFile { text?: string output?: string From 9335b77bfdee5268cc8b2a5063085e7269c4fc36 Mon Sep 17 00:00:00 2001 From: Ahn Date: Wed, 29 Apr 2020 13:50:10 +0200 Subject: [PATCH 06/12] chore(release): release v25.5.0-beta.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d5ef52b33b..cf9080f96d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-jest", - "version": "25.5.0-alpha.0", + "version": "25.5.0-beta.0", "main": "dist/index.js", "types": "dist/index.d.ts", "bin": "cli.js", From de59e3f1f26ff37869d33ec74f104b5ea31a5c1b Mon Sep 17 00:00:00 2001 From: Ahn Date: Thu, 30 Apr 2020 08:14:19 +0200 Subject: [PATCH 07/12] test: correct unit tests and e2e tests for language service (#1579) --- .../__snapshots__/diagnostics.test.ts.snap | 156 +----------------- e2e/__tests__/diagnostics.test.ts | 51 +----- src/__helpers__/fakers.ts | 3 +- .../{ => changed-modules}/main.spec.ts | 0 src/__mocks__/{ => changed-modules}/main.ts | 0 src/__mocks__/unchanged-modules/main.spec.ts | 3 + src/__mocks__/unchanged-modules/main.ts | 3 + .../language-service.spec.ts.snap | 2 + src/compiler/compiler-utils.ts | 4 - src/compiler/language-service.spec.ts | 64 ++++++- src/compiler/language-service.ts | 5 +- 11 files changed, 81 insertions(+), 210 deletions(-) rename src/__mocks__/{ => changed-modules}/main.spec.ts (100%) rename src/__mocks__/{ => changed-modules}/main.ts (100%) create mode 100644 src/__mocks__/unchanged-modules/main.spec.ts create mode 100644 src/__mocks__/unchanged-modules/main.ts diff --git a/e2e/__tests__/__snapshots__/diagnostics.test.ts.snap b/e2e/__tests__/__snapshots__/diagnostics.test.ts.snap index 312773b49e..cb930f3571 100644 --- a/e2e/__tests__/__snapshots__/diagnostics.test.ts.snap +++ b/e2e/__tests__/__snapshots__/diagnostics.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`With diagnostics throw first throw should fail using template "default" 1`] = ` +exports[`With diagnostics throw should fail using template "default" 1`] = ` × jest ↳ exit code: 1 ===[ STDOUT ]=================================================================== @@ -27,7 +27,7 @@ exports[`With diagnostics throw first throw should fail using template "default" ================================================================================ `; -exports[`With diagnostics throw first throw should fail using template "with-babel-7" 1`] = ` +exports[`With diagnostics throw should fail using template "with-babel-7" 1`] = ` × jest ↳ exit code: 1 ===[ STDOUT ]=================================================================== @@ -54,7 +54,7 @@ exports[`With diagnostics throw first throw should fail using template "with-bab ================================================================================ `; -exports[`With diagnostics throw first throw should fail using template "with-babel-7-string-config" 1`] = ` +exports[`With diagnostics throw should fail using template "with-babel-7-string-config" 1`] = ` × jest ↳ exit code: 1 ===[ STDOUT ]=================================================================== @@ -81,156 +81,6 @@ exports[`With diagnostics throw first throw should fail using template "with-bab ================================================================================ `; -exports[`With diagnostics throw then fail when code has changed to invalid base on cache of the previous run should fail using template "default" 1`] = ` - × jest - ↳ exit code: 1 - ===[ STDOUT ]=================================================================== - - ===[ STDERR ]=================================================================== - FAIL ./main.spec.ts - × foo is 42 - - ● foo is 42 - - expect(received).toBe(expected) // Object.is equality - - Expected: 42 - Received: 43 - - 4 | - 5 | test('foo is 42', () => { - > 6 | expect(foo).toBe(42); - | ^ - 7 | }); - 8 | - - at Object. (main.spec.ts:6:15) - - Test Suites: 1 failed, 1 total - Tests: 1 failed, 1 total - Snapshots: 0 total - Time: XXs - Ran all test suites. - ================================================================================ -`; - -exports[`With diagnostics throw then fail when code has changed to invalid base on cache of the previous run should fail using template "with-babel-7" 1`] = ` - × jest - ↳ exit code: 1 - ===[ STDOUT ]=================================================================== - - ===[ STDERR ]=================================================================== - FAIL ./main.spec.ts - × foo is 42 - - ● foo is 42 - - expect(received).toBe(expected) // Object.is equality - - Expected: 42 - Received: 43 - - 4 | - 5 | test('foo is 42', () => { - > 6 | expect(foo).toBe(42); - | ^ - 7 | }); - 8 | - - at Object. (main.spec.ts:6:15) - - Test Suites: 1 failed, 1 total - Tests: 1 failed, 1 total - Snapshots: 0 total - Time: XXs - Ran all test suites. - ================================================================================ -`; - -exports[`With diagnostics throw then fail when code has changed to invalid base on cache of the previous run should fail using template "with-babel-7-string-config" 1`] = ` - × jest - ↳ exit code: 1 - ===[ STDOUT ]=================================================================== - - ===[ STDERR ]=================================================================== - FAIL ./main.spec.ts - × foo is 42 - - ● foo is 42 - - expect(received).toBe(expected) // Object.is equality - - Expected: 42 - Received: 43 - - 4 | - 5 | test('foo is 42', () => { - > 6 | expect(foo).toBe(42); - | ^ - 7 | }); - 8 | - - at Object. (main.spec.ts:6:15) - - Test Suites: 1 failed, 1 total - Tests: 1 failed, 1 total - Snapshots: 0 total - Time: XXs - Ran all test suites. - ================================================================================ -`; - -exports[`With diagnostics throw then pass when type has changed to valid base on cache of the previous run should pass using template "default" 1`] = ` - √ jest - ↳ exit code: 0 - ===[ STDOUT ]=================================================================== - - ===[ STDERR ]=================================================================== - PASS ./main.spec.ts - √ foo is 42 - - Test Suites: 1 passed, 1 total - Tests: 1 passed, 1 total - Snapshots: 0 total - Time: XXs - Ran all test suites. - ================================================================================ -`; - -exports[`With diagnostics throw then pass when type has changed to valid base on cache of the previous run should pass using template "with-babel-7" 1`] = ` - √ jest - ↳ exit code: 0 - ===[ STDOUT ]=================================================================== - - ===[ STDERR ]=================================================================== - PASS ./main.spec.ts - √ foo is 42 - - Test Suites: 1 passed, 1 total - Tests: 1 passed, 1 total - Snapshots: 0 total - Time: XXs - Ran all test suites. - ================================================================================ -`; - -exports[`With diagnostics throw then pass when type has changed to valid base on cache of the previous run should pass using template "with-babel-7-string-config" 1`] = ` - √ jest - ↳ exit code: 0 - ===[ STDOUT ]=================================================================== - - ===[ STDERR ]=================================================================== - PASS ./main.spec.ts - √ foo is 42 - - Test Suites: 1 passed, 1 total - Tests: 1 passed, 1 total - Snapshots: 0 total - Time: XXs - Ran all test suites. - ================================================================================ -`; - exports[`With diagnostics warn only should pass using template "default" 1`] = ` √ jest --no-cache ↳ exit code: 0 diff --git a/e2e/__tests__/diagnostics.test.ts b/e2e/__tests__/diagnostics.test.ts index 25525ef7d2..451d472313 100644 --- a/e2e/__tests__/diagnostics.test.ts +++ b/e2e/__tests__/diagnostics.test.ts @@ -1,55 +1,14 @@ -import { writeFileSync } from 'fs' -import { join } from 'path' - import { allValidPackageSets } from '../__helpers__/templates' import { configureTestCase } from '../__helpers__/test-case' describe('With diagnostics throw', () => { const testCase = configureTestCase('diagnostics/throw') - describe('first throw', () => { - testCase.runWithTemplates(allValidPackageSets, 1, (runTest, { testLabel }) => { - it(testLabel, () => { - const result = runTest() - expect(result.status).toBe(1) - expect(result).toMatchSnapshot() - }) - }) - }) - - describe('then pass when type has changed to valid base on cache of the previous run', () => { - beforeAll(() => { - writeFileSync(join(__dirname, '../__cases__/diagnostics/throw/main.ts'), `export const foo = 42\nexport type Thing = { a: number }`) - }) - - afterAll(() => { - writeFileSync(join(__dirname, '../__cases__/diagnostics/throw/main.ts'), `export const foo = 42\nexport type Thing = { a: number, b: number }\n`) - }) - - testCase.runWithTemplates(allValidPackageSets, 0, (runTest, { testLabel }) => { - it(testLabel, () => { - const result = runTest() - expect(result.status).toBe(0) - expect(result).toMatchSnapshot() - }) - }) - }) - - describe('then fail when code has changed to invalid base on cache of the previous run', () => { - beforeAll(() => { - writeFileSync(join(__dirname, '../__cases__/diagnostics/throw/main.ts'), `export const foo = 43\nexport type Thing = { a: number }`) - }) - - afterAll(() => { - writeFileSync(join(__dirname, '../__cases__/diagnostics/throw/main.ts'), `export const foo = 42\nexport type Thing = { a: number, b: number }\n`) - }) - - testCase.runWithTemplates(allValidPackageSets, 1, (runTest, { testLabel }) => { - it(testLabel, () => { - const result = runTest() - expect(result.status).toBe(1) - expect(result).toMatchSnapshot() - }) + testCase.runWithTemplates(allValidPackageSets, 1, (runTest, { testLabel }) => { + it(testLabel, () => { + const result = runTest() + expect(result.status).toBe(1) + expect(result).toMatchSnapshot() }) }) }) diff --git a/src/__helpers__/fakers.ts b/src/__helpers__/fakers.ts index 210e129c24..022af486da 100644 --- a/src/__helpers__/fakers.ts +++ b/src/__helpers__/fakers.ts @@ -68,9 +68,10 @@ export function makeCompiler({ pretty: false, } const testRegex = ['^.+\\.[tj]sx?$'] + const testMatch = ['^.+\\.tsx?$'] jestConfig = { ...jestConfig, - testMatch: ['^.+\\.tsx?$'], + testMatch: jestConfig?.testMatch ? [...jestConfig.testMatch, ...testMatch] : testMatch, testRegex: jestConfig?.testRegex ? [...testRegex, ...jestConfig.testRegex] : testRegex, } const cs = new ConfigSet(getJestConfig(jestConfig, tsJestConfig), parentConfig) diff --git a/src/__mocks__/main.spec.ts b/src/__mocks__/changed-modules/main.spec.ts similarity index 100% rename from src/__mocks__/main.spec.ts rename to src/__mocks__/changed-modules/main.spec.ts diff --git a/src/__mocks__/main.ts b/src/__mocks__/changed-modules/main.ts similarity index 100% rename from src/__mocks__/main.ts rename to src/__mocks__/changed-modules/main.ts diff --git a/src/__mocks__/unchanged-modules/main.spec.ts b/src/__mocks__/unchanged-modules/main.spec.ts new file mode 100644 index 0000000000..40e5da46d6 --- /dev/null +++ b/src/__mocks__/unchanged-modules/main.spec.ts @@ -0,0 +1,3 @@ +import { Thing } from './main' + +export const thing: Thing = { a: 1 } diff --git a/src/__mocks__/unchanged-modules/main.ts b/src/__mocks__/unchanged-modules/main.ts new file mode 100644 index 0000000000..fea8e002b1 --- /dev/null +++ b/src/__mocks__/unchanged-modules/main.ts @@ -0,0 +1,3 @@ +export interface Thing { + a: number +} diff --git a/src/compiler/__snapshots__/language-service.spec.ts.snap b/src/compiler/__snapshots__/language-service.spec.ts.snap index 4c8fb3d4f2..7ba8371626 100644 --- a/src/compiler/__snapshots__/language-service.spec.ts.snap +++ b/src/compiler/__snapshots__/language-service.spec.ts.snap @@ -84,6 +84,8 @@ exports[`Language service should compile tsx file for other jsx options 1`] = ` ================================================================================ `; +exports[`Language service should do type check for the test file when imported module has changed 1`] = `"src/__mocks__/changed-modules/main.spec.ts(3,14): error TS2741: Property 'b' is missing in type '{ a: number; }' but required in type 'Thing'."`; + exports[`Language service should report diagnostics related to typings with pathRegex config matches file name 1`] = `"test-match-regex-diagnostics.ts(3,7): error TS2322: Type 'number' is not assignable to type 'string'."`; exports[`Language service should throw error when cannot compile 1`] = ` diff --git a/src/compiler/compiler-utils.ts b/src/compiler/compiler-utils.ts index 3666a714b2..154c6f911d 100644 --- a/src/compiler/compiler-utils.ts +++ b/src/compiler/compiler-utils.ts @@ -9,10 +9,6 @@ import { EXTENSION_REGEX, JSON_REGEX, TS_TSX_REGEX } from '../constants' import { MemoryCache, SourceOutput, TSFiles } from '../types' import { sha1 } from '../util/sha1' -/** - * @internal - */ -export const hasOwn = Object.prototype.hasOwnProperty /** * @internal */ diff --git a/src/compiler/language-service.spec.ts b/src/compiler/language-service.spec.ts index 5bd671d8d9..133439d377 100644 --- a/src/compiler/language-service.spec.ts +++ b/src/compiler/language-service.spec.ts @@ -1,3 +1,5 @@ +import { LogLevels } from 'bs-logger' +import { readFileSync } from 'fs' import { removeSync, writeFileSync } from 'fs-extra' import { makeCompiler } from '../__helpers__/fakers' @@ -74,7 +76,7 @@ describe('Language service', () => { jestConfig: { cache: true, cacheDirectory: tmp, testRegex: [/.*\.(spec|test)\.[jt]sx?$/] as any[] }, tsJestConfig: { tsConfig: false }, }) - const fileName = 'src/__mocks__/main.spec.ts' + const fileName = 'src/__mocks__/unchanged-modules/main.spec.ts' const source = `import { Thing } from './main' export const thing: Thing = { a: 1 }` @@ -96,7 +98,7 @@ export const thing: Thing = { a: 1 }` jestConfig: { cache: true, cacheDirectory: tmp, testRegex: [/.*\.(foo|bar)\.[jt]sx?$/] as any[] }, tsJestConfig: { tsConfig: false }, }) - const fileName = 'src/__mocks__/main.spec.ts' + const fileName = 'src/__mocks__/unchanged-modules/main.spec.ts' const source = `import { Thing } from './main' export const thing: Thing = { a: 1 }` @@ -197,6 +199,64 @@ export const thing: Thing = { a: 1 }` removeSync(fileName) }) + it('should not do type check for the test file which is already finished type checking before', () => { + const tmp = tempDir('compiler') + const testFileName = 'src/__mocks__/unchanged-modules/main.spec.ts' + const testFileSrc = readFileSync(testFileName, 'utf-8') + const importedModuleSrc = readFileSync('src/__mocks__/unchanged-modules/main.ts', 'utf-8') + + const compiler = makeCompiler({ + jestConfig: { cache: true, cacheDirectory: tmp, testMatch: ['src/__mocks__/unchanged-modules/*.spec.ts'] }, + tsJestConfig: { tsConfig: false }, + }) + + compiler.compile(testFileSrc, testFileName) + logTarget.clear() + compiler.compile(importedModuleSrc, require.resolve('../__mocks__/unchanged-modules/main.ts')) + + expect(logTarget.filteredLines(LogLevels.debug, Infinity)).toMatchInlineSnapshot(` + Array [ + "[level:20] compileAndCacheResult(): get compile output + ", + "[level:20] compileFn(): compiling using language service + ", + "[level:20] updateMemoryCache(): update memory cache for language service + ", + "[level:20] visitSourceFileNode(): hoisting + ", + "[level:20] compileFn(): computing diagnostics using language service + ", + ] + `) + }) + + it('should do type check for the test file when imported module has changed', () => { + const tmp = tempDir('compiler') + const testFileName = 'src/__mocks__/changed-modules/main.spec.ts' + const testFileSrc = readFileSync(testFileName, 'utf-8') + const importedModulePath = 'src/__mocks__/changed-modules/main.ts' + const importedModuleSrc = readFileSync(importedModulePath, 'utf-8') + const newImportedModuleSrc = 'export interface Thing { a: number, b: number }' + + const compiler1 = makeCompiler({ + jestConfig: { cache: true, cacheDirectory: tmp, testMatch: ['src/__mocks__/changed-modules/*.spec.ts'] }, + tsJestConfig: { tsConfig: false }, + }) + compiler1.compile(testFileSrc, testFileName) + + writeFileSync(importedModulePath, 'export interface Thing { a: number, b: number }') + const compiler2 = makeCompiler({ + jestConfig: { cache: true, cacheDirectory: tmp, testMatch: ['src/__mocks__/changed-modules/*.spec.ts'] }, + tsJestConfig: { tsConfig: false }, + }) + + expect(() => + compiler2.compile(newImportedModuleSrc, require.resolve('../__mocks__/changed-modules/main.ts')), + ).toThrowErrorMatchingSnapshot() + + writeFileSync(importedModulePath, importedModuleSrc) + }) + it('should report diagnostics related to typings with pathRegex config matches file name', () => { const fileName = 'test-match-regex-diagnostics.ts' const source = ` diff --git a/src/compiler/language-service.ts b/src/compiler/language-service.ts index 9465d43447..e610d60a3e 100644 --- a/src/compiler/language-service.ts +++ b/src/compiler/language-service.ts @@ -12,7 +12,6 @@ import { cacheResolvedModules, getAndCacheProjectReference, getCompileResultFromReferencedProject, - hasOwn, isTestFile, } from './compiler-utils' @@ -163,7 +162,6 @@ export const initializeLanguageServiceInstance = ( if (isTestFile(configs.testMatchPatterns, fileName)) { cacheResolvedModules(fileName, code, memoryCache, service.getProgram()!, cacheDir, logger) } else { - /* istanbul ignore next (covered by e2e) */ Object.entries(memoryCache.resolvedModules) .filter(entry => { /** @@ -172,8 +170,7 @@ export const initializeLanguageServiceInstance = ( * test file for 1st time run after clearing cache because */ return ( - entry[1].modulePaths.find(modulePath => modulePath === fileName) && - !hasOwn.call(memoryCache.files, entry[0]) + entry[1].modulePaths.find(modulePath => modulePath === fileName) && !memoryCache.files.has(entry[0]) ) }) .forEach(entry => { From 720c8546578bdbb3d6525581fbeffce82016dba5 Mon Sep 17 00:00:00 2001 From: Ahn Date: Fri, 1 May 2020 13:51:01 +0200 Subject: [PATCH 08/12] chore: remove unused variable `input` in `readTsConfig` of `ConfigSet` (#1584) --- src/compiler/instance.ts | 4 +- src/compiler/language-service.ts | 2 +- src/compiler/transpiler.ts | 2 +- src/config/config-set.spec.ts | 66 ++++++++++++++++++-------------- src/config/config-set.ts | 41 ++++++-------------- src/ts-jest-transformer.spec.ts | 14 +++---- src/ts-jest-transformer.ts | 2 +- 7 files changed, 61 insertions(+), 70 deletions(-) diff --git a/src/compiler/instance.ts b/src/compiler/instance.ts index 901f05bdca..920e18ecfc 100644 --- a/src/compiler/instance.ts +++ b/src/compiler/instance.ts @@ -71,7 +71,7 @@ const compileAndCacheResult = ( export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { const logger = configs.logger.child({ namespace: 'ts-compiler' }) const { - typescript: { options: compilerOptions }, + parsedTsConfig: { options: compilerOptions }, tsJest, } = configs const cacheDir = configs.tsCacheDir @@ -96,7 +96,7 @@ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { } catch (e) {} } // Initialize memory cache for typescript compiler - configs.typescript.fileNames.forEach(fileName => { + configs.parsedTsConfig.fileNames.forEach(fileName => { memoryCache.files.set(fileName, { version: 0, }) diff --git a/src/compiler/language-service.ts b/src/compiler/language-service.ts index e610d60a3e..69eea6fd3c 100644 --- a/src/compiler/language-service.ts +++ b/src/compiler/language-service.ts @@ -37,7 +37,7 @@ export const initializeLanguageServiceInstance = ( const ts = configs.compilerModule const cwd = configs.cwd const cacheDir = configs.tsCacheDir - const { options, projectReferences, fileNames } = configs.typescript + const { options, projectReferences, fileNames } = configs.parsedTsConfig const serviceHostTraceCtx = { namespace: 'ts:serviceHost', call: null, diff --git a/src/compiler/transpiler.ts b/src/compiler/transpiler.ts index c25b844234..acb88b1765 100644 --- a/src/compiler/transpiler.ts +++ b/src/compiler/transpiler.ts @@ -16,7 +16,7 @@ export const initializeTranspilerInstance = ( ): CompilerInstance => { logger.debug('initializeTranspilerInstance(): create typescript compiler') - const { options, projectReferences, fileNames } = configs.typescript + const { options, projectReferences, fileNames } = configs.parsedTsConfig const ts = configs.compilerModule const program = projectReferences ? ts.createProgram({ diff --git a/src/config/config-set.spec.ts b/src/config/config-set.spec.ts index 4d804f3680..527416ac23 100644 --- a/src/config/config-set.spec.ts +++ b/src/config/config-set.spec.ts @@ -471,7 +471,7 @@ describe('makeDiagnostic', () => { describe('typescript', () => { const get = (tsJest?: TsJestGlobalOptions, parentConfig?: TsJestGlobalOptions) => - createConfigSet({ tsJestConfig: tsJest, parentConfig }).typescript + createConfigSet({ tsJestConfig: tsJest, parentConfig }).parsedTsConfig it('should read file list from default tsconfig', () => { // since the default is to lookup for tsconfig, but we set include to [] so we should not have this file in the list @@ -502,7 +502,7 @@ describe('typescript', () => { tsJestConfig: { tsConfig: 'tsconfig.build.json' }, resolve: null, }) - expect(cs.typescript.options).toMatchObject({ + expect(cs.parsedTsConfig.options).toMatchObject({ module: ts.ModuleKind.CommonJS, rootDir: normalizeSlashes(resolve(__dirname, '..')), skipLibCheck: true, @@ -519,7 +519,7 @@ describe('typescript', () => { }, resolve: null, }) - expect(cs.typescript.options).toMatchObject({ + expect(cs.parsedTsConfig.options).toMatchObject({ module: ts.ModuleKind.CommonJS, allowSyntheticDefaultImports: true, esModuleInterop: false, @@ -541,11 +541,11 @@ describe('typescript', () => { }, resolve: null, }) - expect(cs.typescript.options).toMatchObject({ + expect(cs.parsedTsConfig.options).toMatchObject({ module: ts.ModuleKind.AMD, esModuleInterop: false, }) - expect(cs.typescript.options.allowSyntheticDefaultImports).toBeFalsy() + expect(cs.parsedTsConfig.options.allowSyntheticDefaultImports).toBeFalsy() expect(target.lines.warn).toHaveLength(0) }) }) // typescript @@ -582,11 +582,13 @@ describe('readTsConfig', () => { let readConfig!: jest.SpyInstance<{ config?: any; error?: ts.Diagnostic }> let parseConfig!: jest.SpyInstance let cs!: ConfigSet + beforeAll(() => { findConfig = jest.spyOn(ts, 'findConfigFile') readConfig = jest.spyOn(ts, 'readConfigFile') parseConfig = jest.spyOn(ts, 'parseJsonConfigFileContent') }) + afterAll(() => { findConfig.mockRestore() readConfig.mockRestore() @@ -603,6 +605,7 @@ describe('readTsConfig', () => { } as any, }) }) + afterEach(() => { findConfig.mockClear() readConfig.mockClear() @@ -611,7 +614,7 @@ describe('readTsConfig', () => { it('should use correct paths when searching', () => { const conf = cs.readTsConfig() - expect(conf.input).toBeUndefined() + expect(conf.options.configFilePath).toBeUndefined() expect(readConfig).not.toHaveBeenCalled() expect(parseConfig.mock.calls[0][0]).toEqual( expect.objectContaining({ @@ -621,9 +624,10 @@ describe('readTsConfig', () => { expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBeUndefined() }) + it('should use given tsconfig path', () => { const conf = cs.readTsConfig(undefined, '/foo/tsconfig.bar.json') - expect(conf.input).toBeUndefined() + expect(conf.options.configFilePath).toBeUndefined() expect(findConfig).not.toBeCalled() expect(readConfig.mock.calls[0][0]).toBe('/foo/tsconfig.bar.json') expect(parseConfig).not.toHaveBeenCalled() @@ -636,10 +640,12 @@ describe('readTsConfig', () => { findConfig.mockImplementation(p => `${p}/tsconfig.json`) readConfig.mockImplementation(p => ({ config: { path: p, compilerOptions: {} } })) }) + afterEach(() => { findConfig.mockClear() readConfig.mockClear() }) + describe('module in tsConfig is not the same as forced module and esModuleInterop is not in tsConfig', () => { beforeEach(() => { parseConfig.mockImplementation((conf: any) => ({ @@ -651,13 +657,14 @@ describe('readTsConfig', () => { errors: [], })) }) + afterEach(() => { parseConfig.mockClear() }) it('should use correct paths when searching', () => { const conf = cs.readTsConfig() - expect(conf.input.path).toBe('/root/tsconfig.json') + expect(conf.options.path).toBe('/root/tsconfig.json') expect(findConfig.mock.calls[0][0]).toBe('/root') expect(readConfig.mock.calls[0][0]).toBe('/root/tsconfig.json') expect(parseConfig.mock.calls[0][0]).toEqual( @@ -667,13 +674,13 @@ describe('readTsConfig', () => { ) expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBe('/root/tsconfig.json') - expect(conf.resolved.options.allowSyntheticDefaultImports).toEqual(true) - expect(conf.resolved.errors).toMatchSnapshot() + expect(conf.options.allowSyntheticDefaultImports).toEqual(true) + expect(conf.errors).toMatchSnapshot() }) it('should use given tsconfig path', () => { const conf = cs.readTsConfig(undefined, '/foo/tsconfig.bar.json') - expect(conf.input.path).toBe('/foo/tsconfig.bar.json') + expect(conf.options.path).toBe('/foo/tsconfig.bar.json') expect(findConfig).not.toBeCalled() expect(readConfig.mock.calls[0][0]).toBe('/foo/tsconfig.bar.json') expect(parseConfig.mock.calls[0][0]).toEqual( @@ -683,7 +690,7 @@ describe('readTsConfig', () => { ) expect(parseConfig.mock.calls[0][2]).toBe('/foo') expect(parseConfig.mock.calls[0][4]).toBe('/foo/tsconfig.bar.json') - expect(conf.resolved.errors).toMatchSnapshot() + expect(conf.errors).toMatchSnapshot() }) }) @@ -699,13 +706,14 @@ describe('readTsConfig', () => { errors: [], })) }) + afterEach(() => { parseConfig.mockClear() }) it('should use correct paths when searching', () => { const conf = cs.readTsConfig() - expect(conf.input.path).toBe('/root/tsconfig.json') + expect(conf.options.path).toBe('/root/tsconfig.json') expect(findConfig.mock.calls[0][0]).toBe('/root') expect(readConfig.mock.calls[0][0]).toBe('/root/tsconfig.json') expect(parseConfig.mock.calls[0][0]).toEqual( @@ -715,18 +723,18 @@ describe('readTsConfig', () => { ) expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBe('/root/tsconfig.json') - expect(conf.resolved.options.allowSyntheticDefaultImports).toEqual(true) - expect(conf.resolved.errors).toMatchSnapshot() + expect(conf.options.allowSyntheticDefaultImports).toEqual(true) + expect(conf.errors).toMatchSnapshot() }) it('should use given tsconfig path', () => { const conf = cs.readTsConfig(undefined, '/foo/tsconfig.bar.json') - expect(conf.input.path).toBe('/foo/tsconfig.bar.json') + expect(conf.options.path).toBe('/foo/tsconfig.bar.json') expect(findConfig).not.toBeCalled() expect(readConfig.mock.calls[0][0]).toBe('/foo/tsconfig.bar.json') expect(parseConfig.mock.calls[0][2]).toBe('/foo') expect(parseConfig.mock.calls[0][4]).toBe('/foo/tsconfig.bar.json') - expect(conf.resolved.errors).toMatchSnapshot() + expect(conf.errors).toMatchSnapshot() }) }) @@ -742,13 +750,14 @@ describe('readTsConfig', () => { errors: [], })) }) + afterEach(() => { parseConfig.mockClear() }) it('should use correct paths when searching', () => { const conf = cs.readTsConfig() - expect(conf.input.path).toBe('/root/tsconfig.json') + expect(conf.options.path).toBe('/root/tsconfig.json') expect(findConfig.mock.calls[0][0]).toBe('/root') expect(readConfig.mock.calls[0][0]).toBe('/root/tsconfig.json') expect(parseConfig.mock.calls[0][0]).toEqual( @@ -758,13 +767,13 @@ describe('readTsConfig', () => { ) expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBe('/root/tsconfig.json') - expect(conf.resolved.options.allowSyntheticDefaultImports).toBeUndefined() - expect(conf.resolved.errors).toEqual([]) + expect(conf.options.allowSyntheticDefaultImports).toBeUndefined() + expect(conf.errors).toEqual([]) }) it('should use given tsconfig path', () => { const conf = cs.readTsConfig(undefined, '/foo/tsconfig.bar.json') - expect(conf.input.path).toBe('/foo/tsconfig.bar.json') + expect(conf.options.path).toBe('/foo/tsconfig.bar.json') expect(findConfig).not.toBeCalled() expect(readConfig.mock.calls[0][0]).toBe('/foo/tsconfig.bar.json') expect(parseConfig.mock.calls[0][0]).toEqual( @@ -774,7 +783,7 @@ describe('readTsConfig', () => { ) expect(parseConfig.mock.calls[0][2]).toBe('/foo') expect(parseConfig.mock.calls[0][4]).toBe('/foo/tsconfig.bar.json') - expect(conf.resolved.errors).toEqual([]) + expect(conf.errors).toEqual([]) }) }) @@ -790,13 +799,14 @@ describe('readTsConfig', () => { errors: [], })) }) + afterEach(() => { parseConfig.mockClear() }) it('should use correct paths when searching', () => { const conf = cs.readTsConfig() - expect(conf.input.path).toBe('/root/tsconfig.json') + expect(conf.options.path).toBe('/root/tsconfig.json') expect(findConfig.mock.calls[0][0]).toBe('/root') expect(readConfig.mock.calls[0][0]).toBe('/root/tsconfig.json') expect(parseConfig.mock.calls[0][0]).toEqual( @@ -806,13 +816,13 @@ describe('readTsConfig', () => { ) expect(parseConfig.mock.calls[0][2]).toBe('/root') expect(parseConfig.mock.calls[0][4]).toBe('/root/tsconfig.json') - expect(conf.resolved.errors).toEqual([]) - expect(conf.resolved.options.allowSyntheticDefaultImports).toEqual(true) + expect(conf.errors).toEqual([]) + expect(conf.options.allowSyntheticDefaultImports).toEqual(true) }) it('should use given tsconfig path', () => { const conf = cs.readTsConfig(undefined, '/foo/tsconfig.bar.json') - expect(conf.input.path).toBe('/foo/tsconfig.bar.json') + expect(conf.options.path).toBe('/foo/tsconfig.bar.json') expect(findConfig).not.toBeCalled() expect(readConfig.mock.calls[0][0]).toBe('/foo/tsconfig.bar.json') expect(parseConfig.mock.calls[0][0]).toEqual( @@ -822,8 +832,8 @@ describe('readTsConfig', () => { ) expect(parseConfig.mock.calls[0][2]).toBe('/foo') expect(parseConfig.mock.calls[0][4]).toBe('/foo/tsconfig.bar.json') - expect(conf.resolved.errors).toEqual([]) - expect(conf.resolved.options.allowSyntheticDefaultImports).toEqual(true) + expect(conf.errors).toEqual([]) + expect(conf.options.allowSyntheticDefaultImports).toEqual(true) }) }) }) diff --git a/src/config/config-set.ts b/src/config/config-set.ts index 35412af6bb..7fafe414c3 100644 --- a/src/config/config-set.ts +++ b/src/config/config-set.ts @@ -51,13 +51,6 @@ import { TSError } from '../util/ts-error' const logger = rootLogger.child({ namespace: 'config' }) -interface ReadTsConfigResult { - // what we get from reading the config file if any, or inline options - input?: any - // parsed config with all resolved options - resolved: ParsedCommandLine -} - /** * @internal */ @@ -318,8 +311,8 @@ export class ConfigSet { /** * @internal */ - get typescript(): ParsedCommandLine { - return this._typescript.resolved + get parsedTsConfig(): ParsedCommandLine { + return this._parsedTsConfig } /** @@ -346,7 +339,7 @@ export class ConfigSet { * @internal */ @Memoize() - private get _typescript(): ReadTsConfigResult { + private get _parsedTsConfig(): ParsedCommandLine { const { tsJest: { tsConfig }, } = this @@ -357,9 +350,10 @@ export class ConfigSet { tsConfig == null, ) // throw errors if any matching wanted diagnostics - this.raiseDiagnostics(result.resolved.errors, configFilePath) + this.raiseDiagnostics(result.errors, configFilePath) this.logger.debug({ tsconfig: result }, 'normalized typescript config') + return result } @@ -577,7 +571,7 @@ export class ConfigSet { digest: this.tsJestDigest, dependencies: this.projectDependencies, compiler: this.tsJest.compiler, - compilerOptions: this.typescript.options, + compilerOptions: this.parsedTsConfig.options, isolatedModules: this.tsJest.isolatedModules, diagnostics: this.tsJest.diagnostics, }), @@ -667,7 +661,7 @@ export class ConfigSet { jest, tsJest: this.tsJest, babel: this.babel, - tsconfig: this.typescript.options, + tsconfig: this.parsedTsConfig.options, }) } @@ -716,16 +710,13 @@ export class ConfigSet { compilerOptions?: object, resolvedConfigFile?: string | null, noProject?: boolean | null, - ): ReadTsConfigResult { + ): ParsedCommandLine { let config = { compilerOptions: {}, include: [] } let basePath = normalizeSlashes(this.rootDir) let configFileName: string | undefined const ts = this.compilerModule - let input: any - if (noProject) { - input = { compilerOptions: { ...compilerOptions } } - } else { + if (!noProject) { // Read project configuration when available. configFileName = resolvedConfigFile ? normalizeSlashes(resolvedConfigFile) @@ -737,23 +728,13 @@ export class ConfigSet { // Return diagnostics. if (result.error) { - return { - resolved: { errors: [result.error], fileNames: [], options: {} }, - } + return { errors: [result.error], fileNames: [], options: {} } } config = result.config - input = { - ...result.config, - compilerOptions: { - ...(result.config && result.config.compilerOptions), - ...compilerOptions, - }, - } basePath = normalizeSlashes(dirname(configFileName)) } } - // Override default configuration options `ts-jest` requires. config.compilerOptions = { ...config.compilerOptions, @@ -813,7 +794,7 @@ export class ConfigSet { } } - return { input, resolved: result } + return result } /** diff --git a/src/ts-jest-transformer.spec.ts b/src/ts-jest-transformer.spec.ts index a02f43ce86..114afc158c 100644 --- a/src/ts-jest-transformer.spec.ts +++ b/src/ts-jest-transformer.spec.ts @@ -28,11 +28,11 @@ describe('configFor', () => { describe('process', () => { let tr: TsJestTransformer let babel: any - let typescript: ParsedCommandLine + let parsedTsConfig: ParsedCommandLine let args: [string, string, any, any] const config = { - get typescript() { - return typescript + get parsedTsConfig() { + return parsedTsConfig }, shouldStringifyContent: jest.fn(), get babelJestTransformer() { @@ -56,7 +56,7 @@ describe('process', () => { config.shouldStringifyContent.mockImplementation(() => false).mockClear() babel = null config.tsCompiler.compile.mockImplementation(s => `ts:${s}`).mockClear() - typescript = { options: {} } as any + parsedTsConfig = { options: {} } as any }) it('should process ts input without babel', () => { @@ -79,7 +79,7 @@ Array [ }) it('should process js input without babel', () => { - typescript.options.allowJs = true + parsedTsConfig.options.allowJs = true args[1] = '/foo/bar.js' expect(process()).toBe(`ts:${INPUT}`) expect(config.shouldStringifyContent.mock.calls).toMatchInlineSnapshot(` @@ -132,7 +132,7 @@ Array [ }) it('should process js input with babel', () => { - typescript.options.allowJs = true + parsedTsConfig.options.allowJs = true babel = { process: jest.fn(s => `babel:${s}`) } args[1] = '/foo/bar.js' expect(process()).toBe(`babel:ts:${INPUT}`) @@ -172,7 +172,7 @@ Array [ it('should warn when trying to process js but allowJs is false', () => { args[1] = '/foo/bar.js' - typescript.options.allowJs = false + parsedTsConfig.options.allowJs = false const logs = logTargetMock() logs.clear() expect(process()).toBe(INPUT) diff --git a/src/ts-jest-transformer.ts b/src/ts-jest-transformer.ts index a3b5040f30..9c1f49623e 100644 --- a/src/ts-jest-transformer.ts +++ b/src/ts-jest-transformer.ts @@ -112,7 +112,7 @@ export class TsJestTransformer implements Transformer { } else if (isDefinitionFile) { // do not try to compile declaration files result = '' - } else if (!configs.typescript.options.allowJs && isJsFile) { + } else if (!configs.parsedTsConfig.options.allowJs && isJsFile) { // we've got a '.js' but the compiler option `allowJs` is not set or set to false this.logger.warn({ fileName: filePath }, interpolate(Errors.GotJsFileButAllowJsFalse, { path: filePath })) From 526265da0737b3a7e7cfcb6abd69197ea34c49fa Mon Sep 17 00:00:00 2001 From: Tanet Trimas <42898343+tanettrimas@users.noreply.github.com> Date: Sun, 3 May 2020 18:43:03 +0200 Subject: [PATCH 09/12] chore: migrate tslint to eslint (#1590) --- .eslintignore | 2 + .eslintrc.js | 232 ++++++++++++++- .npmignore | 1 - .../packages/my-app/main.test.ts | 1 - .../packages/my-app/main.ts | 1 - .../test-case/processed-file-io.ts | 1 - e2e/__helpers__/test-case/run-descriptor.ts | 11 +- e2e/__helpers__/test-case/run-result.ts | 5 +- e2e/__helpers__/test-case/runtime.ts | 9 +- e2e/__helpers__/test-case/types.ts | 2 +- e2e/__helpers__/test-case/utils.ts | 13 +- e2e/__serializers__/run-result.ts | 24 +- e2e/__tests__/logger.test.ts | 2 +- e2e/__tests__/module-kinds/helpers.ts | 5 +- package-lock.json | 276 +++++++++++++----- package.json | 19 +- preprocessor.js | 1 + presets/index.js | 21 +- scripts/clean.js | 11 +- scripts/e2e.js | 36 +-- scripts/lib/npm.js | 10 +- scripts/test-external-project.js | 33 +-- scripts/update-e2e-templates.js | 9 +- src/__helpers__/mocks.ts | 20 +- src/__helpers__/path.ts | 2 +- src/__helpers__/processed-source.ts | 3 +- src/__helpers__/source-maps.ts | 1 + src/cli/config/init.ts | 14 +- src/cli/config/migrate.ts | 7 +- src/cli/helpers/presets.ts | 1 + src/cli/index.ts | 3 +- src/compiler/compiler-utils.ts | 25 +- src/compiler/instance.ts | 21 +- src/compiler/language-service.spec.ts | 8 +- src/compiler/language-service.ts | 27 +- src/compiler/transpiler.spec.ts | 4 +- src/config/config-set.spec.ts | 42 ++- src/config/config-set.ts | 41 +-- src/index.spec.ts | 1 - src/index.ts | 3 - src/transformers/hoist-jest.spec.ts | 4 +- src/transformers/hoist-jest.ts | 11 +- src/ts-jest-transformer.spec.ts | 2 +- src/ts-jest-transformer.ts | 2 +- src/types.ts | 12 + src/util/backports.spec.ts | 4 +- src/util/backports.ts | 4 +- src/util/importer.spec.ts | 1 - src/util/importer.ts | 7 +- src/util/json.ts | 3 +- src/util/memoize.ts | 2 +- src/util/messages.ts | 3 +- src/util/ts-error.ts | 1 + src/util/version-checkers.spec.ts | 11 +- src/util/version-checkers.ts | 1 - tsconfig.json | 17 +- tslint.json | 78 ----- 57 files changed, 654 insertions(+), 457 deletions(-) delete mode 100644 tslint.json diff --git a/.eslintignore b/.eslintignore index 6ab0c65328..49260b81bf 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,5 +2,7 @@ dist/ node_modules/ e2e/__cases__/ e2e/__workdir_synlink__/ +e2e/__external-repos__/ coverage/ docs/ +*.config.js diff --git a/.eslintrc.js b/.eslintrc.js index e00b96a15a..fc1f6b69de 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,9 +1,20 @@ module.exports = { env: { node: true, + es6: true, + 'jest/globals': true, }, - extends: 'eslint:recommended', + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'prettier/@typescript-eslint', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier + 'plugin:jest/recommended', + 'plugin:prettier/recommended' + ], + parser: '@typescript-eslint/parser', parserOptions: { + project: 'tsconfig.json', ecmaVersion: 2020, sourceType: 'module', impliedStrict: true, @@ -11,21 +22,218 @@ module.exports = { jsx: true, }, }, + plugins: ['@typescript-eslint', 'jest', 'jsdoc'], rules: { - 'no-console': ['error', { allow: ['warn', 'error', 'log'] }], - indent: ['error', 2], - 'linebreak-style': ['error', 'unix'], - quotes: ['error', 'single'], - semi: ['error', 'never'], - 'comma-dangle': [ + 'prettier/prettier': 'error', + 'no-unused-vars': 'off', // let typescript-eslint handle this + 'no-console': 'error', + 'linebreak-style': 'off', + 'comma-dangle': 'off', + 'constructor-super': 'error', + 'for-direction': ['error'], + 'getter-return': 'warn', + 'no-async-promise-executor': ['error'], + 'no-case-declarations': ['error'], + 'no-class-assign': ['error'], + 'no-compare-neg-zero': ['error'], + 'no-cond-assign': 'error', + 'no-const-assign': ['error'], + 'no-constant-condition': ['warn'], + 'no-control-regex': ['warn'], + 'no-debugger': 'error', + 'no-delete-var': ['error'], + 'no-dupe-args': ['error'], + 'no-dupe-class-members': 'warn', + 'no-dupe-keys': ['error'], + 'no-duplicate-case': ['error'], + 'no-empty': [ 'error', { - arrays: 'always-multiline', - objects: 'always-multiline', - imports: 'always-multiline', - exports: 'always-multiline', - functions: 'never', + allowEmptyCatch: true, + }, + ], + 'no-empty-character-class': ['error'], + 'no-empty-pattern': ['error'], + 'no-ex-assign': ['error'], + 'no-extra-boolean-cast': ['error'], + 'no-extra-semi': 'off', + 'no-fallthrough': 'off', + 'no-func-assign': ['error'], + 'no-global-assign': ['error'], + 'no-inner-declarations': ['error'], + 'no-invalid-regexp': ['error'], + 'no-irregular-whitespace': 'off', + 'no-misleading-character-class': ['error'], + 'no-mixed-spaces-and-tabs': ['error'], + 'no-new-symbol': ['error'], + 'no-obj-calls': ['error'], + 'no-octal': ['error'], + 'no-prototype-builtins': ['error'], + 'no-redeclare': 'warn', + 'no-regex-spaces': ['error'], + 'no-self-assign': ['error'], + 'no-shadow-restricted-names': ['error'], + 'no-sparse-arrays': ['error'], + 'no-this-before-super': ['error'], + 'no-undef': ['error'], + 'no-unexpected-multiline': ['error'], + 'no-unreachable': ['error'], + 'no-unsafe-finally': 'error', + 'no-unsafe-negation': ['error'], + 'no-unused-labels': 'error', + 'no-useless-catch': ['error'], + 'no-useless-escape': 'warn', + 'no-with': ['error'], + 'require-yield': ['error'], + 'use-isnan': 'error', + 'valid-typeof': 'off', + '@typescript-eslint/no-unused-vars': ["error", { "argsIgnorePattern": "^_" }], + '@typescript-eslint/adjacent-overload-signatures': 'error', + '@typescript-eslint/array-type': [ + 'warn', + { + default: 'array', + }, + ], + '@typescript-eslint/ban-types': [ + 'error', + { + types: { + Object: { + message: 'Avoid using the `Object` type. Did you mean `object`?', + }, + Function: { + message: 'Avoid using the `Function` type. Prefer a specific function type, like `() => void`.', + }, + Boolean: { + message: 'Avoid using the `Boolean` type. Did you mean `boolean`?', + }, + Number: { + message: 'Avoid using the `Number` type. Did you mean `number`?', + }, + String: { + message: 'Avoid using the `String` type. Did you mean `string`?', + }, + Symbol: { + message: 'Avoid using the `Symbol` type. Did you mean `symbol`?', + }, + }, + }, + ], + '@typescript-eslint/class-name-casing': 'error', + '@typescript-eslint/prefer-regexp-exec': 'warn', + '@typescript-eslint/prefer-string-starts-ends-with': 'warn', + '@typescript-eslint/unbound-method': 'off', + '@typescript-eslint/prefer-includes': 'warn', + '@typescript-eslint/consistent-type-assertions': 'error', + '@typescript-eslint/consistent-type-definitions': 'error', + '@typescript-eslint/explicit-member-accessibility': [ + 'error', + { + accessibility: 'no-public', + }, + ], + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/member-delimiter-style': [ + 'error', + { + multiline: { + delimiter: 'none', + requireLast: true, + }, + singleline: { + delimiter: 'semi', + requireLast: false, + }, + }, + ], + '@typescript-eslint/require-await': 'off', + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/no-empty-function': ['error', { 'allow': ['arrowFunctions']}], + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-for-in-array': 'error', + '@typescript-eslint/no-inferrable-types': 'error', + '@typescript-eslint/no-misused-new': 'error', + '@typescript-eslint/no-namespace': 'warn', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-parameter-properties': 'off', + '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/prefer-for-of': 'off', + '@typescript-eslint/prefer-function-type': 'error', + '@typescript-eslint/prefer-namespace-keyword': 'error', + '@typescript-eslint/prefer-readonly': 'error', + '@typescript-eslint/triple-slash-reference': [ + 'error', + { + path: 'always', + types: 'prefer-import', + lib: 'always', + }, + ], + '@typescript-eslint/type-annotation-spacing': 'off', + '@typescript-eslint/unified-signatures': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'warn', + 'arrow-body-style': 'warn', + 'arrow-parens': ['off', 'always'], + 'brace-style': ['off', 'off'], + camelcase: 'warn', + 'class-methods-use-this': 'warn', + complexity: 'off', + curly: ['warn', 'multi-line'], + 'default-case': 'error', + 'dot-notation': 'error', + 'eol-last': 'off', + eqeqeq: ['error', 'smart'], + 'guard-for-in': 'error', + 'id-match': 'error', + 'jsdoc/check-alignment': 'error', + 'jsdoc/check-indentation': 'error', + 'jsdoc/newline-after-description': 'warn', + 'max-classes-per-file': 'off', + 'max-len': 'off', + 'new-parens': 'off', + 'newline-per-chained-call': 'off', + 'no-bitwise': 'off', + 'no-caller': 'error', + 'no-duplicate-imports': 'error', + 'no-eval': 'error', + 'no-invalid-this': 'off', + 'no-multiple-empty-lines': 'off', + 'no-new-wrappers': 'error', + 'no-return-await': 'error', + 'no-shadow': [ + 'off', + { + hoist: 'all', + }, + ], + 'no-template-curly-in-string': 'error', + 'no-throw-literal': 'error', + 'no-trailing-spaces': 'off', + 'no-undef-init': 'error', + 'no-underscore-dangle': 'off', + 'no-unused-expressions': 'error', + 'no-var': 'error', + 'object-shorthand': 'error', + 'one-var': ['error', 'never'], + 'prefer-const': 'warn', + 'prefer-object-spread': 'error', + 'prefer-template': 'error', + 'quote-props': 'off', + radix: 'error', + 'space-before-function-paren': 'off', + 'space-in-parens': ['off', 'never'], + 'spaced-comment': [ + 'warn', + 'always', + { + markers: ['/'], }, ], }, + settings: {}, } diff --git a/.npmignore b/.npmignore index cf77ec0223..59d84cea3e 100644 --- a/.npmignore +++ b/.npmignore @@ -66,7 +66,6 @@ tsconfig.json .prettierrc .travis.yml tsconfig.build.json -tslint.json .npmrc .markdownlint.yaml .cache diff --git a/e2e/__external-repos__/yarn-workspace-composite/packages/my-app/main.test.ts b/e2e/__external-repos__/yarn-workspace-composite/packages/my-app/main.test.ts index 4b02a6dc02..c599b0d01d 100644 --- a/e2e/__external-repos__/yarn-workspace-composite/packages/my-app/main.test.ts +++ b/e2e/__external-repos__/yarn-workspace-composite/packages/my-app/main.test.ts @@ -1,7 +1,6 @@ import { main } from './main' test('main', () => { - // tslint:disable-next-line:no-console const mockLog = console.log = jest.fn() main() diff --git a/e2e/__external-repos__/yarn-workspace-composite/packages/my-app/main.ts b/e2e/__external-repos__/yarn-workspace-composite/packages/my-app/main.ts index 48651ad71e..302330c9a8 100644 --- a/e2e/__external-repos__/yarn-workspace-composite/packages/my-app/main.ts +++ b/e2e/__external-repos__/yarn-workspace-composite/packages/my-app/main.ts @@ -3,7 +3,6 @@ import { myLibraryFunction } from '../my-library' export function main() { const value = myLibraryFunction() - // tslint:disable-next-line:no-console console.log(`You got foo: "${value.foo}" and bar: ${value.bar}`) } diff --git a/e2e/__helpers__/test-case/processed-file-io.ts b/e2e/__helpers__/test-case/processed-file-io.ts index 28415ea94f..8c053139de 100644 --- a/e2e/__helpers__/test-case/processed-file-io.ts +++ b/e2e/__helpers__/test-case/processed-file-io.ts @@ -3,7 +3,6 @@ import { Config } from '@jest/types' import ProcessedSource from '../../../src/__helpers__/processed-source' -// tslint:disable-next-line:no-default-export export default class ProcessedFileIo extends ProcessedSource { constructor( cwd: string, diff --git a/e2e/__helpers__/test-case/run-descriptor.ts b/e2e/__helpers__/test-case/run-descriptor.ts index 8cf49bc677..3b37b2c694 100644 --- a/e2e/__helpers__/test-case/run-descriptor.ts +++ b/e2e/__helpers__/test-case/run-descriptor.ts @@ -6,7 +6,6 @@ import RunResult from './run-result' import { run } from './runtime' import { RunTestOptions, RunWithTemplateIteratorContext, RunWithTemplatesIterator, TestRunResultsMap } from './types' -// tslint:disable-next-line:no-default-export export default class RunDescriptor { protected _options: RunTestOptions protected _sourcePackageJson: any @@ -46,8 +45,8 @@ export default class RunDescriptor { template: this.templateName, }) if (logUnlessStatus != null && logUnlessStatus !== result.status) { - // tslint:disable-next-line:no-console - console.log( + // eslint-disable-next-line no-console + console.log( '='.repeat(70), '\n', `Test exited with unexpected status in "${this.name}" using template "${this.templateName}" (exit code: ${result.status}):\n`, @@ -72,7 +71,7 @@ export default class RunDescriptor { throw new RangeError(`There must be at least one template to run the test case with.`) } - if (!templates.every((t, i) => templates.indexOf(t, i + 1) === -1)) { + if (!templates.every((t, i) => !templates.includes(t, i + 1))) { throw new Error(`Each template must be unique. Given ${templates.join(', ')}`) } return templates.reduce((map, template) => { @@ -80,9 +79,7 @@ export default class RunDescriptor { ...this._options, template, }) - const runTest = () => { - return (map[template] = desc.run(expectedStatus)) - } + const runTest = () => (map[template] = desc.run(expectedStatus)) if (iterator) { iterator(runTest, createIteratorContext(template, expectedStatus)) } else { diff --git a/e2e/__helpers__/test-case/run-result.ts b/e2e/__helpers__/test-case/run-result.ts index b434fc1cca..51467ed838 100644 --- a/e2e/__helpers__/test-case/run-result.ts +++ b/e2e/__helpers__/test-case/run-result.ts @@ -10,7 +10,6 @@ import { cacheDir } from '../../../scripts/lib/paths' import ProcessedFileIo from './processed-file-io' import { escapeRegex, normalizeJestOutput, stripAnsiColors } from './utils' -// tslint:disable-next-line:no-default-export export default class RunResult { constructor( readonly cwd: string, @@ -112,8 +111,6 @@ export default class RunResult { return map .sort((a, b) => ((b.from as any).length || Infinity) - ((a.from as any).length || Infinity)) - .reduce((str, { from, to }) => { - return str.replace(typeof from === 'string' ? new RegExp(`${escapeRegex(from)}`, 'g') : from, to) - }, str) + .reduce((str, { from, to }) => str.replace(typeof from === 'string' ? new RegExp(`${escapeRegex(from)}`, 'g') : from, to), str) } } diff --git a/e2e/__helpers__/test-case/runtime.ts b/e2e/__helpers__/test-case/runtime.ts index 718c9e5aa6..3e4bdb5f7f 100644 --- a/e2e/__helpers__/test-case/runtime.ts +++ b/e2e/__helpers__/test-case/runtime.ts @@ -44,12 +44,12 @@ describe.skip('__eval', () => { eval(process.env.__TS_JEST_EVAL); ` -// tslint:disable-next-line:variable-name let __hooksSource: string function hooksSourceWith(vars: Record): string { if (!__hooksSource) { __hooksSource = readFileSync(join(__dirname, '__hooks-source__.js.hbs'), 'utf8') } + // eslint-disable-next-line no-useless-escape return __hooksSource.replace(/\{\{([^\}]+)\}\}/g, (_, key) => JSON.stringify(vars[key])) } @@ -122,6 +122,7 @@ export function run(name: string, options: RunTestOptions = {}): RunResult { // write final config // FIXME: sounds like the json fail to be encoded as an arg + // eslint-disable-next-line no-constant-condition if (false /* enableOptimizations() */) { cmdArgs.push('--config', JSON.stringify(finalConfig)) } else if (Object.keys(extraConfig).length !== 0) { @@ -191,11 +192,9 @@ execFile(cmd, args, options) copySync(wrkDir, srcDir, { overwrite: false, - filter: from => { - return relative(sourceDir, from) + filter: from => relative(sourceDir, from) .split(sep) - .includes('__snapshots__') - }, + .includes('__snapshots__'), }) }) } diff --git a/e2e/__helpers__/test-case/types.ts b/e2e/__helpers__/test-case/types.ts index fc6028af03..8410d12c41 100644 --- a/e2e/__helpers__/test-case/types.ts +++ b/e2e/__helpers__/test-case/types.ts @@ -24,7 +24,7 @@ export interface RunWithTemplateIteratorContext { testLabel: string } -// tslint:disable-next-line:interface-over-type-literal + export type TestRunResultsMap = { [key in T]: RunResult } export interface PreparedTest { diff --git a/e2e/__helpers__/test-case/utils.ts b/e2e/__helpers__/test-case/utils.ts index 2a87c9160b..203029f270 100644 --- a/e2e/__helpers__/test-case/utils.ts +++ b/e2e/__helpers__/test-case/utils.ts @@ -3,6 +3,7 @@ import { join } from 'path' // from https://stackoverflow.com/questions/25245716/remove-all-ansi-colors-styles-from-strings export function stripAnsiColors(stringToStrip: string): string { + // eslint-disable-next-line no-control-regex return stringToStrip.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '') } @@ -18,8 +19,8 @@ export function templateNameForPath(path: string): string { const PASS_MARKS = ['√', '✓'] const FAIL_MARKS = ['×', '✕'] const normalizeTestMark = (mark: string): string => { - if (PASS_MARKS.includes(mark)) return PASS_MARKS[0]; // tslint:disable-line - if (FAIL_MARKS.includes(mark)) return FAIL_MARKS[0]; // tslint:disable-line + if (PASS_MARKS.includes(mark)) return PASS_MARKS[0] + if (FAIL_MARKS.includes(mark)) return FAIL_MARKS[0] return '?' } @@ -27,15 +28,14 @@ export function normalizeJestOutput(output: string): string { let out: string = output .trim() // removes total and estimated times - .replace(/^(\s*Time\s*:\s*)[\d.]+m?s(?:(,\s*estimated\s+)[\d.]+m?s)?$/gm, (_, start) => { - return `${start}XXs` - }) + .replace(/^(\s*Time\s*:\s*)[\d.]+m?s(?:(,\s*estimated\s+)[\d.]+m?s)?$/gm, (_, start) => `${start}XXs`) // remove times after PASS/FAIL path/to/file (xxxs) .replace(/^\s*((?:PASS|FAIL) .+) \([\d.]+m?s\)$/gm, (_, start) => `${start}`) // removes each test time values .replace( + // eslint-disable-next-line no-useless-escape /^(\s*)(✕|×|✓|√)(\s+[^\(]+)(\s+\([\d.]+m?s\))?$/gm, - (_, start, mark, mid /*, time */) => `${start}${normalizeTestMark(mark)}${mid}`, + (_, start, mark, mid /* , time */) => `${start}${normalizeTestMark(mark)}${mid}`, ) // TODO: improves this... if (process.platform === 'win32') { @@ -45,6 +45,7 @@ export function normalizeJestOutput(output: string): string { } export function escapeRegex(s: string) { + // eslint-disable-next-line no-useless-escape return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') } diff --git a/e2e/__serializers__/run-result.ts b/e2e/__serializers__/run-result.ts index 8aeadc38ce..8cc3babddb 100644 --- a/e2e/__serializers__/run-result.ts +++ b/e2e/__serializers__/run-result.ts @@ -2,16 +2,16 @@ import RunResult from '../__helpers__/test-case/run-result' export const test = (val: any) => val && val instanceof RunResult export const print = (val: RunResult, _: any, indent: any) => { - const out = [ - `${val.status === 0 ? '√' : '×'} ${val.cmdLine}`, - `↳ exit code: ${val.status}`, - `===[ STDOUT ]${'='.repeat(67)}`, - val.normalizedStdout, - `===[ STDERR ]${'='.repeat(67)}`, - val.normalizedStderr, - '='.repeat(80), - ] - .map(l => indent(l)) - .join('\n') - return out + const out = [ + `${val.status === 0 ? '√' : '×'} ${val.cmdLine}`, + `↳ exit code: ${val.status}`, + `===[ STDOUT ]${'='.repeat(67)}`, + val.normalizedStdout, + `===[ STDERR ]${'='.repeat(67)}`, + val.normalizedStderr, + '='.repeat(80), + ] + .map(l => indent(l)) + .join('\n') + return out } diff --git a/e2e/__tests__/logger.test.ts b/e2e/__tests__/logger.test.ts index 0352fa9eaf..6563b51e88 100644 --- a/e2e/__tests__/logger.test.ts +++ b/e2e/__tests__/logger.test.ts @@ -26,7 +26,7 @@ describe('TS_JEST_LOG', () => { it(`should pass and create log file when using template "${templateName}"`, () => { const result = runTest() expect(result.status).toBe(0) - expect(existsSync(result.logFilePath)) + expect(existsSync(result.logFilePath)).toBe(true) const filteredEntries = result.logFileEntries // keep only debug and above .filter(m => (m.context[LogContexts.logLevel] || 0) >= LogLevels.debug) diff --git a/e2e/__tests__/module-kinds/helpers.ts b/e2e/__tests__/module-kinds/helpers.ts index 1e01b2aff5..66501102ea 100644 --- a/e2e/__tests__/module-kinds/helpers.ts +++ b/e2e/__tests__/module-kinds/helpers.ts @@ -8,13 +8,12 @@ import { configureTestCase } from '../../__helpers__/test-case' // ES2015 = 5, // ESNext = 6 -const testCaseForCompilerOpt = (config: any) => { - return configureTestCase('module-kinds', { +const testCaseForCompilerOpt = (config: any) => configureTestCase('module-kinds', { tsJestConfig: { tsConfig: config, diagnostics: { warnOnly: true } }, noCache: true, }) -} +// eslint-disable-next-line jest/no-export export const runTestForOptions = (options: { module: string allowSyntheticDefaultImports?: boolean diff --git a/package-lock.json b/package-lock.json index c291359b6e..efc8ed5c8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1453,6 +1453,12 @@ "@types/node": "*" } }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, "@types/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", @@ -1512,6 +1518,12 @@ "integrity": "sha512-otRe77JNNWzoVGLKw8TCspKswRoQToys4tuL6XYVBFxjgeM0RUrx7m3jkaTdxILxeGry3zM8mGYkGXMeQ02guA==", "dev": true }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, "@types/json5": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", @@ -1648,6 +1660,116 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz", + "integrity": "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.30.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz", + "integrity": "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.30.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz", + "integrity": "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.30.0", + "@typescript-eslint/typescript-estree": "2.30.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz", + "integrity": "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, "JSONStream": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", @@ -2479,6 +2601,12 @@ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, + "comment-parser": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.2.tgz", + "integrity": "sha512-4Rjb1FnxtOcv9qsfuaNuVsmmVn4ooVoBHzYfyKteiXwIU84PClyGA5jASoFMwPV93+FPh9spwueXauxFJZkGAg==", + "dev": true + }, "compare-func": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", @@ -3131,12 +3259,6 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, "diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -3345,24 +3467,64 @@ } } }, - "eslint-plugin-prettier": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz", - "integrity": "sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA==", + "eslint-config-prettier": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", "dev": true, "requires": { - "fast-diff": "^1.1.1", - "jest-docblock": "^21.0.0" + "get-stdin": "^6.0.0" }, "dependencies": { - "jest-docblock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", - "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true } } }, + "eslint-plugin-jest": { + "version": "23.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz", + "integrity": "sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^2.5.0" + } + }, + "eslint-plugin-jsdoc": { + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-24.0.0.tgz", + "integrity": "sha512-AGAc9PYpramsJGVmqtxnXBYlq+AMh+hIZdbJ52OLvyJS3f+PaT/PzuckRFOLnth2uhCDv4IjgsB3r5jUFWqUnw==", + "dev": true, + "requires": { + "comment-parser": "^0.7.2", + "debug": "^4.1.1", + "jsdoctypeparser": "^6.1.0", + "lodash": "^4.17.15", + "regextras": "^0.7.0", + "semver": "^6.3.0", + "spdx-expression-parse": "^3.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz", + "integrity": "sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "eslint-scope": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", @@ -6571,6 +6733,12 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "jsdoctypeparser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz", + "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==", + "dev": true + }, "jsdom": { "version": "15.2.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", @@ -7897,6 +8065,15 @@ "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-format": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", @@ -8078,6 +8255,12 @@ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, + "regextras": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.0.tgz", + "integrity": "sha512-ds+fL+Vhl918gbAUb0k2gVKbTZLsg84Re3DI6p85Et0U0tYME3hyW4nMK8Px4dtDaBA2qNjvG5uWyW7eK5gfmw==", + "dev": true + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -9275,67 +9458,6 @@ "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, - "tslint": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", - "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.10.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "dev": true - }, - "tslint-plugin-prettier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslint-plugin-prettier/-/tslint-plugin-prettier-2.3.0.tgz", - "integrity": "sha512-F9e4K03yc9xuvv+A0v1EmjcnDwpz8SpCD8HzqSDe0eyg34cBinwn9JjmnnRrNAs4HdleRQj7qijp+P/JTxt4vA==", - "dev": true, - "requires": { - "eslint-plugin-prettier": "^2.2.0", - "lines-and-columns": "^1.1.6", - "tslib": "^1.7.1" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/package.json b/package.json index cf9080f96d..e34d1b6d5c 100644 --- a/package.json +++ b/package.json @@ -19,12 +19,8 @@ "test:unit": "node_modules/.bin/jest", "test:external": "node scripts/test-external-project.js", "test:external-repos": "npm run test:external external-repos", - "lint": "run-s lint:ts lint:js", - "lint:js": "node_modules/.bin/eslint . -f stylish", - "lint:ts": "node_modules/.bin/tslint -t stylish --project .", - "lint:fix": "run-s lint:fix:ts lint:fix:js", - "lint:fix:js": "node_modules/.bin/eslint . --fix", - "lint:fix:ts": "node_modules/.bin/tslint --fix --project .", + "lint": "node_modules/.bin/eslint --ext .js,.ts .", + "lint:fix": "node_modules/.bin/eslint --fix --ext .js,.ts .", "typecheck": "node_modules/.bin/tsc -p .", "doc": "cd docs && bundle exec jekyll serve --livereload", "doc:link": "git worktree add docs/_site gh-pages", @@ -106,9 +102,15 @@ "@types/semver": "latest", "@types/yargs": "latest", "@types/yargs-parser": "15.x", + "@typescript-eslint/eslint-plugin": "^2.30.0", + "@typescript-eslint/parser": "^2.30.0", "conventional-changelog-cli": "2.x", "cross-spawn": "latest", "eslint": "latest", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-jest": "^23.8.2", + "eslint-plugin-jsdoc": "^24.0.0", + "eslint-plugin-prettier": "^3.1.3", "fs-extra": "8.x", "glob-gitignore": "latest", "husky": "3.x", @@ -120,14 +122,11 @@ "npm-run-all": "latest", "prettier": "1.x", "source-map": "latest", - "tslint": "latest", - "tslint-config-prettier": "latest", - "tslint-plugin-prettier": "latest", "typescript": "3.x" }, "lint-staged": { "*.{ts,tsx}": [ - "tslint --fix", + "eslint --fix", "git add" ], "*.{js,jsx}": [ diff --git a/preprocessor.js b/preprocessor.js index 19a071d4bd..c23a1d0f21 100644 --- a/preprocessor.js +++ b/preprocessor.js @@ -1,3 +1,4 @@ +// eslint-disable-next-line no-console console.warn( 'ts-jest[main] (WARN) Replace any occurrences of "ts-jest/dist/preprocessor.js" or ' + ' "/node_modules/ts-jest/preprocessor.js"' + diff --git a/presets/index.js b/presets/index.js index 95cca6d7be..0417538e7c 100644 --- a/presets/index.js +++ b/presets/index.js @@ -1,13 +1,20 @@ const create = require('./create') module.exports = { - get defaults() { return create() }, - get jsWithTs() { return create({ allowJs: true }) }, + get defaults() { + return create() + }, + get jsWithTs() { + return create({ allowJs: true }) + }, get jsWithBabel() { - return create({ allowJs: false }, { - transform: { - '^.+\\.jsx?$': 'babel-jest', - }, - }) + return create( + { allowJs: false }, + { + transform: { + '^.+\\.jsx?$': 'babel-jest', + }, + } + ) }, } diff --git a/scripts/clean.js b/scripts/clean.js index 90b6ee88ab..a66545a7cd 100755 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -4,16 +4,15 @@ const { removeSync } = require('fs-extra') const Paths = require('./lib/paths') const { join } = require('path') -if (process.argv.indexOf('--when-ci-commit-message') !== -1) { - let msg = - process.env.TRAVIS_COMMIT_MESSAGE || - process.env.APPVEYOR_REPO_COMMIT_MESSAGE - if (!msg) +if (process.argv.includes('--when-ci-commit-message')) { + let msg = process.env.TRAVIS_COMMIT_MESSAGE || process.env.APPVEYOR_REPO_COMMIT_MESSAGE + if (!msg) { throw new Error('Unable to guess the commit message from CI env variables') + } if (process.env.APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED) { msg = `${msg}\n${process.env.APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED}` } - if (!/\[ci clean\]/.test(msg)) process.exit(0) + if (!msg.includes('[ci clean]')) process.exit(0) } removeSync(Paths.distDir) diff --git a/scripts/e2e.js b/scripts/e2e.js index 3e2ad46765..10ba9a2152 100755 --- a/scripts/e2e.js +++ b/scripts/e2e.js @@ -1,6 +1,7 @@ #!/usr/bin/env node 'use strict' +// eslint-disable-next-line jest/no-jest-import const jest = require('jest') const { spawnSync } = require('./lib/spawn-sync') const fs = require('fs-extra') @@ -15,21 +16,14 @@ const configFile = path.join(Paths.e2eRootDir, 'jest.config.js') let parentArgs = process.argv.slice(2) if (parentArgs.includes('--coverage')) { - logger.warn( - 'Coverages cannot be activated for e2e tests (but can in each e2e test).' - ) + logger.warn('Coverages cannot be activated for e2e tests (but can in each e2e test).') parentArgs = parentArgs.filter(a => a !== '--coverage') } if (!parentArgs.includes('--runInBand')) parentArgs.push('--runInBand') const prepareOnly = parentArgs.includes('--prepareOnly') -// eslint-disable-next-line no-unused-vars -function enableOptimizations() { - return !!process.env.TS_JEST_E2E_OPTIMIZATIONS -} - function getDirectories(rootDir) { - return fs.readdirSync(rootDir).filter(function (file) { + return fs.readdirSync(rootDir).filter(function(file) { return fs.statSync(path.join(rootDir, file)).isDirectory() }) } @@ -47,11 +41,7 @@ function log(...msg) { function setupE2e() { // kept on top so that the build is triggered beforehand (pack => prepublish => clean-build => build) const bundle = createBundle(log) - log( - 'bundle created:', - path.relative(Paths.rootDir, bundle), - '; computing digest' - ) + log('bundle created:', path.relative(Paths.rootDir, bundle), '; computing digest') // get the hash of the bundle (to know if we should install it again or not) const bundleHash = readPackageDigest() @@ -63,10 +53,7 @@ function setupE2e() { // link locally so we could find it easily if (!process.env.CI && !fs.existsSync(Paths.e2eWotkDirLink)) { fs.symlinkSync(Paths.e2eWorkDir, Paths.e2eWotkDirLink, 'dir') - log( - 'symbolic link to the work directory created at: ', - Paths.e2eWotkDirLink - ) + log('symbolic link to the work directory created at: ', Paths.e2eWotkDirLink) } // cleanup files related to old test run @@ -94,11 +81,7 @@ function setupE2e() { Object.keys(deps) .sort() .forEach(name => { - log( - ' -', - `${name}${' '.repeat(20 - name.length)}`, - deps[name].version - ) + log(' -', `${name}${' '.repeat(20 - name.length)}`, deps[name].version) }) deps = null } @@ -128,16 +111,13 @@ function setupE2e() { const pkgLockHash = sha1(fs.readFileSync(pkgLockFile)) const e2eData = fs.existsSync(e2eFile) ? fs.readJsonSync(e2eFile) : {} let bundleOk = e2eData.bundleHash === bundleHash - let packagesOk = e2eData.packageLockHash === pkgLockHash + const packagesOk = e2eData.packageLockHash === pkgLockHash if (fs.existsSync(nodeModulesDir)) { log(` [template: ${name}]`, 'bundle: ', bundleOk ? 'OK' : 'CHANGED') log(` [template: ${name}]`, 'packages: ', packagesOk ? 'OK' : 'CHANGED') if (bundleOk && packagesOk) { - log( - ` [template: ${name}]`, - 'bundle and packages unchanged, nothing to do' - ) + log(` [template: ${name}]`, 'bundle and packages unchanged, nothing to do') logPackageVersions() return } diff --git a/scripts/lib/npm.js b/scripts/lib/npm.js index dce0223ff4..2cf70e7d50 100644 --- a/scripts/lib/npm.js +++ b/scripts/lib/npm.js @@ -3,15 +3,13 @@ const { satisfies } = require('semver') const memoize = require('lodash.memoize') const { join } = require('path') -const version = memoize(() => { - return spawnSync(['-s', '--version']) +const version = memoize(() => + spawnSync(['-s', '--version']) .stdout.toString() .trim() -}) +) -const spawnSync = (args, options = {}) => { - return spawn('npm', args, options) -} +const spawnSync = (args, options = {}) => spawn('npm', args, options) const can = { ci: memoize(() => satisfies(version(), '>=5.7.0')), diff --git a/scripts/test-external-project.js b/scripts/test-external-project.js index 8bc47e0c25..10b9888bc4 100755 --- a/scripts/test-external-project.js +++ b/scripts/test-external-project.js @@ -38,33 +38,18 @@ const executeTest = (monorepoRealPath, bundle) => { if (!projectPkg.version) projectPkg.version = 'unknown' logger.log() - logger.log( - '='.repeat(20), - `${projectPkg.name}@${projectPkg.version}`, - 'in', - monorepoRealPath, - '='.repeat(20) - ) + logger.log('='.repeat(20), `${projectPkg.name}@${projectPkg.version}`, 'in', monorepoRealPath, '='.repeat(20)) logger.log() // then we install it in the repo logger.log('ensuring all depedencies of target project are installed') - npm.spawnSync( - ['install', '--no-package-lock', '--no-shrinkwrap', '--no-save'], - { cwd: monorepoRealPath } - ) + npm.spawnSync(['install', '--no-package-lock', '--no-shrinkwrap', '--no-save'], { cwd: monorepoRealPath }) logger.log('installing bundled version of ts-jest') - npm.spawnSync( - ['install', '--no-package-lock', '--no-shrinkwrap', '--no-save', bundle], - { cwd: monorepoRealPath } - ) + npm.spawnSync(['install', '--no-package-lock', '--no-shrinkwrap', '--no-save', bundle], { cwd: monorepoRealPath }) // then we can run the tests const useYarn = existsSync(join(monorepoRealPath, 'yarn.lock')) - const cmdLine = - projectPkg.scripts && projectPkg.scripts.test - ? [(useYarn ? 'yarn' : 'npm'), 'test'] - : ['jest'] + const cmdLine = projectPkg.scripts && projectPkg.scripts.test ? [useYarn ? 'yarn' : 'npm', 'test'] : ['jest'] if (jestArgs.length) { cmdLine.push('--') cmdLine.push(...jestArgs) @@ -76,9 +61,7 @@ const executeTest = (monorepoRealPath, bundle) => { spawnSync(cmdLine.shift(), cmdLine, { cwd: monorepoRealPath, stdio: 'inherit', - env: Object.assign({}, process.env, { - TS_JEST_IGNORE_DIAGNOSTICS: '5023,5024', - }), + env: { ...process.env, TS_JEST_IGNORE_DIAGNOSTICS: '5023,5024' }, }) } @@ -97,11 +80,7 @@ if (/^((https|ssh|git):\/\/|[a-z0-9]+@[a-z0-9.]+:).+$/.test(projectPath)) { } catch (e) { monorepoRealPath = undefined } - if ( - !monorepoRealPath || - !existsSync(join(monorepoRealPath, 'package.json')) || - monorepoRealPath === rootDir - ) { + if (!monorepoRealPath || !existsSync(join(monorepoRealPath, 'package.json')) || monorepoRealPath === rootDir) { logger.error('First argument must be the path to a project or a git URL') process.exit(1) } else { diff --git a/scripts/update-e2e-templates.js b/scripts/update-e2e-templates.js index 0c0c531e7d..34df63cebe 100755 --- a/scripts/update-e2e-templates.js +++ b/scripts/update-e2e-templates.js @@ -13,15 +13,10 @@ const templateDirs = fs .filter(f => fs.statSync(path.join(Paths.e2eTemplatesDir, f)).isDirectory()) templateDirs.forEach((tmpl, i) => { const tmplPath = path.join(Paths.e2eTemplatesDir, tmpl) - logger.log( - `[${i + 1}/${templateDirs.length}] updating dependencies of ${tmpl}:` - ) + logger.log(`[${i + 1}/${templateDirs.length}] updating dependencies of ${tmpl}:`) process.chdir(tmplPath) const wanted = require(path.join(tmplPath, 'package.json')).wantedDependencies - if (!wanted) - throw new Error( - 'The package.json must have a "wantedDependencies" section.' - ) + if (!wanted) throw new Error('The package.json must have a "wantedDependencies" section.') let args = [] Object.keys(wanted).forEach(key => { diff --git a/src/__helpers__/mocks.ts b/src/__helpers__/mocks.ts index 75cdd8bc9c..bd49d6a2a0 100644 --- a/src/__helpers__/mocks.ts +++ b/src/__helpers__/mocks.ts @@ -29,14 +29,12 @@ export const mockObject = (obj: T, newProps: M): T & M & { mockRestore: () }) } -export const mockWriteStream = () => { - return { - written: [] as string[], - write(text: string) { - this.written.push(text) - }, - clear() { - this.written = [] - }, - } -} +export const mockWriteStream = () => ({ + written: [] as string[], + write(text: string) { + this.written.push(text) + }, + clear() { + this.written = [] + }, +}) diff --git a/src/__helpers__/path.ts b/src/__helpers__/path.ts index 0ee19c2b47..6841f891e9 100644 --- a/src/__helpers__/path.ts +++ b/src/__helpers__/path.ts @@ -9,7 +9,7 @@ export function relativeToRoot(path: string) { } export function tempDir(ns: string) { - const dir = join(tmpdir(), `ts-jest-unit-tests`, ns, parseInt((Math.random() * 1e17) as any, 10).toString(36)) + const dir = join(tmpdir(), 'ts-jest-unit-tests', ns, parseInt((Math.random() * 1e17) as any, 10).toString(36)) ensureDirSync(dir) return dir } diff --git a/src/__helpers__/processed-source.ts b/src/__helpers__/processed-source.ts index 3ca7f19346..2e9ead49a9 100644 --- a/src/__helpers__/processed-source.ts +++ b/src/__helpers__/processed-source.ts @@ -4,7 +4,6 @@ import { RawSourceMap } from 'source-map' import { ROOT } from './path' import { ParsedSourceWithMaps, parseSource, relativisePaths, rewriteSourceMaps } from './source-maps' -// tslint:disable-next-line:no-default-export export default class ProcessedSource { readonly filename: string @@ -30,7 +29,7 @@ export default class ProcessedSource { get normalizedOutputSourceMaps(): RawSourceMap | undefined { const maps = this.outputSourceMaps if (maps) return this.sourceMapsNormalizer(maps) - return + return undefined } get sourceMapsNormalizer() { return (maps: RawSourceMap): RawSourceMap => relativisePaths(maps, this.cwd, '/') diff --git a/src/__helpers__/source-maps.ts b/src/__helpers__/source-maps.ts index e2c50a6bd5..1c0bfd8e75 100644 --- a/src/__helpers__/source-maps.ts +++ b/src/__helpers__/source-maps.ts @@ -20,6 +20,7 @@ export interface ParsedSourceWithMaps { } export function parseSource(source: string): ParsedSourceWithMaps { const [comment, b64Maps]: [string, string | undefined] = + // eslint-disable-next-line @typescript-eslint/prefer-regexp-exec (source.match(/[\n^]\/\/#\s*sourceMappingURL=data:application\/json;(?:charset=utf-8;)?base64,(\S+)\s*$/) as any) || [] if (b64Maps) { diff --git a/src/cli/config/init.ts b/src/cli/config/init.ts index 410c76f75b..043f901c9c 100644 --- a/src/cli/config/init.ts +++ b/src/cli/config/init.ts @@ -91,17 +91,17 @@ export const run: CliCommand = async (args: Arguments /* , logger: Logger */) => if (jestPreset) { content.push(` preset: '${preset.name}',`) } else { - content.push(` ...tsjPreset,`) + content.push(' ...tsjPreset,') } - if (!jsdom) content.push(` testEnvironment: 'node',`) + if (!jsdom) content.push(" testEnvironment: 'node',") if (tsconfig || shouldPostProcessWithBabel) { - content.push(` globals: {`) - content.push(` 'ts-jest': {`) + content.push(' globals: {') + content.push(" 'ts-jest': {") if (tsconfig) content.push(` tsconfig: ${stringifyJson5(tsconfig)},`) - if (shouldPostProcessWithBabel) content.push(` babelConfig: true,`) - content.push(` },`) - content.push(` },`) + if (shouldPostProcessWithBabel) content.push(' babelConfig: true,') + content.push(' },') + content.push(' },') } content.push('};') diff --git a/src/cli/config/migrate.ts b/src/cli/config/migrate.ts index dadbf0434c..b6caa043e6 100644 --- a/src/cli/config/migrate.ts +++ b/src/cli/config/migrate.ts @@ -13,7 +13,7 @@ import { JestPresetNames, TsJestPresetDescriptor, allPresets, defaults } from '. /** * @internal */ -export const run: CliCommand = async (args: Arguments /*, logger: Logger*/) => { +export const run: CliCommand = async (args: Arguments /* , logger: Logger*/) => { const nullLogger = createLogger({ targets: [] }) const file = args._[0] const filePath = resolve(process.cwd(), file) @@ -110,7 +110,6 @@ Visit https://kulshekhar.github.io/ts-jest/user/config/#jest-preset for more inf Object.keys(migratedConfig.transform).forEach(key => { const val = (migratedConfig.transform as any)[key] if (typeof val === 'string' && /\/?ts-jest(?:\/preprocessor\.js)?$/.test(val)) { - // tslint:disable-next-line:semicolon ;(migratedConfig.transform as any)[key] = 'ts-jest' } }) @@ -136,8 +135,8 @@ No migration needed for given Jest configuration return } - const stringify = /\.json$/.test(file) ? JSON.stringify : stringifyJson5 - const prefix = /\.json$/.test(file) ? '"jest": ' : 'module.exports = ' + const stringify = file.endsWith('.json') ? JSON.stringify : stringifyJson5 + const prefix = file.endsWith('.json') ? '"jest": ' : 'module.exports = ' // if we are using preset, inform the user that he might be able to remove some section(s) // we couldn't check for equality diff --git a/src/cli/helpers/presets.ts b/src/cli/helpers/presets.ts index e5a3139a3e..fdfb225387 100644 --- a/src/cli/helpers/presets.ts +++ b/src/cli/helpers/presets.ts @@ -32,6 +32,7 @@ const definePreset = (fullName: string): TsJestPresetDescriptor => ({ : fullName .split('/') .pop()! + // eslint-disable-next-line no-useless-escape .replace(/\-([a-z])/g, (_, l) => l.toUpperCase()) }, get value() { diff --git a/src/cli/index.ts b/src/cli/index.ts index 73f3ae4c61..5962ecd802 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -31,7 +31,7 @@ async function cli(args: string[]): Promise { // deprecated if (parsedArgv.allowJs != null) { - if (parsedArgv.js) throw new Error(`The 'allowJs' and 'js' options cannot be set together.`) + if (parsedArgv.js) throw new Error("The 'allowJs' and 'js' options cannot be set together.") parsedArgv.js = parsedArgv.allowJs ? 'ts' : undefined } @@ -41,7 +41,6 @@ async function cli(args: string[]): Promise { if (!VALID_COMMANDS.includes(command)) command = 'help' - // tslint:disable-next-line:no-var-requires const { run, help }: { run: CliCommand; help: CliCommand } = require(`./${command.replace(/:/g, '/')}`) const cmd = isHelp && command !== 'help' ? help : run diff --git a/src/compiler/compiler-utils.ts b/src/compiler/compiler-utils.ts index 154c6f911d..35ddc089e9 100644 --- a/src/compiler/compiler-utils.ts +++ b/src/compiler/compiler-utils.ts @@ -35,17 +35,17 @@ export function cacheResolvedModules( * Ugly trick while waiting for https://github.com/microsoft/TypeScript/issues/33994 */ if (importReferences.length) { - logger.debug({ fileName }, `cacheResolvedModules(): get resolved modules`) + logger.debug({ fileName }, 'cacheResolvedModules(): get resolved modules') memoryCache.resolvedModules[fileName] = Object.create(null) memoryCache.resolvedModules[fileName].modulePaths = importReferences .filter((importReference: any) => importReference.parent.parent.resolvedModules?.get(importReference.text)) - .map((importReference: any) => { - return normalize( + .map((importReference: any) => + normalize( (importReference.parent.parent.resolvedModules.get(importReference.text) as _ts.ResolvedModule) .resolvedFileName, - ) - }) + ), + ) .reduce((a: any, b: any) => a.concat(b), []) memoryCache.resolvedModules[fileName].testFileContent = fileContent writeFileSync(getResolvedModulesCache(cacheDir), JSON.stringify(memoryCache.resolvedModules)) @@ -64,7 +64,7 @@ export function isTestFile(testMatchPatterns: (string | RegExp)[], fileName: str /* istanbul ignore next (we leave this for e2e) */ function isUsingProjectReferences( program: _ts.Program, - projectReferences: ReadonlyArray<_ts.ProjectReference> | undefined, + projectReferences: readonly _ts.ProjectReference[] | undefined, ) { if (projectReferences && !!program.getProjectReferences) { return Boolean(program && program.getProjectReferences()) @@ -76,7 +76,7 @@ function isUsingProjectReferences( /* istanbul ignore next (we leave this for e2e) */ function getResolvedProjectReferences( program: _ts.Program, -): ReadonlyArray<_ts.ResolvedProjectReference | undefined> | undefined { +): readonly (_ts.ResolvedProjectReference | undefined)[] | undefined { const getProjectReferences = program.getResolvedProjectReferences ?? program.getProjectReferences if (getProjectReferences) { return getProjectReferences() @@ -89,7 +89,7 @@ function getResolvedProjectReferences( function getProjectReferenceForFile( filePath: string, program: _ts.Program, - projectReferences: ReadonlyArray<_ts.ProjectReference> | undefined, + projectReferences: readonly _ts.ProjectReference[] | undefined, ) { if (isUsingProjectReferences(program, projectReferences)) { return ( @@ -111,7 +111,7 @@ export function getAndCacheProjectReference( filePath: string, program: _ts.Program, files: TSFiles, - projectReferences: ReadonlyArray<_ts.ProjectReference> | undefined, + projectReferences: readonly _ts.ProjectReference[] | undefined, ) { const file = files.get(filePath) if (file?.projectReference) { @@ -185,7 +185,7 @@ export function getCompileResultFromReferencedProject( if (referencedProject.commandLine.options.outFile !== undefined) { throw new Error( `The referenced project at ${relativeProjectConfigPath} is using ` + - `the outFile' option, which is not supported with ts-jest.`, + "the outFile' option, which is not supported with ts-jest.", ) } @@ -193,10 +193,9 @@ export function getCompileResultFromReferencedProject( const relativeJSFileName = configs.resolvePath(jsFileName) if (!configs.compilerModule.sys.fileExists(jsFileName)) { throw new Error( - // tslint:disable-next-line:prefer-template - `Could not find output JavaScript file for input ` + + 'Could not find output JavaScript file for input ' + `${relativeFilePath} (looked at ${relativeJSFileName}).\n` + - `The input file is part of a project reference located at ` + + 'The input file is part of a project reference located at ' + `${relativeProjectConfigPath}, so ts-jest is looking for the ` + 'project’s pre-built output on disk. Try running `tsc --build` ' + 'to build project references.', diff --git a/src/compiler/instance.ts b/src/compiler/instance.ts index 920e18ecfc..daae479d4b 100644 --- a/src/compiler/instance.ts +++ b/src/compiler/instance.ts @@ -49,23 +49,22 @@ const compileAndCacheResult = ( compileFn: CompileFn, getExtension: (fileName: string) => string, logger: Logger, -) => { - return (code: string, fileName: string, lineOffset?: number) => { - logger.debug({ fileName }, 'compileAndCacheResult(): get compile output') +) => (code: string, fileName: string, lineOffset?: number) => { + logger.debug({ fileName }, 'compileAndCacheResult(): get compile output') - const [value, sourceMap] = compileFn(code, fileName, lineOffset) - const output = updateOutput(value, fileName, sourceMap, getExtension) - memoryCache.files.set(fileName, { - ...memoryCache.files.get(fileName)!, - output, - }) + const [value, sourceMap] = compileFn(code, fileName, lineOffset) + const output = updateOutput(value, fileName, sourceMap, getExtension) + memoryCache.files.set(fileName, { + ...memoryCache.files.get(fileName)!, + output, + }) - return output - } + return output } /** * Register TypeScript compiler instance. + * * @internal */ export const createCompilerInstance = (configs: ConfigSet): TsCompiler => { diff --git a/src/compiler/language-service.spec.ts b/src/compiler/language-service.spec.ts index 133439d377..eb79eefdcd 100644 --- a/src/compiler/language-service.spec.ts +++ b/src/compiler/language-service.spec.ts @@ -69,7 +69,6 @@ describe('Language service', () => { }) it('should cache resolved modules for test file with testMatchPatterns from jest config when match', () => { - // tslint:disable-next-line:no-empty const spy = jest.spyOn(compilerUtils, 'cacheResolvedModules').mockImplementationOnce(() => {}) const tmp = tempDir('compiler') const compiler = makeCompiler({ @@ -90,8 +89,7 @@ export const thing: Thing = { a: 1 }` spy.mockRestore() }) - it(`shouldn't cache resolved modules for test file with testMatchPatterns from jest config when not match`, () => { - // tslint:disable-next-line:no-empty + it("shouldn't cache resolved modules for test file with testMatchPatterns from jest config when not match", () => { jest.spyOn(compilerUtils, 'cacheResolvedModules').mockImplementationOnce(() => {}) const tmp = tempDir('compiler') const compiler = makeCompiler({ @@ -109,7 +107,7 @@ export const thing: Thing = { a: 1 }` }) it('should compile js file for allowJs true with outDir', () => { - const fileName = `test-allow-js-with-outDir.js` + const fileName = 'test-allow-js-with-outDir.js' const compiler = makeCompiler({ tsJestConfig: { tsConfig: { allowJs: true, outDir: '$$foo$$' } }, }) @@ -124,7 +122,7 @@ export const thing: Thing = { a: 1 }` }) it('should compile js file for allowJs true without outDir', () => { - const fileName = `test-allow-js-no-outDir.js` + const fileName = 'test-allow-js-no-outDir.js' const compiler = makeCompiler({ tsJestConfig: { tsConfig: { allowJs: true } }, }) diff --git a/src/compiler/language-service.ts b/src/compiler/language-service.ts index 69eea6fd3c..2555d05ce4 100644 --- a/src/compiler/language-service.ts +++ b/src/compiler/language-service.ts @@ -50,7 +50,7 @@ export const initializeLanguageServiceInstance = ( // Set the file contents into cache. /* istanbul ignore next (cover by e2e) */ const updateMemoryCache = (contents: string, fileName: string) => { - logger.debug({ fileName }, `updateMemoryCache(): update memory cache for language service`) + logger.debug({ fileName }, 'updateMemoryCache(): update memory cache for language service') let shouldIncrementProjectVersion = false const hit = isFileInCache(fileName) @@ -101,7 +101,7 @@ export const initializeLanguageServiceInstance = ( const normalizedFileName = normalize(fileName) const hit = memoryCache.files.has(normalizedFileName) && memoryCache.files.get(normalizedFileName)!.version !== 0 - logger.trace({ normalizedFileName, cacheHit: hit }, `getScriptSnapshot():`, 'cache', hit ? 'hit' : 'miss') + logger.trace({ normalizedFileName, cacheHit: hit }, 'getScriptSnapshot():', 'cache', hit ? 'hit' : 'miss') // Read contents from TypeScript memory cache. if (!hit) { @@ -152,7 +152,7 @@ export const initializeLanguageServiceInstance = ( } else { const output: _ts.EmitOutput = service.getEmitOutput(fileName) // Do type checking by getting TypeScript diagnostics - logger.debug({ fileName }, `compileFn(): computing diagnostics using language service`) + logger.debug({ fileName }, 'compileFn(): computing diagnostics using language service') doTypeChecking(configs, fileName, service, logger) /** @@ -163,22 +163,21 @@ export const initializeLanguageServiceInstance = ( cacheResolvedModules(fileName, code, memoryCache, service.getProgram()!, cacheDir, logger) } else { Object.entries(memoryCache.resolvedModules) - .filter(entry => { - /** - * When imported modules change, we only need to check whether the test file is compiled previously or not - * base on memory cache. By checking memory cache, we can avoid repeatedly doing type checking against - * test file for 1st time run after clearing cache because - */ - return ( - entry[1].modulePaths.find(modulePath => modulePath === fileName) && !memoryCache.files.has(entry[0]) - ) - }) + .filter( + entry => + /** + * When imported modules change, we only need to check whether the test file is compiled previously or not + * base on memory cache. By checking memory cache, we can avoid repeatedly doing type checking against + * test file for 1st time run after clearing cache because + */ + entry[1].modulePaths.find(modulePath => modulePath === fileName) && !memoryCache.files.has(entry[0]), + ) .forEach(entry => { const testFileName = entry[0] const testFileContent = entry[1].testFileContent logger.debug( { fileName }, - `compileFn(): computing diagnostics for test file that imports this module using language service`, + 'compileFn(): computing diagnostics for test file that imports this module using language service', ) updateMemoryCache(testFileContent, testFileName) diff --git a/src/compiler/transpiler.spec.ts b/src/compiler/transpiler.spec.ts index dc00ed9fcd..86b99a5f2c 100644 --- a/src/compiler/transpiler.spec.ts +++ b/src/compiler/transpiler.spec.ts @@ -89,7 +89,7 @@ describe('Transpiler', () => { }) it('should compile tsx file for jsx preserve', () => { - const fileName = `foo.tsx` + const fileName = 'foo.tsx' const compiler = makeCompiler({ tsJestConfig: { ...baseTsJestConfig, @@ -113,7 +113,7 @@ describe('Transpiler', () => { }) it('should compile tsx file for other jsx options', () => { - const fileName = `foo.tsx` + const fileName = 'foo.tsx' const compiler = makeCompiler({ tsJestConfig: { ...baseTsJestConfig, diff --git a/src/config/config-set.spec.ts b/src/config/config-set.spec.ts index 527416ac23..daced3bf96 100644 --- a/src/config/config-set.spec.ts +++ b/src/config/config-set.spec.ts @@ -1,9 +1,10 @@ +/* eslint-disable jest/no-mocks-import */ import { Transformer } from '@jest/transform' import { Config } from '@jest/types' import { testing } from 'bs-logger' import { readFileSync } from 'fs' import json5 = require('json5') -import { resolve } from 'path' // tslint:disable-next-line:no-duplicate-imports +import { resolve } from 'path' import * as ts from 'typescript' import * as _myModule from '..' @@ -83,7 +84,7 @@ describe('projectPackageJson', () => { ).toEqual(json5.parse(readFileSync(EXPECTED, 'utf8'))) }) - it(`should return value from root packageJson when provided value to tsJest config is undefined`, () => { + it('should return value from root packageJson when provided value to tsJest config is undefined', () => { expect( createConfigSet({ tsJestConfig: { packageJson: undefined }, @@ -92,7 +93,7 @@ describe('projectPackageJson', () => { ).toEqual('ts-jest') }) - it(`should return empty object when config file path doesn't exist and print loggings`, () => { + it("should return empty object when config file path doesn't exist and print loggings", () => { const logger = testing.createLoggerMock() expect( createConfigSet({ @@ -113,7 +114,7 @@ describe('projectPackageJson', () => { logger.target.clear() }) - it(`should return value from root packageJson when real path rootDir is the same as tsJest root`, () => { + it('should return value from root packageJson when real path rootDir is the same as tsJest root', () => { expect( createConfigSet({ resolve: null, @@ -198,13 +199,6 @@ describe('tsJest', () => { value: undefined, } expect(getTsJest().packageJson).toEqual(EXPECTED) - }) - - it('should be correct when packageJson is true', () => { - const EXPECTED = { - kind: 'file', - value: undefined, - } expect(getTsJest({ packageJson: true }).packageJson).toEqual(EXPECTED) }) @@ -1008,7 +1002,7 @@ describe('cacheKey', () => { cs.jsonValue.value = val // digest is mocked in src/__mocks__/index.ts expect(cs.cacheKey).toMatchInlineSnapshot( - `"{\\"digest\\":\\"a0d51ca854194df8191d0e65c0ca4730f510f332\\",\\"jest\\":{\\"__backported\\":true,\\"globals\\":{}},\\"projectDepVersions\\":{\\"dev\\":\\"1.2.5\\",\\"opt\\":\\"1.2.3\\",\\"peer\\":\\"1.2.4\\",\\"std\\":\\"1.2.6\\"},\\"transformers\\":[\\"hoisting-jest-mock@1\\"],\\"tsJest\\":{\\"compiler\\":\\"typescript\\",\\"diagnostics\\":{\\"ignoreCodes\\":[6059,18002,18003],\\"pretty\\":true,\\"throws\\":true},\\"isolatedModules\\":false,\\"packageJson\\":{\\"kind\\":\\"file\\"},\\"transformers\\":[]},\\"tsconfig\\":{\\"declaration\\":false,\\"inlineSourceMap\\":false,\\"inlineSources\\":true,\\"module\\":1,\\"noEmit\\":false,\\"removeComments\\":false,\\"sourceMap\\":true,\\"target\\":1}}"`, + '"{\\"digest\\":\\"a0d51ca854194df8191d0e65c0ca4730f510f332\\",\\"jest\\":{\\"__backported\\":true,\\"globals\\":{}},\\"projectDepVersions\\":{\\"dev\\":\\"1.2.5\\",\\"opt\\":\\"1.2.3\\",\\"peer\\":\\"1.2.4\\",\\"std\\":\\"1.2.6\\"},\\"transformers\\":[\\"hoisting-jest-mock@1\\"],\\"tsJest\\":{\\"compiler\\":\\"typescript\\",\\"diagnostics\\":{\\"ignoreCodes\\":[6059,18002,18003],\\"pretty\\":true,\\"throws\\":true},\\"isolatedModules\\":false,\\"packageJson\\":{\\"kind\\":\\"file\\"},\\"transformers\\":[]},\\"tsconfig\\":{\\"declaration\\":false,\\"inlineSourceMap\\":false,\\"inlineSources\\":true,\\"module\\":1,\\"noEmit\\":false,\\"removeComments\\":false,\\"sourceMap\\":true,\\"target\\":1}}"', ) }) }) // cacheKey @@ -1048,7 +1042,7 @@ describe('raiseDiagnostics', () => { it('should throw when warnOnly is false', () => { const { raiseDiagnostics } = createConfigSet({ createTsError, filterDiagnostics }) expect(() => raiseDiagnostics([])).not.toThrow() - expect(() => raiseDiagnostics([makeDiagnostic()])).toThrowErrorMatchingInlineSnapshot(`"[TS9999] foo"`) + expect(() => raiseDiagnostics([makeDiagnostic()])).toThrowErrorMatchingInlineSnapshot('"[TS9999] foo"') expect(() => raiseDiagnostics([makeDiagnostic({ category: ts.DiagnosticCategory.Message })])).not.toThrow() }) @@ -1071,13 +1065,13 @@ describe('raiseDiagnostics', () => { }) }) - describe(`diagnostics don't contain source file`, () => { + describe("diagnostics don't contain source file", () => { const makeDiagnostic = ({ messageText = 'foo', code = 9999, category = ts.DiagnosticCategory.Warning, }: Partial = {}): ts.Diagnostic => ({ messageText, code, category } as any) - it(`should throw when diagnostics contains file path and pathRegex config matches file path`, () => { + it('should throw when diagnostics contains file path and pathRegex config matches file path', () => { const { raiseDiagnostics } = createConfigSet({ createTsError, logger, @@ -1085,12 +1079,12 @@ describe('raiseDiagnostics', () => { }) logger.target.clear() expect(() => raiseDiagnostics([makeDiagnostic()], 'src/__mocks__/index.ts')).toThrowErrorMatchingInlineSnapshot( - `"[TS9999] foo"`, + '"[TS9999] foo"', ) - expect(logger.target.lines).toMatchInlineSnapshot(`Array []`) + expect(logger.target.lines).toMatchInlineSnapshot('Array []') }) - it(`should not throw when diagnostics contains file path and pathRegex config doesn't match file path`, () => { + it("should not throw when diagnostics contains file path and pathRegex config doesn't match file path", () => { const { raiseDiagnostics } = createConfigSet({ createTsError, logger, @@ -1098,7 +1092,7 @@ describe('raiseDiagnostics', () => { }) logger.target.clear() expect(() => raiseDiagnostics([makeDiagnostic()], 'src/__mocks__/index.ts')).not.toThrow() - expect(logger.target.lines).toMatchInlineSnapshot(`Array []`) + expect(logger.target.lines).toMatchInlineSnapshot('Array []') }) }) @@ -1115,7 +1109,7 @@ describe('raiseDiagnostics', () => { category = ts.DiagnosticCategory.Warning, file = program.getSourceFiles().find(sourceFile => sourceFile.fileName === 'src/__mocks__/index.ts'), }: Partial = {}): ts.Diagnostic => ({ messageText, code, category, file } as any) - it(`should not throw when pathRegex config doesn't match source file path`, () => { + it("should not throw when pathRegex config doesn't match source file path", () => { const { raiseDiagnostics } = createConfigSet({ createTsError, logger, @@ -1123,18 +1117,18 @@ describe('raiseDiagnostics', () => { }) logger.target.clear() expect(() => raiseDiagnostics([makeDiagnostic()])).not.toThrow() - expect(logger.target.lines).toMatchInlineSnapshot(`Array []`) + expect(logger.target.lines).toMatchInlineSnapshot('Array []') }) - it(`should throw when pathRegex config doesn't match source file path`, () => { + it("should throw when pathRegex config doesn't match source file path", () => { const { raiseDiagnostics } = createConfigSet({ createTsError, logger, tsJestConfig: { diagnostics: { pathRegex: 'src/__mocks__/index.ts' } }, }) logger.target.clear() - expect(() => raiseDiagnostics([makeDiagnostic()])).toThrowErrorMatchingInlineSnapshot(`"[TS9999] foo"`) - expect(logger.target.lines).toMatchInlineSnapshot(`Array []`) + expect(() => raiseDiagnostics([makeDiagnostic()])).toThrowErrorMatchingInlineSnapshot('"[TS9999] foo"') + expect(logger.target.lines).toMatchInlineSnapshot('Array []') }) }) }) // raiseDiagnostics diff --git a/src/config/config-set.ts b/src/config/config-set.ts index 7fafe414c3..50fb164cba 100644 --- a/src/config/config-set.ts +++ b/src/config/config-set.ts @@ -79,13 +79,11 @@ const enum DiagnosticCodes { ConfigModuleOption, } -const normalizeRegex = (pattern: string | RegExp | undefined): string | undefined => { - return pattern ? (typeof pattern === 'string' ? pattern : pattern.source) : undefined -} +const normalizeRegex = (pattern: string | RegExp | undefined): string | undefined => + pattern ? (typeof pattern === 'string' ? pattern : pattern.source) : undefined -const toDiagnosticCode = (code: any): number | undefined => { - return code ? parseInt(`${code}`.trim().replace(/^TS/, ''), 10) || undefined : undefined -} +const toDiagnosticCode = (code: any): number | undefined => + code ? parseInt(`${code}`.trim().replace(/^TS/, ''), 10) || undefined : undefined const toDiagnosticCodeList = (items: any, into: number[] = []): number[] => { if (!Array.isArray(items)) items = [items] @@ -191,13 +189,14 @@ export class ConfigSet { */ @Memoize() get testMatchPatterns(): (string | RegExp)[] { - const matchablePatterns = [...this.jest.testMatch, ...this.jest.testRegex].filter(pattern => { - /** - * jest config testRegex doesn't always deliver the correct RegExp object - * See https://github.com/facebook/jest/issues/9778 - */ - return pattern instanceof RegExp || typeof pattern === 'string' - }) + const matchablePatterns = [...this.jest.testMatch, ...this.jest.testRegex].filter( + pattern => + /** + * jest config testRegex doesn't always deliver the correct RegExp object + * See https://github.com/facebook/jest/issues/9778 + */ + pattern instanceof RegExp || typeof pattern === 'string', + ) if (!matchablePatterns.length) { matchablePatterns.push(...DEFAULT_JEST_TEST_MATCH) } @@ -394,7 +393,7 @@ export class ConfigSet { } = this if (babelConfig == null) { this.logger.debug('babel is disabled') - return + return undefined } let base: BabelConfig = { cwd: this.cwd } if (babelConfig.kind === 'file') { @@ -433,7 +432,7 @@ export class ConfigSet { @Memoize() get babelJestTransformer(): BabelJestTransformer | undefined { const { babel } = this - if (!babel) return + if (!babel) return undefined this.logger.debug('creating babel-jest transformer') return importer.babelJest(ImportReasons.BabelJest).createTransformer(babel) as BabelJestTransformer } @@ -495,7 +494,7 @@ export class ConfigSet { return false } - return ignoreCodes.indexOf(diagnostic.code) === -1 + return !ignoreCodes.includes(diagnostic.code) }) } } @@ -534,7 +533,7 @@ export class ConfigSet { * @internal */ @Memoize() - get createTsError(): (diagnostics: ReadonlyArray) => TSError { + get createTsError(): (diagnostics: readonly Diagnostic[]) => TSError { const { diagnostics: { pretty }, } = this.tsJest @@ -549,7 +548,7 @@ export class ConfigSet { getCanonicalFileName: path => path, } - return (diagnostics: ReadonlyArray) => { + return (diagnostics: readonly Diagnostic[]) => { const diagnosticText = formatDiagnostics(diagnostics, diagnosticHost) const diagnosticCodes = diagnostics.map(x => x.code) return new TSError(diagnosticText, diagnosticCodes) @@ -563,7 +562,7 @@ export class ConfigSet { get tsCacheDir(): string | undefined { if (!this.jest.cache) { logger.debug('file caching disabled') - return + return undefined } const cacheSuffix = sha1( stringify({ @@ -635,6 +634,7 @@ export class ConfigSet { * Use by e2e, don't mark as internal */ @Memoize() + // eslint-disable-next-line class-methods-use-this get tsJestDigest(): string { return MY_DIGEST } @@ -704,6 +704,7 @@ export class ConfigSet { /** * Load TypeScript configuration. Returns the parsed TypeScript config and * any `tsConfig` options specified in ts-jest tsConfig + * * @internal */ readTsConfig( @@ -758,7 +759,7 @@ export class ConfigSet { } // check the module interoperability - const target = finalOptions.target! + const target = finalOptions.target // compute the default if not set const defaultModule = [ts.ScriptTarget.ES3, ts.ScriptTarget.ES5].includes(target) ? ts.ModuleKind.CommonJS diff --git a/src/index.spec.ts b/src/index.spec.ts index a853a439ed..4705cfefec 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -1,4 +1,3 @@ -// tslint:disable:max-line-length import { testing } from 'bs-logger' import * as tsJest from '.' diff --git a/src/index.ts b/src/index.ts index d9512569f6..9b427c9329 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,7 +23,6 @@ export const createJestPreset = helperMoved('createJestPreset', createJestPreset /** @deprecated */ export const pathsToModuleNameMapper = helperMoved('pathsToModuleNameMapper', pathsToModuleNameMapperCore) -// tslint:disable-next-line:no-var-requires export const version: string = require('../package.json').version export const digest: string = readFileSync(resolve(__dirname, '..', '.ts-jest-digest'), 'utf8') @@ -61,12 +60,10 @@ const jestPreset = createJestPresetCore() * @internal */ // for tests -// tslint:disable-next-line:variable-name export const __singleton = () => transformer /** * @internal */ -// tslint:disable-next-line:variable-name export const __resetModule = () => (transformer = undefined as any) export { diff --git a/src/transformers/hoist-jest.spec.ts b/src/transformers/hoist-jest.spec.ts index 1f2cbd6cda..741352cbf7 100644 --- a/src/transformers/hoist-jest.spec.ts +++ b/src/transformers/hoist-jest.spec.ts @@ -37,9 +37,7 @@ const func2 = () => { } ` const logger = testing.createLoggerMock() -const createFactory = () => { - return hoist.factory({ logger, compilerModule: tsc } as any) -} +const createFactory = () => hoist.factory({ logger, compilerModule: tsc } as any) const transpile = (source: string) => tsc.transpileModule(source, { transformers: { before: [createFactory()] } }) describe('hoisting', () => { diff --git a/src/transformers/hoist-jest.ts b/src/transformers/hoist-jest.ts index 8fdd95747a..3dfedf3af2 100644 --- a/src/transformers/hoist-jest.ts +++ b/src/transformers/hoist-jest.ts @@ -1,4 +1,3 @@ -// tslint:disable:curly // take care of including ONLY TYPES here, for the rest use `ts` import { LogContexts, LogLevels } from 'bs-logger' import { @@ -31,6 +30,7 @@ export const version = 1 /** * The factory of hoisting transformer factory + * * @param cs Current jest configuration-set * @internal */ @@ -54,6 +54,7 @@ export function factory(cs: ConfigSet) { /** * Checks whether given node is a statement that we need to hoist + * * @param node The node to test */ function shouldHoistNode(node: Node): node is ExpressionStatement { @@ -62,6 +63,7 @@ export function factory(cs: ConfigSet) { /** * Create a source file visitor which will visit all nodes in a source file + * * @param ctx The typescript transformation context * @param sf The owning source file */ @@ -90,6 +92,7 @@ export function factory(cs: ConfigSet) { const exit = () => level-- /** * Adds a node to the list of nodes to be hoisted in the current level + * * @param node The node to hoist */ const hoist = (node: Statement) => { @@ -101,6 +104,7 @@ export function factory(cs: ConfigSet) { } /** * Our main visitor, which will be called recursively for each node in the source file's AST + * * @param node The node to be visited */ const visitor: Visitor = node => { @@ -136,11 +140,10 @@ export function factory(cs: ConfigSet) { } // returns the transformer factory - return (ctx: TransformationContext): Transformer => { - return logger.wrap( + return (ctx: TransformationContext): Transformer => + logger.wrap( { [LogContexts.logLevel]: LogLevels.debug, call: null }, 'visitSourceFileNode(): hoisting', (sf: SourceFile) => ts.visitNode(sf, createVisitor(ctx, sf)), ) - } } diff --git a/src/ts-jest-transformer.spec.ts b/src/ts-jest-transformer.spec.ts index 114afc158c..1a7e9b04b9 100644 --- a/src/ts-jest-transformer.spec.ts +++ b/src/ts-jest-transformer.spec.ts @@ -167,7 +167,7 @@ Array [ it('should return stringified version of file', () => { config.shouldStringifyContent.mockImplementation(() => true) - expect(process()).toMatchInlineSnapshot(`"module.exports=\\"export default \\\\\\"foo\\\\\\"\\""`) + expect(process()).toMatchInlineSnapshot('"module.exports=\\"export default \\\\\\"foo\\\\\\"\\""') }) it('should warn when trying to process js but allowJs is false', () => { diff --git a/src/ts-jest-transformer.ts b/src/ts-jest-transformer.ts index 9c1f49623e..df8204931a 100644 --- a/src/ts-jest-transformer.ts +++ b/src/ts-jest-transformer.ts @@ -78,7 +78,7 @@ export class TsJestTransformer implements Transformer { const jestConfigObj: Config.ProjectConfig = jestConfig // create the new record in the index - this.logger.info(`no matching config-set found, creating a new one`) + this.logger.info('no matching config-set found, creating a new one') const configSet = new ConfigSet(jestConfigObj, this.options, this.logger) TsJestTransformer._configSetsIndex.push({ diff --git a/src/types.ts b/src/types.ts index 8118577fdc..89d32844c5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -34,6 +34,7 @@ export interface TsJestGlobalOptions { * - `false`: do NOT use default config file * - `path/to/tsconfig.json`: path to a specific tsconfig file ( can be used) * - `{...}`: an object with inline compiler options + * * @default undefined uses the default tsconfig file * @alias tsconfig */ @@ -45,6 +46,7 @@ export interface TsJestGlobalOptions { * - `false`: do NOT use default config file * - `path/to/tsconfig.json`: path to a specific tsconfig file ( can be used) * - `{...}`: an object with inline compiler options + * * @default undefined uses the default tsconfig file * @alias tsConfig */ @@ -55,18 +57,21 @@ export interface TsJestGlobalOptions { * - `true` (or `undefined`, it's the default): use default package.json file * - `path/to/package.json`: path to a specific package.json file ( can be used) * - `{...}`: contents of a package.json + * * @default undefined uses the default package.json file */ packageJson?: boolean | string | object /** * Compiles files as isolated modules (disables some features and type-checking) + * * @default undefined (disabled) */ isolatedModules?: boolean /** * Compiler to use + * * @default 'typescript' */ compiler?: string @@ -81,6 +86,7 @@ export interface TsJestGlobalOptions { * - `true` (or `undefined`, it's the default): show all diagnostics * - `false`: hide diagnostics of all files (kind of useless) * - `{...}`: an inline object with fine grained settings + * * @default undefined shows all diagnostics */ diagnostics?: @@ -88,12 +94,14 @@ export interface TsJestGlobalOptions { | { /** * Enables colorful and pretty output of errors + * * @default undefined (enabled) */ pretty?: boolean /** * List of TypeScript diagnostic error codes to ignore * [here](https://github.com/Microsoft/TypeScript/blob/master/src/compiler/diagnosticMessages.json). + * * @see https://github.com/Microsoft/TypeScript/blob/master/src/compiler/diagnosticMessages.json * @default [6059,18002,18003] */ @@ -105,6 +113,7 @@ export interface TsJestGlobalOptions { pathRegex?: RegExp | string /** * Logs TypeScript errors to stderr instead of throwing exceptions + * * @default undefined (disabled) */ warnOnly?: boolean @@ -116,6 +125,7 @@ export interface TsJestGlobalOptions { * - `true`: use babel using default babelrc file * - `path/to/.babelrc`: path to a babelrc file ( can be used) * - `{...}`: an object with inline babel options + * * @default undefined does NOT use babel */ babelConfig?: boolean | string | BabelConfig @@ -202,12 +212,14 @@ export interface TsCompiler { /** * Internal source output. + * * @internal */ export type SourceOutput = [string, string] /** * Track the project information. + * * @internal */ export interface MemoryCache { diff --git a/src/util/backports.spec.ts b/src/util/backports.spec.ts index 5bed89de4f..e2964e6cbd 100644 --- a/src/util/backports.spec.ts +++ b/src/util/backports.spec.ts @@ -20,11 +20,11 @@ describe('backportJestConfig', () => { set(original, oldPath, val) }) describe(`with "${oldPath}" set to ${inspect(val)}`, () => { - it(`should wran the user`, () => { + it('should wran the user', () => { backportJestConfig(logger, original) expect(logTarget.lines.warn).toMatchSnapshot() }) // should warn the user - it(`should have changed the config correctly`, () => { + it('should have changed the config correctly', () => { expect(original).toMatchSnapshot('before') expect(backportJestConfig(logger, original)).toMatchSnapshot('migrated') }) // should have changed the config diff --git a/src/util/backports.ts b/src/util/backports.ts index 66530daf25..4e625c429c 100644 --- a/src/util/backports.ts +++ b/src/util/backports.ts @@ -15,7 +15,7 @@ export const backportJestConfig = { @@ -120,7 +120,7 @@ export const backportTsJestDebugEnvVar = (logger: Logger) => { const shouldLog = !/^\s*(?:0|f(?:alse)?|no?|disabled?|off|)\s*$/i.test(process.env.TS_JEST_DEBUG || '') delete process.env.TS_JEST_DEBUG if (shouldLog) { - process.env.TS_JEST_LOG = `ts-jest.log,stderr:warn` + process.env.TS_JEST_LOG = 'ts-jest.log,stderr:warn' } logger.warn( context, diff --git a/src/util/importer.spec.ts b/src/util/importer.spec.ts index a326005c71..556c8e63cd 100644 --- a/src/util/importer.spec.ts +++ b/src/util/importer.spec.ts @@ -1,4 +1,3 @@ -// tslint:disable:max-line-length import * as fakers from '../__helpers__/fakers' import { Importer, __requireModule } from './importer' diff --git a/src/util/importer.ts b/src/util/importer.ts index d5ee5bc0e5..63a230735c 100644 --- a/src/util/importer.ts +++ b/src/util/importer.ts @@ -59,7 +59,6 @@ export class Importer { let name: string let loaded: RequireResult | undefined const tries = [moduleName, ...fallbacks] - // tslint:disable-next-line:no-conditional-assignment while ((name = tries.shift() as string) !== undefined) { const req = requireWrapper(name) @@ -92,7 +91,9 @@ export class Importer { } tryTheseOr(moduleNames: [string, ...string[]] | string, missingResult: T, allowLoadError?: boolean): T + // eslint-disable-next-line no-dupe-class-members tryTheseOr(moduleNames: [string, ...string[]] | string, missingResult?: T, allowLoadError?: boolean): T | undefined + // eslint-disable-next-line no-dupe-class-members tryTheseOr(moduleNames: [string, ...string[]] | string, missingResult?: T, allowLoadError = false): T | undefined { const args: [string, ...string[]] = Array.isArray(moduleNames) ? moduleNames : [moduleNames] const result = this.tryThese(...args) @@ -132,9 +133,7 @@ export class Importer { installTip = [{ module: installTip, label: `install "${installTip}"` }] } const fix = installTip - .map(tip => { - return ` ${installTip.length === 1 ? '↳' : '•'} ${interpolate(Helps.FixMissingModule, tip)}` - }) + .map(tip => ` ${installTip.length === 1 ? '↳' : '•'} ${interpolate(Helps.FixMissingModule, tip)}`) .join('\n') throw new Error( diff --git a/src/util/json.ts b/src/util/json.ts index 956b5d4040..ce6b84ead7 100644 --- a/src/util/json.ts +++ b/src/util/json.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-redeclare */ import stableStringify = require('fast-json-stable-stringify') const UNDEFINED = 'undefined' @@ -38,7 +39,7 @@ export function normalize(input: string, { parse: parser = parse }: NormalizeOpt /** * @internal */ -// tslint:disable-next-line:no-namespace +// eslint-disable-next-line @typescript-eslint/no-namespace export namespace normalize { export const cache = new Map() } diff --git a/src/util/memoize.ts b/src/util/memoize.ts index f1d10997b2..852b7fc87b 100644 --- a/src/util/memoize.ts +++ b/src/util/memoize.ts @@ -39,7 +39,7 @@ function memoize( return function(this: any, ...args: any[]): any { const cache = ensureChildCache(this, namespace) const key = keyBuilder.apply(this, args) - if (cache.has(key)) return cache.get(key) as any // tslint:disable-line + if (cache.has(key)) return cache.get(key) const res: any = func.apply(this, args) cache.set(key, res) return res diff --git a/src/util/messages.ts b/src/util/messages.ts index 6bd9d2f2c9..648ccc9720 100644 --- a/src/util/messages.ts +++ b/src/util/messages.ts @@ -1,5 +1,3 @@ -// tslint:disable:max-line-length - /** * @internal */ @@ -53,5 +51,6 @@ export const enum ImportReasons { * @internal */ export function interpolate(msg: string, vars: Record = {}): string { + // eslint-disable-next-line no-useless-escape return msg.replace(/\{\{([^\}]+)\}\}/g, (_, key) => (key in vars ? vars[key] : _)) } diff --git a/src/util/ts-error.ts b/src/util/ts-error.ts index 241d348d41..75c741ac88 100644 --- a/src/util/ts-error.ts +++ b/src/util/ts-error.ts @@ -13,6 +13,7 @@ export const INSPECT_CUSTOM = inspect.custom || 'inspect' /** * TypeScript diagnostics error. + * * @internal */ export class TSError extends BaseError { diff --git a/src/util/version-checkers.spec.ts b/src/util/version-checkers.spec.ts index 54c4eceb47..5ccc42d52f 100644 --- a/src/util/version-checkers.spec.ts +++ b/src/util/version-checkers.spec.ts @@ -1,4 +1,3 @@ -// tslint:disable:max-line-length import { mocked } from '../../utils' import { logTargetMock } from '../__helpers__/mocks' @@ -37,18 +36,18 @@ function describeChecker( pv.getPackageVersion.mockImplementation(name => (name === moduleName ? testVersion : undefined)) }) - it(`should log with warn()`, () => { + it('should log with warn()', () => { checker.warn() const warnings = logTarget.messages.warn expect(warnings).toHaveLength(1) expect(warnings[0].message).toMatch(testVersion ? 'has not been tested with ts-jest' : 'is not installed') }) - it(`should log only once with warn()`, () => { + it('should log only once with warn()', () => { checker.warn() checker.warn() expect(logTarget.messages.warn).toHaveLength(1) }) - it(`should throw with raise()`, () => { + it('should throw with raise()', () => { expect(checker.raise).toThrow() // adds another time as it should throw all the time even if already called expect(checker.raise).toThrow() @@ -61,11 +60,11 @@ function describeChecker( beforeEach(() => { pv.getPackageVersion.mockImplementation(name => (name === moduleName ? testVersion : undefined)) }) - it(`should not log with warn()`, () => { + it('should not log with warn()', () => { checker.warn() expect(logTarget.messages.warn).toHaveLength(0) }) - it(`should not throw with raise()`, () => { + it('should not throw with raise()', () => { expect(checker.raise).not.toThrow() }) }) // describe supported version diff --git a/src/util/version-checkers.ts b/src/util/version-checkers.ts index 83c6231df1..e168f385b0 100644 --- a/src/util/version-checkers.ts +++ b/src/util/version-checkers.ts @@ -28,7 +28,6 @@ export interface VersionChecker { /** * @internal */ -// tslint:disable-next-line:variable-name export const VersionCheckers = { jest: createVersionChecker('jest', ExpectedVersions.Jest), typescript: createVersionChecker('typescript', ExpectedVersions.TypeScript), diff --git a/tsconfig.json b/tsconfig.json index aac3940f77..e2ad22c216 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -31,11 +31,14 @@ "react" ] }, - "include": [], - "exclude": [ - "e2e/__cases__", - "e2e/__templates__", - "e2e/__workdir_synlink__", - "node_modules" - ] + "include": [ + "e2e/__helpers__", + "e2e/__serializers__", + "e2e/__tests__", + "scripts/", + "src/", + "utils/", + "presets", + "./*.js" + ], } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 7669513b00..0000000000 --- a/tslint.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "extends": [ - "tslint:recommended", - "tslint-config-prettier", - "tslint-plugin-prettier" - ], - "linterOptions": { - "exclude": [ - "package.json", - "dist/**/*", - "**/node_modules/**/*", - "e2e/__cases__/**/*" - ] - }, - "rules": { - "arrow-return-shorthand": [ - true - ], - "class-name": true, - "curly": [ - true, - "ignore-same-line" - ], - "encoding": true, - "interface-name": [ - false - ], - "interface-over-type-literal": true, - "max-classes-per-file": false, - "member-access": [ - true, - "no-public" - ], - "no-bitwise": false, - "no-boolean-literal-compare": true, - "no-duplicate-imports": true, - "no-empty": [ - true, - "allow-empty-catch" - ], - "no-empty-interface": false, - "no-for-in-array": true, - "no-inferrable-types": true, - "no-invalid-template-strings": true, - "no-return-await": true, - "no-shadowed-variable": false, - "no-string-throw": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "ordered-imports": [ - true, - { - "grouped-imports": true, - "import-sources-order": "lowercase-last", - "named-imports-order": "lowercase-last" - } - ], - "prefer-const": true, - "prefer-for-of": false, - "prefer-function-over-method": true, - "prefer-object-spread": true, - "prefer-readonly": true, - "prefer-template": true, - "prettier": true, - "semicolon": [ - true, - "never" - ], - "switch-default": true, - "variable-name": [ - true, - "allow-leading-underscore", - "ban-keywords", - "check-format", - "allow-pascal-case" - ] - } -} From 452639242d7f59502bda7aa94b81735f9c9ad203 Mon Sep 17 00:00:00 2001 From: Ahn Date: Mon, 4 May 2020 17:40:52 +0200 Subject: [PATCH 10/12] feat(config): define 'ts-jest' on `ConfigGlobals` interface of `@jest/types` (#1592) --- docs/user/config/index.md | 17 +++++++++++++++++ e2e/__helpers__/test-case/runtime.ts | 2 +- package-lock.json | 17 ++++------------- src/index.ts | 9 +++++++++ 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/docs/user/config/index.md b/docs/user/config/index.md index 5e06e4fba9..55faf32029 100644 --- a/docs/user/config/index.md +++ b/docs/user/config/index.md @@ -181,6 +181,23 @@ module.exports = { +#### IDE `ts-jest` config suggestion + +To ultilize IDE suggestion, you can use `JSDOC` to provide suggested `ts-jest` configs for your Jest config: + +```js +/** @type {import('@jest/types').Config.InitialOptions} */ +/** @typedef {import('ts-jest')} */ +module.exports = { + // [...] + globals: { + 'ts-jest': { + // ts-jest configuration goes here and your IDE will suggest which configs when typing + } + } +}; +``` + ### Options All options have default values which should fit most of the projects. Click on the option's name to see details and example(s). diff --git a/e2e/__helpers__/test-case/runtime.ts b/e2e/__helpers__/test-case/runtime.ts index 3e4bdb5f7f..78fbeae94d 100644 --- a/e2e/__helpers__/test-case/runtime.ts +++ b/e2e/__helpers__/test-case/runtime.ts @@ -92,7 +92,7 @@ export function run(name: string, options: RunTestOptions = {}): RunResult { merge(extraConfig, options.jestConfig) } if (options.tsJestConfig) { - const globalConfig: any = extraConfig.globals || (extraConfig.globals = {}) + const globalConfig: any = extraConfig.globals || (extraConfig.globals = {'ts-jest': {}}) const tsJestConfig = globalConfig['ts-jest'] || (globalConfig['ts-jest'] = {}) merge(tsJestConfig, options.tsJestConfig) } diff --git a/package-lock.json b/package-lock.json index efc8ed5c8d..4d4dff514d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4978,12 +4978,6 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", @@ -8451,13 +8445,10 @@ "dev": true }, "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "run-node": { "version": "1.0.0", diff --git a/src/index.ts b/src/index.ts index 9b427c9329..461eb04e88 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,6 +11,15 @@ import { Deprecateds, interpolate } from './util/messages' import { mocked as mockedCore } from './util/testing' import { VersionCheckers } from './util/version-checkers' +declare module '@jest/types' { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Config { + interface ConfigGlobals { + 'ts-jest': TsJestGlobalOptions + } + } +} + // deprecate helpers const warn = rootLogger.child({ [LogContexts.logLevel]: LogLevels.warn }) const helperMoved = any>(name: string, helper: T) => From b032d5d85a99718f5eb78806ad00ace45df4d9e1 Mon Sep 17 00:00:00 2001 From: Ahn Date: Tue, 5 May 2020 15:38:19 +0200 Subject: [PATCH 11/12] build(deps-dev): organize dependencies' versions consistently (#1596) --- package-lock.json | 126 +++++++++++++++++++--------------------------- package.json | 13 +++-- 2 files changed, 58 insertions(+), 81 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d4dff514d..169608bb0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1621,15 +1621,6 @@ "csstype": "^2.2.0" } }, - "@types/resolve": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.14.0.tgz", - "integrity": "sha512-bmjNBW6tok+67iOsASeYSJxSgY++BIR35nGyGLORTDirhra9reJ0shgGL3U7KPDUbOBCx8JrlCjd4d/y5uiMRQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/semver": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.1.0.tgz", @@ -1661,73 +1652,45 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz", - "integrity": "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.31.0.tgz", + "integrity": "sha512-iIC0Pb8qDaoit+m80Ln/aaeu9zKQdOLF4SHcGLarSeY1gurW6aU4JsOPMjKQwXlw70MvWKZQc6S2NamA8SJ/gg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.30.0", + "@typescript-eslint/experimental-utils": "2.31.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" - }, - "dependencies": { - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } } }, "@typescript-eslint/experimental-utils": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz", - "integrity": "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", + "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.30.0", + "@typescript-eslint/typescript-estree": "2.31.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - } } }, "@typescript-eslint/parser": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz", - "integrity": "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.31.0.tgz", + "integrity": "sha512-uph+w6xUOlyV2DLSC6o+fBDzZ5i7+3/TxAsH4h3eC64tlga57oMb96vVlXoMwjR/nN+xyWlsnxtbDkB46M2EPQ==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.30.0", - "@typescript-eslint/typescript-estree": "2.30.0", + "@typescript-eslint/experimental-utils": "2.31.0", + "@typescript-eslint/typescript-estree": "2.31.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz", - "integrity": "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", + "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", "dev": true, "requires": { "debug": "^4.1.1", @@ -1758,15 +1721,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } } } }, @@ -3464,6 +3418,21 @@ "dev": true } } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true } } }, @@ -3485,18 +3454,18 @@ } }, "eslint-plugin-jest": { - "version": "23.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz", - "integrity": "sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==", + "version": "23.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.9.0.tgz", + "integrity": "sha512-8mt5xJQIFh33W5nE7vCikkDTE4saTo08V91KjU6yI5sLQ9e8Jkp1OXkWJoIHLheFqY5OXIZdAjZmNYHSJ3IpzQ==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^2.5.0" } }, "eslint-plugin-jsdoc": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-24.0.0.tgz", - "integrity": "sha512-AGAc9PYpramsJGVmqtxnXBYlq+AMh+hIZdbJ52OLvyJS3f+PaT/PzuckRFOLnth2uhCDv4IjgsB3r5jUFWqUnw==", + "version": "24.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-24.0.2.tgz", + "integrity": "sha512-tvk/jPpIP6MBVZETYnurKL/VGKzSinSbhpz1x+CzDOX20bmhRnCiexrgre4xF0WD/feg7ARKTVLCygVB3pfG5Q==", "dev": true, "requires": { "comment-parser": "^0.7.2", @@ -3536,9 +3505,9 @@ } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -8244,9 +8213,9 @@ } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "regextras": { @@ -9449,6 +9418,15 @@ "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/package.json b/package.json index e34d1b6d5c..e58dc5ab3a 100644 --- a/package.json +++ b/package.json @@ -98,19 +98,18 @@ "@types/mkdirp": "latest", "@types/node": "10.x", "@types/react": "16.x", - "@types/resolve": "latest", "@types/semver": "latest", "@types/yargs": "latest", "@types/yargs-parser": "15.x", - "@typescript-eslint/eslint-plugin": "^2.30.0", - "@typescript-eslint/parser": "^2.30.0", + "@typescript-eslint/eslint-plugin": "latest", + "@typescript-eslint/parser": "latest", "conventional-changelog-cli": "2.x", "cross-spawn": "latest", "eslint": "latest", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-jest": "^23.8.2", - "eslint-plugin-jsdoc": "^24.0.0", - "eslint-plugin-prettier": "^3.1.3", + "eslint-config-prettier": "latest", + "eslint-plugin-jest": "latest", + "eslint-plugin-jsdoc": "latest", + "eslint-plugin-prettier": "latest", "fs-extra": "8.x", "glob-gitignore": "latest", "husky": "3.x", From 45502b692da2d6c6d4a720a2a51f3aad23419b91 Mon Sep 17 00:00:00 2001 From: Ahn Date: Tue, 5 May 2020 18:23:03 +0200 Subject: [PATCH 12/12] chore(release): update CHANGELOG and version for 25.5.0 --- CHANGELOG.md | 42 ++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e1801c300..88625c996c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,45 @@ + +# [25.5.0](https://github.com/kulshekhar/ts-jest/compare/v25.4.0...v25.5.0) (2020-05-05) + + +### Bug Fixes + +* **compiler:** make `projectReferences` work with `isolatedModules: false` ([#1541](https://github.com/kulshekhar/ts-jest/issues/1541)) ([3e8efbe](https://github.com/kulshekhar/ts-jest/commit/3e8efbe)) +* **compiler:** allow using `files` provided by `tsconfig` ([#1562](https://github.com/kulshekhar/ts-jest/issues/1562)) ([a9f02bd](https://github.com/kulshekhar/ts-jest/commit/a9f02bd)) +* **config:** verify `testMatchPatterns` contain RegExp instance or string type values ([#1569](https://github.com/kulshekhar/ts-jest/issues/1569)) ([7f85bab](https://github.com/kulshekhar/ts-jest/commit/7f85bab)) + + +### Features + +* **config:** add `tsconfig` alias to `tsConfig` option ([#1565](https://github.com/kulshekhar/ts-jest/issues/1565)) ([c10eb6d](https://github.com/kulshekhar/ts-jest/commit/c10eb6d)) +* **config:** define 'ts-jest' on `ConfigGlobals` interface of `@jest/types` ([#1592](https://github.com/kulshekhar/ts-jest/issues/1592)) ([4526392](https://github.com/kulshekhar/ts-jest/commit/4526392)) + + +### Performance Improvements + +* **compiler:** don’t write compile output to file system but rely on jest cache ([#1561](https://github.com/kulshekhar/ts-jest/issues/1561)) ([d11a4ea](https://github.com/kulshekhar/ts-jest/commit/d11a4ea)) +* **compiler:** improve performance for `isolatedModules: false` ([#1558](https://github.com/kulshekhar/ts-jest/issues/1558)) ([85c09e3](https://github.com/kulshekhar/ts-jest/commit/85c09e3)) + + +### BREAKING CHANGES + +* Any custom typing files or files which are needed to be compiled and intended to use with `jest` need to be defined in `files` option of `tsconfig`. + +For example: +``` +// tsconfig.json +{ + // ...other configs + "files": [ + "my-custom-typings.d.ts". + "my-global-module.ts" + ] +} +``` +* **compiler:** `incremental` and `compilerHost` options are no longer available. Please remove it from your `ts-jest` config. + + + # [25.5.0-beta.0](https://github.com/kulshekhar/ts-jest/compare/v25.5.0-alpha.0...v25.5.0-beta.0) (2020-04-29) diff --git a/package.json b/package.json index e58dc5ab3a..4806599065 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-jest", - "version": "25.5.0-beta.0", + "version": "25.5.0", "main": "dist/index.js", "types": "dist/index.d.ts", "bin": "cli.js",