From 30d9307d572be320035137086634d0d5b2a7b2e7 Mon Sep 17 00:00:00 2001 From: RasPhilCo Date: Fri, 22 Nov 2019 13:12:57 -0800 Subject: [PATCH] chore: tslint -> eslint (#92) --- .eslintrc | 8 +- package.json | 12 +- src/command.ts | 99 ++--- src/config.ts | 274 ++++++++----- src/debug.ts | 4 +- src/hooks.ts | 36 +- src/index.ts | 6 +- src/manifest.ts | 4 +- src/pjson.ts | 112 +++--- src/plugin.ts | 209 +++++----- src/screen.ts | 4 +- src/topic.ts | 6 +- src/ts-node.ts | 67 ++-- src/util.ts | 18 +- test/config.test.ts | 143 +++---- test/test.ts | 2 +- test/ts-node.test.ts | 58 +-- test/typescript.test.ts | 28 +- tslint.json | 8 - yarn.lock | 862 ++++++++++++++++++++++++++++++++-------- 20 files changed, 1299 insertions(+), 661 deletions(-) delete mode 100644 tslint.json diff --git a/.eslintrc b/.eslintrc index e56091ba..7c4a11dc 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,3 +1,9 @@ { - "extends": "oclif" + "extends": [ + "oclif", + "oclif-typescript" + ], + "rules": { + "unicorn/no-abusive-eslint-disable": "off" + } } diff --git a/package.json b/package.json index 026150f9..20d55549 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "tslib": "^1.9.3" }, "devDependencies": { - "@oclif/tslint": "^3.1.1", "@types/chai": "^4.1.7", "@types/indent-string": "^3.2.0", "@types/lodash": "^4.14.123", @@ -21,13 +20,15 @@ "@types/wrap-ansi": "^3.0.0", "chai": "^4.2.0", "conventional-changelog-cli": "^2.0.21", + "eslint": "^6.6.0", + "eslint-config-oclif": "^3.1.0", + "eslint-config-oclif-typescript": "^0.1.0", "fancy-test": "^1.4.3", "globby": "^9.2.0", "lodash": "^4.17.11", "mocha": "^6.1.4", "proxyquire": "^2.1.0", "ts-node": "^8.1.0", - "tslint": "^5.16.0", "typescript": "^3.4.5" }, "engines": { @@ -45,11 +46,12 @@ "repository": "oclif/config", "scripts": { "build": "rm -rf lib && tsc", - "lint": "tsc -p test --noEmit && tslint -p test", - "posttest": "yarn run lint", + "lint": "eslint . --ext .ts --config .eslintrc", + "posttest": "yarn lint", "prepack": "yarn run build", "test": "mocha --forbid-only \"test/**/*.test.ts\"", - "version": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0 && git add CHANGELOG.md" + "version": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0 && git add CHANGELOG.md", + "pretest": "tsc -p test --noEmit" }, "types": "lib/index.d.ts" } diff --git a/src/command.ts b/src/command.ts index c335fd8a..18ca5c28 100644 --- a/src/command.ts +++ b/src/command.ts @@ -4,82 +4,83 @@ import * as Config from '.' import {mapValues} from './util' export interface Command { - id: string - hidden: boolean - aliases: string[] - description?: string - usage?: string | string[] - examples?: string[] - type?: string - pluginName?: string - pluginType?: string - flags: {[name: string]: Command.Flag} - args: Command.Arg[] + id: string; + hidden: boolean; + aliases: string[]; + description?: string; + usage?: string | string[]; + examples?: string[]; + type?: string; + pluginName?: string; + pluginType?: string; + flags: {[name: string]: Command.Flag}; + args: Command.Arg[]; } export namespace Command { export interface Arg { - name: string - description?: string - required?: boolean - hidden?: boolean - default?: string - options?: string[] + name: string; + description?: string; + required?: boolean; + hidden?: boolean; + default?: string; + options?: string[]; } export type Flag = Flag.Boolean | Flag.Option export namespace Flag { export interface Boolean { - type: 'boolean' - name: string - required?: boolean - char?: string - hidden?: boolean - description?: string - helpLabel?: string - allowNo?: boolean + type: 'boolean'; + name: string; + required?: boolean; + char?: string; + hidden?: boolean; + description?: string; + helpLabel?: string; + allowNo?: boolean; } export interface Option { - type: 'option' - name: string - required?: boolean - char?: string - hidden?: boolean - description?: string - helpLabel?: string - helpValue?: string - default?: string - options?: string[] + type: 'option'; + name: string; + required?: boolean; + char?: string; + hidden?: boolean; + description?: string; + helpLabel?: string; + helpValue?: string; + default?: string; + options?: string[]; } } export interface Base { - _base: string - id: string - hidden: boolean - aliases: string[] - description?: string - usage?: string | string[] - examples?: string[] + _base: string; + id: string; + hidden: boolean; + aliases: string[]; + description?: string; + usage?: string | string[]; + examples?: string[]; } export interface Class extends Base { - plugin?: Config.IPlugin - flags?: Parser.flags.Input - args?: Parser.args.Input - new(argv: string[], config: Config.IConfig): Instance - run(argv?: string[], config?: Config.LoadOptions): PromiseLike + plugin?: Config.IPlugin; + flags?: Parser.flags.Input; + args?: Parser.args.Input; + new(argv: string[], config: Config.IConfig): Instance; + run(argv?: string[], config?: Config.LoadOptions): PromiseLike; } export interface Instance { - _run(argv: string[]): Promise + _run(argv: string[]): Promise; } export interface Plugin extends Command { - load(): Class + load(): Class; } + // eslint-disable-next-line no-inner-declarations export function toCached(c: Class, plugin?: Config.Plugin): Command { return { id: c.id, diff --git a/src/config.ts b/src/config.ts index 75f2b912..5fb2f836 100644 --- a/src/config.ts +++ b/src/config.ts @@ -17,118 +17,120 @@ import {compact, flatMap, loadJSON, uniq} from './util' export type PlatformTypes = 'darwin' | 'linux' | 'win32' | 'aix' | 'freebsd' | 'openbsd' | 'sunos' export type ArchTypes = 'arm' | 'arm64' | 'mips' | 'mipsel' | 'ppc' | 'ppc64' | 's390' | 's390x' | 'x32' | 'x64' | 'x86' export interface Options extends Plugin.Options { - devPlugins?: boolean - userPlugins?: boolean - channel?: string - version?: string + devPlugins?: boolean; + userPlugins?: boolean; + channel?: string; + version?: string; } +// eslint-disable-next-line new-cap const debug = Debug() +// eslint-disable-next-line @typescript-eslint/interface-name-prefix export interface IConfig { - name: string - version: string - channel: string - pjson: PJSON.CLI - root: string + name: string; + version: string; + channel: string; + pjson: PJSON.CLI; + root: string; /** * process.arch */ - arch: ArchTypes + arch: ArchTypes; /** * bin name of CLI command */ - bin: string + bin: string; /** * cache directory to use for CLI * * example ~/Library/Caches/mycli or ~/.cache/mycli */ - cacheDir: string + cacheDir: string; /** * config directory to use for CLI * * example: ~/.config/mycli */ - configDir: string + configDir: string; /** * data directory to use for CLI * * example: ~/.local/share/mycli */ - dataDir: string + dataDir: string; /** * base dirname to use in cacheDir/configDir/dataDir */ - dirname: string + dirname: string; /** * points to a file that should be appended to for error logs * * example: ~/Library/Caches/mycli/error.log */ - errlog: string + errlog: string; /** * path to home directory * * example: /home/myuser */ - home: string + home: string; /** * process.platform */ - platform: PlatformTypes + platform: PlatformTypes; /** * active shell */ - shell: string + shell: string; /** * user agent to use for http calls * * example: mycli/1.2.3 (darwin-x64) node-9.0.0 */ - userAgent: string + userAgent: string; /** * if windows */ - windows: boolean + windows: boolean; /** * debugging level * * set by ${BIN}_DEBUG or DEBUG=$BIN */ - debug: number + debug: number; /** * npm registry to use for installing plugins */ - npmRegistry?: string - userPJSON?: PJSON.User - plugins: Plugin.IPlugin[] - binPath?: string - valid: boolean - readonly commands: Command.Plugin[] - readonly topics: Topic[] - readonly commandIDs: string[] - - runCommand(id: string, argv?: string[]): Promise - runHook>(event: K, opts: T[K]): Promise - findCommand(id: string, opts: {must: true}): Command.Plugin - findCommand(id: string, opts?: {must: boolean}): Command.Plugin | undefined - findTopic(id: string, opts: {must: true}): Topic - findTopic(id: string, opts?: {must: boolean}): Topic | undefined - scopedEnvVar(key: string): string | undefined - scopedEnvVarKey(key: string): string - scopedEnvVarTrue(key: string): boolean - s3Url(key: string): string - s3Key(type: 'versioned' | 'unversioned', ext: '.tar.gz' | '.tar.xz', options?: IConfig.s3Key.Options): string - s3Key(type: keyof PJSON.S3.Templates, options?: IConfig.s3Key.Options): string + npmRegistry?: string; + userPJSON?: PJSON.User; + plugins: Plugin.IPlugin[]; + binPath?: string; + valid: boolean; + readonly commands: Command.Plugin[]; + readonly topics: Topic[]; + readonly commandIDs: string[]; + + runCommand(id: string, argv?: string[]): Promise; + runHook>(event: K, opts: T[K]): Promise; + findCommand(id: string, opts: {must: true}): Command.Plugin; + findCommand(id: string, opts?: {must: boolean}): Command.Plugin | undefined; + findTopic(id: string, opts: {must: true}): Topic; + findTopic(id: string, opts?: {must: boolean}): Topic | undefined; + scopedEnvVar(key: string): string | undefined; + scopedEnvVarKey(key: string): string; + scopedEnvVarTrue(key: string): boolean; + s3Url(key: string): string; + s3Key(type: 'versioned' | 'unversioned', ext: '.tar.gz' | '.tar.xz', options?: IConfig.s3Key.Options): string; + s3Key(type: keyof PJSON.S3.Templates, options?: IConfig.s3Key.Options): string; } export namespace IConfig { export namespace s3Key { export interface Options { - platform?: PlatformTypes - arch?: ArchTypes - [key: string]: any + platform?: PlatformTypes; + arch?: ArchTypes; + [key: string]: any; } } } @@ -142,33 +144,59 @@ function channelFromVersion(version: string) { export class Config implements IConfig { _base = `${_pjson.name}@${_pjson.version}` + name!: string + version!: string + channel!: string + root!: string + arch!: ArchTypes + bin!: string + cacheDir!: string + configDir!: string + dataDir!: string + dirname!: string + errlog!: string + home!: string + platform!: PlatformTypes + shell!: string + windows!: boolean + userAgent!: string + debug = 0 + npmRegistry?: string + pjson!: PJSON.CLI + userPJSON?: PJSON.User + plugins: Plugin.IPlugin[] = [] + binPath?: string + valid!: boolean + protected warned = false + // eslint-disable-next-line no-useless-constructor constructor(public options: Options) {} + // eslint-disable-next-line complexity async load() { const plugin = new Plugin.Plugin({root: this.options.root}) await plugin.load() @@ -201,7 +229,8 @@ export class Config implements IConfig { this.pjson.oclif.update = this.pjson.oclif.update || {} this.pjson.oclif.update.node = this.pjson.oclif.update.node || {} - const s3 = this.pjson.oclif.update.s3 = this.pjson.oclif.update.s3 || {} + const s3 = this.pjson.oclif.update.s3 || {} + this.pjson.oclif.update.s3 = s3 s3.bucket = this.scopedEnvVar('S3_BUCKET') || s3.bucket if (s3.bucket && !s3.host) s3.host = `https://${s3.bucket}.s3.amazonaws.com` s3.templates = { @@ -239,8 +268,8 @@ export class Config implements IConfig { try { const devPlugins = this.pjson.oclif.devPlugins if (devPlugins) await this.loadPlugins(this.root, 'dev', devPlugins) - } catch (err) { - process.emitWarning(err) + } catch (error) { + process.emitWarning(error) } } } @@ -250,13 +279,14 @@ export class Config implements IConfig { try { const userPJSONPath = path.join(this.dataDir, 'package.json') debug('reading user plugins pjson %s', userPJSONPath) - const pjson = this.userPJSON = await loadJSON(userPJSONPath) + const pjson = await loadJSON(userPJSONPath) + this.userPJSON = pjson if (!pjson.oclif) pjson.oclif = {schema: 1} if (!pjson.oclif.plugins) pjson.oclif.plugins = [] await this.loadPlugins(userPJSONPath, 'user', pjson.oclif.plugins.filter((p: any) => p.type === 'user')) await this.loadPlugins(userPJSONPath, 'link', pjson.oclif.plugins.filter((p: any) => p.type === 'link')) - } catch (err) { - if (err.code !== 'ENOENT') process.emitWarning(err) + } catch (error) { + if (error.code !== 'ENOENT') process.emitWarning(error) } } } @@ -268,33 +298,37 @@ export class Config implements IConfig { const context: Hook.Context = { config: this, debug, - exit(code = 0) { exit(code) }, + exit(code = 0) { + exit(code) + }, log(message?: any, ...args: any[]) { process.stdout.write(format(message, ...args) + '\n') }, - error(message, options: {code?: string, exit?: number} = {}) { + error(message, options: {code?: string; exit?: number} = {}) { error(message, options) }, - warn(message: string) { warn(message) }, + warn(message: string) { + warn(message) + }, } return Promise.all((p.hooks[event] || []) - .map(async hook => { - try { - const f = tsPath(p.root, hook) - debug('start', f) - const search = (m: any): Hook => { - if (typeof m === 'function') return m - if (m.default && typeof m.default === 'function') return m.default - return Object.values(m).find((m: any) => typeof m === 'function') as Hook - } - - await search(require(f)).call(context, {...opts as any, config: this}) - debug('done') - } catch (err) { - if (err && err.oclif && err.oclif.exit !== undefined) throw err - this.warn(err, `runHook ${event}`) + .map(async hook => { + try { + const f = tsPath(p.root, hook) + debug('start', f) + const search = (m: any): Hook => { + if (typeof m === 'function') return m + if (m.default && typeof m.default === 'function') return m.default + return Object.values(m).find((m: any) => typeof m === 'function') as Hook } - })) + + await search(require(f)).call(context, {...opts as any, config: this}) + debug('done') + } catch (error) { + if (error && error.oclif && error.oclif.exit !== undefined) throw error + this.warn(error, `runHook ${event}`) + } + })) }) await Promise.all(promises) debug('%s hook done', event) @@ -317,40 +351,51 @@ export class Config implements IConfig { } scopedEnvVarTrue(k: string): boolean { - let v = process.env[this.scopedEnvVarKey(k)] + const v = process.env[this.scopedEnvVarKey(k)] return v === '1' || v === 'true' } scopedEnvVarKey(k: string) { return [this.bin, k] - .map(p => p.replace(/@/g, '').replace(/[-\/]/g, '_')) - .join('_') - .toUpperCase() + // eslint-disable-next-line no-useless-escape + .map(p => p.replace(/@/g, '').replace(/[-\/]/g, '_')) + .join('_') + .toUpperCase() } findCommand(id: string, opts: {must: true}): Command.Plugin + findCommand(id: string, opts?: {must: boolean}): Command.Plugin | undefined + findCommand(id: string, opts: {must?: boolean} = {}): Command.Plugin | undefined { - let command = this.commands.find(c => c.id === id || c.aliases.includes(id)) + const command = this.commands.find(c => c.id === id || c.aliases.includes(id)) if (command) return command if (opts.must) error(`command ${id} not found`) } findTopic(id: string, opts: {must: true}): Topic + findTopic(id: string, opts?: {must: boolean}): Topic | undefined + findTopic(name: string, opts: {must?: boolean} = {}) { - let topic = this.topics.find(t => t.name === name) + const topic = this.topics.find(t => t.name === name) if (topic) return topic if (opts.must) throw new Error(`topic ${name} not found`) } - get commands(): Command.Plugin[] { return flatMap(this.plugins, p => p.commands) } - get commandIDs() { return uniq(this.commands.map(c => c.id)) } + get commands(): Command.Plugin[] { + return flatMap(this.plugins, p => p.commands) + } + + get commandIDs() { + return uniq(this.commands.map(c => c.id)) + } + get topics(): Topic[] { - let topics: Topic[] = [] - for (let plugin of this.plugins) { - for (let topic of compact(plugin.topics)) { - let existing = topics.find(t => t.name === topic.name) + const topics: Topic[] = [] + for (const plugin of this.plugins) { + for (const topic of compact(plugin.topics)) { + const existing = topics.find(t => t.name === topic.name) if (existing) { existing.description = topic.description || existing.description existing.hidden = existing.hidden || topic.hidden @@ -358,10 +403,10 @@ export class Config implements IConfig { } } // add missing topics - for (let c of this.commands.filter(c => !c.hidden)) { - let parts = c.id.split(':') + for (const c of this.commands.filter(c => !c.hidden)) { + const parts = c.id.split(':') while (parts.length) { - let name = parts.join(':') + const name = parts.join(':') if (name && !topics.find(t => t.name === name)) { topics.push({name, description: c.description}) } @@ -377,6 +422,7 @@ export class Config implements IConfig { const _: typeof Lodash = require('lodash') return _.template(this.pjson.oclif.update.s3.templates[options.platform ? 'target' : 'vanilla'][type])({...this as any, ...options}) } + s3Url(key: string) { const host = this.pjson.oclif.update.s3.host if (!host) throw new Error('no s3 host is set') @@ -386,16 +432,27 @@ export class Config implements IConfig { } protected dir(category: 'cache' | 'data' | 'config'): string { - const base = process.env[`XDG_${category.toUpperCase()}_HOME`] - || (this.windows && process.env.LOCALAPPDATA) - || path.join(this.home, category === 'data' ? '.local/share' : '.' + category) + const base = process.env[`XDG_${category.toUpperCase()}_HOME`] || + (this.windows && process.env.LOCALAPPDATA) || + path.join(this.home, category === 'data' ? '.local/share' : '.' + category) return path.join(base, this.dirname) } - protected windowsHome() { return this.windowsHomedriveHome() || this.windowsUserprofileHome() } - protected windowsHomedriveHome() { return (process.env.HOMEDRIVE && process.env.HOMEPATH && path.join(process.env.HOMEDRIVE!, process.env.HOMEPATH!)) } - protected windowsUserprofileHome() { return process.env.USERPROFILE } - protected macosCacheDir(): string | undefined { return this.platform === 'darwin' && path.join(this.home, 'Library', 'Caches', this.dirname) || undefined } + protected windowsHome() { + return this.windowsHomedriveHome() || this.windowsUserprofileHome() + } + + protected windowsHomedriveHome() { + return (process.env.HOMEDRIVE && process.env.HOMEPATH && path.join(process.env.HOMEDRIVE!, process.env.HOMEPATH!)) + } + + protected windowsUserprofileHome() { + return process.env.USERPROFILE + } + + protected macosCacheDir(): string | undefined { + return (this.platform === 'darwin' && path.join(this.home, 'Library', 'Caches', this.dirname)) || undefined + } protected _shell(): string { let shellPath @@ -418,12 +475,13 @@ export class Config implements IConfig { } catch {} return 0 } - protected async loadPlugins(root: string, type: string, plugins: (string | {root?: string, name?: string, tag?: string})[], parent?: Plugin.Plugin) { - if (!plugins || !plugins.length) return + + protected async loadPlugins(root: string, type: string, plugins: (string | {root?: string; name?: string; tag?: string})[], parent?: Plugin.Plugin) { + if (!plugins || plugins.length === 0) return debug('loading plugins', plugins) await Promise.all((plugins || []).map(async plugin => { try { - let opts: Options = {type, root} + const opts: Options = {type, root} if (typeof plugin === 'string') { opts.name = plugin } else { @@ -431,23 +489,24 @@ export class Config implements IConfig { opts.tag = plugin.tag || opts.tag opts.root = plugin.root || opts.root } - let instance = new Plugin.Plugin(opts) + const instance = new Plugin.Plugin(opts) await instance.load() if (this.plugins.find(p => p.name === instance.name)) return this.plugins.push(instance) if (parent) { + // eslint-disable-next-line require-atomic-updates instance.parent = parent if (!parent.children) parent.children = [] parent.children.push(instance) } await this.loadPlugins(instance.root, type, instance.pjson.oclif.plugins || [], instance) - } catch (err) { - this.warn(err, 'loadPlugins') + } catch (error) { + this.warn(error, 'loadPlugins') } })) } - protected warn(err: string | Error | {name: string, detail: string}, scope?: string) { + protected warn(err: string | Error | {name: string; detail: string}, scope?: string) { if (this.warned) return if (typeof err === 'string') { @@ -464,7 +523,7 @@ export class Config implements IConfig { scope && `task: ${scope}`, `plugin: ${this.name}`, `root: ${this.root}`, - 'See more details with DEBUG=*' + 'See more details with DEBUG=*', ]).join('\n') process.emitWarning(err) return @@ -479,21 +538,22 @@ export class Config implements IConfig { scope && `task: ${scope}`, `plugin: ${this.name}`, `root: ${this.root}`, - 'See more details with DEBUG=*' + 'See more details with DEBUG=*', ]).join('\n') process.emitWarning(JSON.stringify(err)) } } + +function isConfig(o: any): o is IConfig { + return o && Boolean(o._base) +} + export type LoadOptions = Options | string | IConfig | undefined export async function load(opts: LoadOptions = (module.parent && module.parent && module.parent.parent && module.parent.parent.filename) || __dirname) { if (typeof opts === 'string') opts = {root: opts} if (isConfig(opts)) return opts - let config = new Config(opts) + const config = new Config(opts) await config.load() return config } - -function isConfig(o: any): o is IConfig { - return o && !!o._base -} diff --git a/src/debug.ts b/src/debug.ts index a3c8df02..b612d62a 100644 --- a/src/debug.ts +++ b/src/debug.ts @@ -1,6 +1,8 @@ // tslint:disable no-console let debug: any -try { debug = require('debug') } catch {} +try { + debug = require('debug') +} catch {} function displayWarnings() { if (process.listenerCount('warning') > 1) return diff --git a/src/hooks.ts b/src/hooks.ts index ebed1dc8..48cb70aa 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -1,18 +1,18 @@ import * as Config from '.' export interface Hooks { - [event: string]: object + [event: string]: object; init: { - id: string | undefined, - argv: string[], - } + id: string | undefined; + argv: string[]; + }; prerun: { - Command: Config.Command.Class - argv: string[] - } - preupdate: {channel: string} - update: {channel: string} - 'command_not_found': {id: string}, + Command: Config.Command.Class; + argv: string[]; + }; + preupdate: {channel: string}; + update: {channel: string}; + 'command_not_found': {id: string}; 'plugins:preinstall': { plugin: { name: string; @@ -21,8 +21,8 @@ export interface Hooks { } | { url: string; type: 'repo'; - } - } + }; + }; } export type HookKeyOrOptions = K extends (keyof Hooks) ? Hooks[K] : K @@ -37,11 +37,11 @@ export namespace Hook { export type CommandNotFound = Hook export interface Context { - config: Config.IConfig - exit(code?: number): void - error(message: string | Error, options?: {code?: string, exit?: number}): void - warn(message: string): void - log(message?: any, ...args: any[]): void - debug(...args: any[]): void + config: Config.IConfig; + exit(code?: number): void; + error(message: string | Error, options?: {code?: string; exit?: number}): void; + warn(message: string): void; + log(message?: any, ...args: any[]): void; + debug(...args: any[]): void; } } diff --git a/src/index.ts b/src/index.ts index 77631ee7..f1353a85 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,7 @@ -// tslint:disable no-implicit-dependencies -try { require('fs-extra-debug') } catch {} +try { + // eslint-disable-next-line node/no-missing-require + require('fs-extra-debug') +} catch {} export {IConfig, Config, Options, load, LoadOptions, PlatformTypes, ArchTypes} from './config' export {Command} from './command' diff --git a/src/manifest.ts b/src/manifest.ts index 99da0828..f857a23b 100644 --- a/src/manifest.ts +++ b/src/manifest.ts @@ -1,6 +1,6 @@ import {Command} from './command' export interface Manifest { - version: string - commands: {[id: string]: Command} + version: string; + commands: {[id: string]: Command}; } diff --git a/src/pjson.ts b/src/pjson.ts index 580385e4..b3fbb1de 100644 --- a/src/pjson.ts +++ b/src/pjson.ts @@ -1,95 +1,95 @@ export interface PJSON { - [k: string]: any - dependencies?: {[name: string]: string} + [k: string]: any; + dependencies?: {[name: string]: string}; oclif: { - schema?: number - } + schema?: number; + }; } export namespace PJSON { export interface Plugin extends PJSON { - name: string - version: string + name: string; + version: string; oclif: PJSON['oclif'] & { - schema?: number - title?: string - description?: string - hooks?: { [name: string]: (string | string[]) } - commands?: string - plugins?: string[] - devPlugins?: string[] - aliases?: { [name: string]: string | null } - repositoryPrefix?: string + schema?: number; + title?: string; + description?: string; + hooks?: { [name: string]: (string | string[]) }; + commands?: string; + plugins?: string[]; + devPlugins?: string[]; + aliases?: { [name: string]: string | null }; + repositoryPrefix?: string; update: { - s3: S3 + s3: S3; autoupdate?: { - rollout?: number - debounce?: number - } + rollout?: number; + debounce?: number; + }; node: { - version?: string - targets?: string[] - } - } + version?: string; + targets?: string[]; + }; + }; topics?: { [k: string]: { - description?: string - subtopics?: Plugin['oclif']['topics'] - hidden?: boolean - } - } - } + description?: string; + subtopics?: Plugin['oclif']['topics']; + hidden?: boolean; + }; + }; + }; } export interface S3 { - acl?: string - bucket?: string - host?: string - xz?: boolean - gz?: boolean + acl?: string; + bucket?: string; + host?: string; + xz?: boolean; + gz?: boolean; templates: { - target: S3.Templates - vanilla: S3.Templates - } + target: S3.Templates; + vanilla: S3.Templates; + }; } export namespace S3 { export interface Templates { - baseDir: string - versioned: string - unversioned: string - manifest: string + baseDir: string; + versioned: string; + unversioned: string; + manifest: string; } } export interface CLI extends Plugin { oclif: Plugin['oclif'] & { - schema?: number - bin?: string - npmRegistry?: string - scope?: string - dirname?: string - } + schema?: number; + bin?: string; + npmRegistry?: string; + scope?: string; + dirname?: string; + }; } export interface User extends PJSON { - private?: boolean + private?: boolean; oclif: PJSON['oclif'] & { - plugins?: (string | PluginTypes.User | PluginTypes.Link)[] } + plugins?: (string | PluginTypes.User | PluginTypes.Link)[]; }; } export type PluginTypes = PluginTypes.User | PluginTypes.Link | {root: string} export namespace PluginTypes { export interface User { - type: 'user', - name: string, - url?: string, - tag?: string, + type: 'user'; + name: string; + url?: string; + tag?: string; } export interface Link { - type: 'link' - name: string - root: string + type: 'link'; + name: string; + root: string; } } } diff --git a/src/plugin.ts b/src/plugin.ts index 3608d253..58126d8f 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -12,64 +12,65 @@ import {tsPath} from './ts-node' import {compact, exists, flatMap, loadJSON, mapValues} from './util' export interface Options { - root: string - name?: string - type?: string - tag?: string - ignoreManifest?: boolean, - errorOnManifestCreate?: boolean - parent?: Plugin - children?: Plugin[] + root: string; + name?: string; + type?: string; + tag?: string; + ignoreManifest?: boolean; + errorOnManifestCreate?: boolean; + parent?: Plugin; + children?: Plugin[]; } +// eslint-disable-next-line @typescript-eslint/interface-name-prefix export interface IPlugin { /** * @oclif/config version */ - _base: string + _base: string; /** * name from package.json */ - name: string + name: string; /** * version from package.json * * example: 1.2.3 */ - version: string + version: string; /** * full package.json * * parsed with read-pkg */ - pjson: PJSON.Plugin | PJSON.CLI + pjson: PJSON.Plugin | PJSON.CLI; /** * used to tell the user how the plugin was installed * examples: core, link, user, dev */ - type: string + type: string; /** * base path of plugin */ - root: string + root: string; /** * npm dist-tag of plugin * only used for user plugins */ - tag?: string + tag?: string; /** * if it appears to be an npm package but does not look like it's really a CLI plugin, this is set to false */ - valid: boolean + valid: boolean; - commands: Command.Plugin[] - hooks: {[k: string]: string[]} - readonly commandIDs: string[] - readonly topics: Topic[] + commands: Command.Plugin[]; + hooks: {[k: string]: string[]}; + readonly commandIDs: string[]; + readonly topics: Topic[]; - findCommand(id: string, opts: {must: true}): Command.Class - findCommand(id: string, opts?: {must: boolean}): Command.Class | undefined - load(): Promise + findCommand(id: string, opts: {must: true}): Command.Class; + findCommand(id: string, opts?: {must: boolean}): Command.Class | undefined; + load(): Promise; } const _pjson = require('../package.json') @@ -83,25 +84,90 @@ const hasManifest = function (p: string): boolean { } } +function topicsToArray(input: any, base?: string): Topic[] { + if (!input) return [] + base = base ? `${base}:` : '' + if (Array.isArray(input)) { + return input.concat(flatMap(input, t => topicsToArray(t.subtopics, `${base}${t.name}`))) + } + return flatMap(Object.keys(input), k => { + input[k].name = k + return [{...input[k], name: `${base}${k}`}].concat(topicsToArray(input[k].subtopics, `${base}${input[k].name}`)) + }) +} + +// eslint-disable-next-line valid-jsdoc +/** + * find package root + * for packages installed into node_modules this will go up directories until + * it finds a node_modules directory with the plugin installed into it + * + * This is needed because of the deduping npm does + */ +async function findRoot(name: string | undefined, root: string) { + // essentially just "cd .." + function * up(from: string) { + while (path.dirname(from) !== from) { + yield from + from = path.dirname(from) + } + yield from + } + for (const next of up(root)) { + let cur + if (name) { + cur = path.join(next, 'node_modules', name, 'package.json') + // eslint-disable-next-line no-await-in-loop + if (await exists(cur)) return path.dirname(cur) + try { + // eslint-disable-next-line no-await-in-loop + const pkg = await loadJSON(path.join(next, 'package.json')) + if (pkg.name === name) return next + } catch { } + } else { + cur = path.join(next, 'package.json') + // eslint-disable-next-line no-await-in-loop + if (await exists(cur)) return path.dirname(cur) + } + } +} + export class Plugin implements IPlugin { // static loadedPlugins: {[name: string]: Plugin} = {} _base = `${_pjson.name}@${_pjson.version}` + name!: string + version!: string + pjson!: PJSON.Plugin + type!: string + root!: string + tag?: string + manifest!: Manifest + commands!: Command.Plugin[] + hooks!: {[k: string]: string[]} + valid = false + alreadyLoaded = false + parent: Plugin | undefined + children: Plugin[] = [] + + // eslint-disable-next-line new-cap protected _debug = Debug() + protected warned = false + // eslint-disable-next-line no-useless-constructor constructor(public options: Options) {} async load() { @@ -117,6 +183,7 @@ export class Plugin implements IPlugin { if (!this.name) throw new Error(`no name in ${pjsonPath}`) const isProd = hasManifest(path.join(root, 'oclif.manifest.json')) if (!isProd && !this.pjson.files) this.warn(`files attribute must be specified in ${pjsonPath}`) + // eslint-disable-next-line new-cap this._debug = Debug(this.name) this.version = this.pjson.version if (this.pjson.oclif) { @@ -127,7 +194,7 @@ export class Plugin implements IPlugin { this.hooks = mapValues(this.pjson.oclif.hooks || {}, i => Array.isArray(i) ? i : [i]) - this.manifest = await this._manifest(!!this.options.ignoreManifest, !!this.options.errorOnManifestCreate) + this.manifest = await this._manifest(Boolean(this.options.ignoreManifest), Boolean(this.options.errorOnManifestCreate)) this.commands = Object.entries(this.manifest.commands) .map(([id, c]) => ({...c, load: () => this.findCommand(id, {must: true})})) this.commands.sort((a, b) => { @@ -137,17 +204,22 @@ export class Plugin implements IPlugin { }) } - get topics(): Topic[] { return topicsToArray(this.pjson.oclif.topics || {}) } + get topics(): Topic[] { + return topicsToArray(this.pjson.oclif.topics || {}) + } + + get commandsDir() { + return tsPath(this.root, this.pjson.oclif.commands) + } - get commandsDir() { return tsPath(this.root, this.pjson.oclif.commands) } get commandIDs() { if (!this.commandsDir) return [] let globby: typeof Globby try { const globbyPath = require.resolve('globby', {paths: [this.root, __dirname]}) globby = require(globbyPath) - } catch (err) { - this.warn(err, 'not loading commands, globby not found') + } catch (error) { + this.warn(error, 'not loading commands, globby not found') return [] } this._debug(`loading IDs from ${this.commandsDir}`) @@ -159,7 +231,7 @@ export class Plugin implements IPlugin { .map(file => { const p = path.parse(file) const topics = p.dir.split('/') - let command = p.name !== 'index' && p.name + const command = p.name !== 'index' && p.name return [...topics, command].filter(f => f).join(':') }) this._debug('found commands', ids) @@ -167,7 +239,9 @@ export class Plugin implements IPlugin { } findCommand(id: string, opts: {must: true}): Command.Class + findCommand(id: string, opts?: {must: boolean}): Command.Class | undefined + findCommand(id: string, opts: {must?: boolean} = {}): Command.Class | undefined { const fetch = () => { if (!this.commandsDir) return @@ -181,9 +255,9 @@ export class Plugin implements IPlugin { let m try { m = require(p) - } catch (err) { - if (!opts.must && err.code === 'MODULE_NOT_FOUND') return - throw err + } catch (error) { + if (!opts.must && error.code === 'MODULE_NOT_FOUND') return + throw error } const cmd = search(m) if (!cmd) return @@ -199,7 +273,7 @@ export class Plugin implements IPlugin { protected async _manifest(ignoreManifest: boolean, errorOnManifestCreate = false): Promise { const readManifest = async (dotfile = false): Promise => { try { - const p = path.join(this.root, `${dotfile ? '.' : '' }oclif.manifest.json`) + const p = path.join(this.root, `${dotfile ? '.' : ''}oclif.manifest.json`) const manifest: Manifest = await loadJSON(p) if (!process.env.OCLIF_NEXT_VERSION && manifest.version.split('-')[0] !== this.version.split('-')[0]) { process.emitWarning(`Mismatched version in ${this.name} plugin manifest. Expected: ${this.version} Received: ${manifest.version}\nThis usually means you have an oclif.manifest.json file that should be deleted in development. This file should be automatically generated when publishing.`) @@ -207,36 +281,36 @@ export class Plugin implements IPlugin { this._debug('using manifest from', p) return manifest } - } catch (err) { - if (err.code === 'ENOENT') { + } catch (error) { + if (error.code === 'ENOENT') { if (!dotfile) return readManifest(true) } else { - this.warn(err, 'readManifest') - return + this.warn(error, 'readManifest') } } } if (!ignoreManifest) { - let manifest = await readManifest() + const manifest = await readManifest() if (manifest) return manifest } return { version: this.version, + // eslint-disable-next-line array-callback-return commands: this.commandIDs.map(id => { try { return [id, Command.toCached(this.findCommand(id, {must: true}), this)] - } catch (err) { + } catch (error) { const scope = 'toCached' - if (!errorOnManifestCreate) this.warn(err, scope) - else throw this.addErrorScope(err, scope) + if (Boolean(errorOnManifestCreate) === false) this.warn(error, scope) + else throw this.addErrorScope(error, scope) } }) - .filter((f): f is [string, Command] => !!f) - .reduce((commands, [id, c]) => { - commands[id] = c - return commands - }, {} as {[k: string]: Command}) + .filter((f): f is [string, Command] => Boolean(f)) + .reduce((commands, [id, c]) => { + commands[id] = c + return commands + }, {} as {[k: string]: Command}), } } @@ -253,46 +327,3 @@ export class Plugin implements IPlugin { } } -function topicsToArray(input: any, base?: string): Topic[] { - if (!input) return [] - base = base ? `${base}:` : '' - if (Array.isArray(input)) { - return input.concat(flatMap(input, t => topicsToArray(t.subtopics, `${base}${t.name}`))) - } - return flatMap(Object.keys(input), k => { - input[k].name = k - return [{...input[k], name: `${base}${k}`}].concat(topicsToArray(input[k].subtopics, `${base}${input[k].name}`)) - }) -} - -/** - * find package root - * for packages installed into node_modules this will go up directories until - * it finds a node_modules directory with the plugin installed into it - * - * This is needed because of the deduping npm does - */ -async function findRoot(name: string | undefined, root: string) { - // essentially just "cd .." - function* up(from: string) { - while (path.dirname(from) !== from) { - yield from - from = path.dirname(from) - } - yield from - } - for (let next of up(root)) { - let cur - if (name) { - cur = path.join(next, 'node_modules', name, 'package.json') - if (await exists(cur)) return path.dirname(cur) - try { - let pkg = await loadJSON(path.join(next, 'package.json')) - if (pkg.name === name) return next - } catch {} - } else { - cur = path.join(next, 'package.json') - if (await exists(cur)) return path.dirname(cur) - } - } -} diff --git a/src/screen.ts b/src/screen.ts index 7f38ec43..1b6e27c9 100644 --- a/src/screen.ts +++ b/src/screen.ts @@ -14,5 +14,5 @@ function termwidth(stream: any): number { const columns: number | null = (global as any).columns -export let stdtermwidth = columns || termwidth(process.stdout) -export let errtermwidth = columns || termwidth(process.stderr) +export const stdtermwidth = columns || termwidth(process.stdout) +export const errtermwidth = columns || termwidth(process.stderr) diff --git a/src/topic.ts b/src/topic.ts index 4360f024..3765d097 100644 --- a/src/topic.ts +++ b/src/topic.ts @@ -1,5 +1,5 @@ export interface Topic { - name: string - description?: string - hidden?: boolean + name: string; + description?: string; + hidden?: boolean; } diff --git a/src/ts-node.ts b/src/ts-node.ts index 879d6e81..ca59cc5f 100644 --- a/src/ts-node.ts +++ b/src/ts-node.ts @@ -3,6 +3,7 @@ import * as path from 'path' import * as TSNode from 'ts-node' import Debug from './debug' +// eslint-disable-next-line new-cap const debug = Debug() const tsconfigs: {[root: string]: TSConfig} = {} @@ -11,11 +12,36 @@ const typeRoots = [`${__dirname}/../node_modules/@types`] export interface TSConfig { compilerOptions: { - rootDir?: string - rootDirs?: string[] - outDir?: string - target?: string + rootDir?: string; + rootDirs?: string[]; + outDir?: string; + target?: string; esModuleInterop?: boolean; + }; +} + +function loadTSConfig(root: string): TSConfig | undefined { + const tsconfigPath = path.join(root, 'tsconfig.json') + let typescript: typeof import('typescript') | undefined + try { + typescript = require('typescript') + } catch { + try { + typescript = require(root + '/node_modules/typescript') + } catch { } + } + + if (fs.existsSync(tsconfigPath) && typescript) { + const tsconfig = typescript.parseConfigFileTextToJson( + tsconfigPath, + fs.readFileSync(tsconfigPath, 'utf8'), + ).config + if (!tsconfig || !tsconfig.compilerOptions) { + throw new Error( + `Could not read and parse tsconfig.json at ${tsconfigPath}, or it ` + + 'did not contain a "compilerOptions" section.') + } + return tsconfig } } @@ -49,38 +75,13 @@ function registerTSNode(root: string) { sourceMap: true, rootDirs, typeRoots, - } + }, }) } finally { process.chdir(cwd) } } -function loadTSConfig(root: string): TSConfig | undefined { - const tsconfigPath = path.join(root, 'tsconfig.json') - let typescript: typeof import('typescript') | undefined - try { - typescript = require('typescript') - } catch { - try { - typescript = require(root + '/node_modules/typescript') - } catch {} - } - - if (fs.existsSync(tsconfigPath) && typescript) { - const tsconfig = typescript.parseConfigFileTextToJson( - tsconfigPath, - fs.readFileSync(tsconfigPath, 'utf8') - ).config - if (!tsconfig || !tsconfig.compilerOptions) { - throw new Error( - `Could not read and parse tsconfig.json at ${tsconfigPath}, or it ` + - 'did not contain a "compilerOptions" section.') - } - return tsconfig - } -} - /** * convert a path from the compiled ./lib files to the ./src typescript source * this is for developing typescript plugins/CLIs @@ -109,9 +110,9 @@ export function tsPath(root: string, orig: string | undefined): string | undefin // That file doesn't exist, and the real file is "./hooks/myhook.ts" // In that case we attempt to resolve to the filename. If it fails it will revert back to the lib path if (fs.existsSync(out) || fs.existsSync(out + '.ts')) return out - else return orig - } catch (err) { - debug(err) + return orig + } catch (error) { + debug(error) return orig } } diff --git a/src/util.ts b/src/util.ts index fe206b1b..a7f50cd9 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,4 +1,3 @@ -// tslint:disable no-implicit-dependencies import * as fs from 'fs' const debug = require('debug')('@oclif/config') @@ -9,15 +8,14 @@ export function flatMap(arr: T[], fn: (i: T) => U[]): U[] { export function mapValues(obj: {[P in keyof T]: T[P]}, fn: (i: T[keyof T], k: keyof T) => TResult): {[P in keyof T]: TResult} { return Object.entries(obj) - .reduce((o, [k, v]) => { - o[k] = fn(v as any, k as any) - return o - }, {} as any) + .reduce((o, [k, v]) => { + o[k] = fn(v as any, k as any) + return o + }, {} as any) } export function exists(path: string): Promise { - // tslint:disable-next-line - return new Promise(resolve => fs.exists(path, resolve)) + return new Promise(resolve => resolve(fs.existsSync(path))) } export function loadJSON(path: string): Promise { @@ -30,15 +28,15 @@ export function loadJSON(path: string): Promise { try { if (err) reject(err) else resolve(JSON.parse(d)) - } catch (err) { - reject(err) + } catch (error) { + reject(error) } }) }) } export function compact(a: (T | undefined)[]): T[] { - return a.filter((a): a is T => !!a) + return a.filter((a): a is T => Boolean(a)) } export function uniq(arr: T[]): T[] { diff --git a/test/config.test.ts b/test/config.test.ts index 37c56cd5..e4d73f84 100644 --- a/test/config.test.ts +++ b/test/config.test.ts @@ -7,10 +7,10 @@ import * as util from '../src/util' import {expect, fancy} from './test' interface Options { - pjson?: any, - homedir?: string, - platform?: string, - env?: {[k: string]: string}, + pjson?: any; + homedir?: string; + platform?: string; + env?: {[k: string]: string}; } describe('Config', () => { @@ -28,47 +28,48 @@ describe('Config', () => { return { hasS3Key(k: keyof PJSON.S3.Templates, expected: string, extra: any = {}) { return this - .it(`renders ${k} template as ${expected}`, config => { - let {ext, ...options} = extra - options = { - bin: 'oclif-cli', - version: '1.0.0', - ext: '.tar.gz', - ...options, - } - const o = ext ? config.s3Key(k as any, ext, options) : config.s3Key(k, options) - expect(o).to.equal(expected) - }) + .it(`renders ${k} template as ${expected}`, config => { + // eslint-disable-next-line prefer-const + let {ext, ...options} = extra + options = { + bin: 'oclif-cli', + version: '1.0.0', + ext: '.tar.gz', + ...options, + } + const o = ext ? config.s3Key(k as any, ext, options) : config.s3Key(k, options) + expect(o).to.equal(expected) + }) }, hasProperty(k: K | undefined, v: IConfig[K] | undefined) { return this - .it(`has ${k}=${v}`, config => expect(config).to.have.property(k!, v)) + .it(`has ${k}=${v}`, config => expect(config).to.have.property(k!, v)) }, it(expectation: string, fn: (config: IConfig) => any) { test - .do(({config}) => fn(config)) - .it(expectation) + .do(({config}) => fn(config)) + .it(expectation) return this - } + }, } } describe('darwin', () => { testConfig() - .hasProperty('cacheDir', path.join('/my/home/Library/Caches/@oclif/config')) - .hasProperty('configDir', path.join('/my/home/.config/@oclif/config')) - .hasProperty('errlog', path.join('/my/home/Library/Caches/@oclif/config/error.log')) - .hasProperty('dataDir', path.join('/my/home/.local/share/@oclif/config')) - .hasProperty('home', path.join('/my/home')) + .hasProperty('cacheDir', path.join('/my/home/Library/Caches/@oclif/config')) + .hasProperty('configDir', path.join('/my/home/.config/@oclif/config')) + .hasProperty('errlog', path.join('/my/home/Library/Caches/@oclif/config/error.log')) + .hasProperty('dataDir', path.join('/my/home/.local/share/@oclif/config')) + .hasProperty('home', path.join('/my/home')) }) describe('linux', () => { testConfig({platform: 'linux'}) - .hasProperty('cacheDir', path.join('/my/home/.cache/@oclif/config')) - .hasProperty('configDir', path.join('/my/home/.config/@oclif/config')) - .hasProperty('errlog', path.join('/my/home/.cache/@oclif/config/error.log')) - .hasProperty('dataDir', path.join('/my/home/.local/share/@oclif/config')) - .hasProperty('home', path.join('/my/home')) + .hasProperty('cacheDir', path.join('/my/home/.cache/@oclif/config')) + .hasProperty('configDir', path.join('/my/home/.config/@oclif/config')) + .hasProperty('errlog', path.join('/my/home/.cache/@oclif/config/error.log')) + .hasProperty('dataDir', path.join('/my/home/.local/share/@oclif/config')) + .hasProperty('home', path.join('/my/home')) }) describe('win32', () => { @@ -76,39 +77,39 @@ describe('Config', () => { platform: 'win32', env: {LOCALAPPDATA: '/my/home/localappdata'}, }) - .hasProperty('cacheDir', path.join('/my/home/localappdata/@oclif\\config')) - .hasProperty('configDir', path.join('/my/home/localappdata/@oclif\\config')) - .hasProperty('errlog', path.join('/my/home/localappdata/@oclif\\config/error.log')) - .hasProperty('dataDir', path.join('/my/home/localappdata/@oclif\\config')) - .hasProperty('home', path.join('/my/home')) + .hasProperty('cacheDir', path.join('/my/home/localappdata/@oclif\\config')) + .hasProperty('configDir', path.join('/my/home/localappdata/@oclif\\config')) + .hasProperty('errlog', path.join('/my/home/localappdata/@oclif\\config/error.log')) + .hasProperty('dataDir', path.join('/my/home/localappdata/@oclif\\config')) + .hasProperty('home', path.join('/my/home')) }) describe('s3Key', () => { const target = {platform: 'darwin', arch: 'x64'} const beta = {version: '2.0.0-beta', channel: 'beta'} testConfig() - .hasS3Key('baseDir', 'oclif-cli') - .hasS3Key('manifest', 'version') - .hasS3Key('manifest', 'channels/beta/version', beta) - .hasS3Key('manifest', 'darwin-x64', target) - .hasS3Key('manifest', 'channels/beta/darwin-x64', {...beta, ...target}) - .hasS3Key('unversioned', 'oclif-cli.tar.gz') - .hasS3Key('unversioned', 'oclif-cli.tar.gz') - .hasS3Key('unversioned', 'channels/beta/oclif-cli.tar.gz', beta) - .hasS3Key('unversioned', 'channels/beta/oclif-cli.tar.gz', beta) - .hasS3Key('unversioned', 'oclif-cli-darwin-x64.tar.gz', target) - .hasS3Key('unversioned', 'oclif-cli-darwin-x64.tar.gz', target) - .hasS3Key('unversioned', 'channels/beta/oclif-cli-darwin-x64.tar.gz', {...beta, ...target}) - .hasS3Key('unversioned', 'channels/beta/oclif-cli-darwin-x64.tar.gz', {...beta, ...target}) - .hasS3Key('versioned', 'oclif-cli-v1.0.0/oclif-cli-v1.0.0.tar.gz') - .hasS3Key('versioned', 'oclif-cli-v1.0.0/oclif-cli-v1.0.0-darwin-x64.tar.gz', target) - .hasS3Key('versioned', 'channels/beta/oclif-cli-v2.0.0-beta/oclif-cli-v2.0.0-beta.tar.gz', beta) - .hasS3Key('versioned', 'channels/beta/oclif-cli-v2.0.0-beta/oclif-cli-v2.0.0-beta-darwin-x64.tar.gz', {...beta, ...target}) + .hasS3Key('baseDir', 'oclif-cli') + .hasS3Key('manifest', 'version') + .hasS3Key('manifest', 'channels/beta/version', beta) + .hasS3Key('manifest', 'darwin-x64', target) + .hasS3Key('manifest', 'channels/beta/darwin-x64', {...beta, ...target}) + .hasS3Key('unversioned', 'oclif-cli.tar.gz') + .hasS3Key('unversioned', 'oclif-cli.tar.gz') + .hasS3Key('unversioned', 'channels/beta/oclif-cli.tar.gz', beta) + .hasS3Key('unversioned', 'channels/beta/oclif-cli.tar.gz', beta) + .hasS3Key('unversioned', 'oclif-cli-darwin-x64.tar.gz', target) + .hasS3Key('unversioned', 'oclif-cli-darwin-x64.tar.gz', target) + .hasS3Key('unversioned', 'channels/beta/oclif-cli-darwin-x64.tar.gz', {...beta, ...target}) + .hasS3Key('unversioned', 'channels/beta/oclif-cli-darwin-x64.tar.gz', {...beta, ...target}) + .hasS3Key('versioned', 'oclif-cli-v1.0.0/oclif-cli-v1.0.0.tar.gz') + .hasS3Key('versioned', 'oclif-cli-v1.0.0/oclif-cli-v1.0.0-darwin-x64.tar.gz', target) + .hasS3Key('versioned', 'channels/beta/oclif-cli-v2.0.0-beta/oclif-cli-v2.0.0-beta.tar.gz', beta) + .hasS3Key('versioned', 'channels/beta/oclif-cli-v2.0.0-beta/oclif-cli-v2.0.0-beta-darwin-x64.tar.gz', {...beta, ...target}) }) describe('options', () => { it('should set the channel and version', async () => { - let config = new Config({root: process.cwd(), channel: 'test-channel', version: '0.1.2-test'}) + const config = new Config({root: process.cwd(), channel: 'test-channel', version: '0.1.2-test'}) await config.load() expect(config).to.have.property('channel', 'test-channel') expect(config).to.have.property('version', '0.1.2-test') @@ -116,12 +117,12 @@ describe('Config', () => { }) testConfig() - .it('has s3Url', config => { - const orig = config.pjson.oclif.update.s3.host - config.pjson.oclif.update.s3.host = 'https://bar.com/a/' - expect(config.s3Url('/b/c')).to.equal('https://bar.com/a/b/c') - config.pjson.oclif.update.s3.host = orig - }) + .it('has s3Url', config => { + const orig = config.pjson.oclif.update.s3.host + config.pjson.oclif.update.s3.host = 'https://bar.com/a/' + expect(config.s3Url('/b/c')).to.equal('https://bar.com/a/b/c') + config.pjson.oclif.update.s3.host = orig + }) testConfig({ pjson: { @@ -135,20 +136,20 @@ describe('Config', () => { description: 'desc for t1-1', subtopics: { 't1-1-1': { - description: 'desc for t1-1-1' + description: 'desc for t1-1-1', }, 't1-1-2': { - description: 'desc for t1-1-2' - } - } - } - } - } - } - } - } + description: 'desc for t1-1-2', + }, + }, + }, + }, + }, + }, + }, + }, + }) + .it('has subtopics', config => { + expect(config.topics.map(t => t.name)).to.have.members(['t1', 't1:t1-1', 't1:t1-1:t1-1-1', 't1:t1-1:t1-1-2']) }) - .it('has subtopics', config => { - expect(config.topics.map(t => t.name)).to.have.members(['t1', 't1:t1-1', 't1:t1-1:t1-1-1', 't1:t1-1:t1-1-2']) - }) }) diff --git a/test/test.ts b/test/test.ts index 2fc7c808..175eb103 100644 --- a/test/test.ts +++ b/test/test.ts @@ -6,7 +6,7 @@ export const fancy = base .register('resetConfig', () => ({ run(ctx: {config: Config.IConfig}) { delete ctx.config - } + }, })) export { diff --git a/test/ts-node.test.ts b/test/ts-node.test.ts index c2a981f7..590f3e10 100644 --- a/test/ts-node.test.ts +++ b/test/ts-node.test.ts @@ -11,54 +11,54 @@ const orig = 'src/hooks/init.ts' let tsNodeRegisterCallArguments: any[] = [] const DEFAULT_TS_CONFIG: TSConfig = { - compilerOptions: {} + compilerOptions: {}, } const withMockTsConfig = (config: TSConfig = DEFAULT_TS_CONFIG) => { const tsNodePlugin = proxyquire('../src/ts-node', {fs: { existsSync: () => true, - readFileSync: () => JSON.stringify(config) + readFileSync: () => JSON.stringify(config), }}) // This prints "loadTSConfig unstubbed" not "loadTSConfig proxyquire"! tsNodePlugin.tsPath('poop', 'asdf') return fancy - .add('tsNodePlugin', () => tsNodePlugin) - .stub(tsNode, 'register', (arg: any) => { - tsNodeRegisterCallArguments.push(arg) - }) - .finally(() => { - tsNodeRegisterCallArguments = [] - }) + .add('tsNodePlugin', () => tsNodePlugin) + .stub(tsNode, 'register', (arg: any) => { + tsNodeRegisterCallArguments.push(arg) + }) + .finally(() => { + tsNodeRegisterCallArguments = [] + }) } describe('tsPath', () => { withMockTsConfig() - .it('should resolve a .ts file', ctx => { - const result = ctx.tsNodePlugin.tsPath(root, orig) - expect(result).to.equal(path.join(root, orig)) - }) + .it('should resolve a .ts file', ctx => { + const result = ctx.tsNodePlugin.tsPath(root, orig) + expect(result).to.equal(path.join(root, orig)) + }) withMockTsConfig() - .it('should leave esModuleInterop undefined by default', ctx => { - ctx.tsNodePlugin.tsPath(root, orig) - expect(tsNodeRegisterCallArguments.length).is.equal(1) - expect(tsNodeRegisterCallArguments[0]) - .to.have.nested.property('compilerOptions.esModuleInterop') - .equal(undefined) - }) + .it('should leave esModuleInterop undefined by default', ctx => { + ctx.tsNodePlugin.tsPath(root, orig) + expect(tsNodeRegisterCallArguments.length).is.equal(1) + expect(tsNodeRegisterCallArguments[0]) + .to.have.nested.property('compilerOptions.esModuleInterop') + .equal(undefined) + }) withMockTsConfig({ compilerOptions: { - esModuleInterop: true - } + esModuleInterop: true, + }, + }) + .it('should use the provided esModuleInterop option', ctx => { + ctx.tsNodePlugin.tsPath(root, orig) + expect(tsNodeRegisterCallArguments.length).is.equal(1) + expect(tsNodeRegisterCallArguments[0]) + .to.have.nested.property('compilerOptions.esModuleInterop') + .equal(true) }) - .it('should use the provided esModuleInterop option', ctx => { - ctx.tsNodePlugin.tsPath(root, orig) - expect(tsNodeRegisterCallArguments.length).is.equal(1) - expect(tsNodeRegisterCallArguments[0]) - .to.have.nested.property('compilerOptions.esModuleInterop') - .equal(true) - }) }) diff --git a/test/typescript.test.ts b/test/typescript.test.ts index 743e35d5..0c83048c 100644 --- a/test/typescript.test.ts +++ b/test/typescript.test.ts @@ -12,23 +12,23 @@ const withConfig = fancy describe('typescript', () => { withConfig - .it('has commandsDir', ({config}) => { - expect(config.plugins[0]).to.deep.include({ - commandsDir: p('src/commands'), - }) + .it('has commandsDir', ({config}) => { + expect(config.plugins[0]).to.deep.include({ + commandsDir: p('src/commands'), }) + }) withConfig - .stdout() - .it('runs ts command and prerun hooks', async ctx => { - await ctx.config.runCommand('foo:bar:baz') - expect(ctx.stdout).to.equal('running ts prerun hook\nit works!\n') - }) + .stdout() + .it('runs ts command and prerun hooks', async ctx => { + await ctx.config.runCommand('foo:bar:baz') + expect(ctx.stdout).to.equal('running ts prerun hook\nit works!\n') + }) withConfig - .stdout() - .it('runs init hook', async ctx => { - await ctx.config.runHook('init', {id: 'myid', argv: ['foo']}) - expect(ctx.stdout).to.equal('running ts init hook\n') - }) + .stdout() + .it('runs init hook', async ctx => { + await ctx.config.runHook('init', {id: 'myid', argv: ['foo']}) + expect(ctx.stdout).to.equal('running ts init hook\n') + }) }) diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 803e2f2c..00000000 --- a/tslint.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "@oclif/tslint", - "linterOptions": { - "exclude": [ - "test/fixtures/**" - ] - } -} diff --git a/yarn.lock b/yarn.lock index 68dc977b..a2093c80 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,25 +18,6 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@fimbul/bifrost@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.17.0.tgz#f0383ba7e40992e3193dc87e2ddfde2ad62a9cf4" - integrity sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q== - dependencies: - "@fimbul/ymir" "^0.17.0" - get-caller-file "^2.0.0" - tslib "^1.8.1" - tsutils "^3.5.0" - -"@fimbul/ymir@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.17.0.tgz#4f28389b9f804d1cd202e11983af1743488b7815" - integrity sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA== - dependencies: - inversify "^5.0.0" - reflect-metadata "^0.1.12" - tslib "^1.8.1" - "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -50,7 +31,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@oclif/errors@^1.2.2": +"@oclif/errors@^1.0.0": version "1.2.2" resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.2.2.tgz#9d8f269b15f13d70aa93316fed7bebc24688edc2" integrity sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg== @@ -75,19 +56,16 @@ chalk "^2.4.2" tslib "^1.9.3" -"@oclif/tslint@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@oclif/tslint/-/tslint-3.1.1.tgz#e055cdf158630862fd44546f6b8fb1266c9778e7" - integrity sha512-B1ZWbgzwxDhNZLzVnn+JjyFf9u+J9wNwsz/ZX9YvA9edRYcdiJz9JikCttGPi35V0NU0TUV4UqTqo/q/wQ06jQ== - dependencies: - tslint-eslint-rules "^5.4.0" - tslint-xo "^0.9.0" - "@types/chai@*", "@types/chai@^4.1.7": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a" integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA== +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -107,6 +85,11 @@ resolved "https://registry.yarnpkg.com/@types/indent-string/-/indent-string-3.2.0.tgz#ce0016b6527a582e98122d593000772a965db665" integrity sha512-9iJXKl51MSjBOO8AWJyDtegBy4PkcgwIQCNYmHA63qtYlaISD6sEcB4jZ8APOdBacZJ8fZwxZpN7iwYlyE6eGw== +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + "@types/lodash@*": version "4.14.123" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.123.tgz#39be5d211478c8dd3bdae98ee75bb7efe4abfe4d" @@ -164,6 +147,48 @@ resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== +"@typescript-eslint/eslint-plugin@^2.6.1": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.7.0.tgz#dff176bdb73dfd7e2e43062452189bd1b9db6021" + integrity sha512-H5G7yi0b0FgmqaEUpzyBlVh0d9lq4cWG2ap0RKa6BkF3rpBb6IrAoubt1NWh9R2kRs/f0k6XwRDiDz3X/FqXhQ== + dependencies: + "@typescript-eslint/experimental-utils" "2.7.0" + eslint-utils "^1.4.2" + functional-red-black-tree "^1.0.1" + regexpp "^2.0.1" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.7.0.tgz#58d790a3884df3041b5a5e08f9e5e6b7c41864b5" + integrity sha512-9/L/OJh2a5G2ltgBWJpHRfGnt61AgDeH6rsdg59BH0naQseSwR7abwHq3D5/op0KYD/zFT4LS5gGvWcMmegTEg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.7.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.6.1": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.7.0.tgz#b5e6a4944e2b68dba1e7fbfd5242e09ff552fd12" + integrity sha512-ctC0g0ZvYclxMh/xI+tyqP0EC2fAo6KicN9Wm2EIao+8OppLfxji7KAGJosQHSGBj3TcqUrA96AjgXuKa5ob2g== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.7.0" + "@typescript-eslint/typescript-estree" "2.7.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.7.0.tgz#34fd98c77a07b40d04d5b4203eddd3abeab909f4" + integrity sha512-vVCE/DY72N4RiJ/2f10PTyYekX2OLaltuSIBqeHYI44GQ940VCYioInIb8jKMrK9u855OEJdFC+HmWAZTnC+Ag== + dependencies: + debug "^4.1.1" + glob "^7.1.4" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + tsutils "^3.17.1" + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -172,16 +197,43 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= +ajv@^6.10.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== +ansi-escapes@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" + integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== + dependencies: + type-fest "^0.5.2" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -197,6 +249,11 @@ ansi-regex@^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.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -273,6 +330,11 @@ assign-symbols@^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== + atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -330,11 +392,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -355,6 +412,11 @@ call-me-maybe@^1.0.1: resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +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-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -399,7 +461,7 @@ chai@^4.2.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -408,6 +470,11 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -423,11 +490,30 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= + dependencies: + escape-string-regexp "^1.0.5" + clean-stack@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -462,7 +548,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -commander@^2.12.1, commander@~2.20.0: +commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== @@ -650,7 +736,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cross-spawn@^6.0.0: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -694,7 +780,7 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^4.1.1: +debug@^4.0.1, 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== @@ -726,6 +812,11 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" +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= + define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -755,7 +846,7 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -diff@3.5.0, diff@^3.2.0: +diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== @@ -772,13 +863,12 @@ dir-glob@^2.2.2: dependencies: path-type "^3.0.0" -doctrine@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" - integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM= +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - esutils "^1.1.6" - isarray "0.0.1" + esutils "^2.0.2" dot-prop@^3.0.0: version "3.0.0" @@ -792,6 +882,11 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +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.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -832,15 +927,185 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +eslint-ast-utils@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" + integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA== + dependencies: + lodash.get "^4.4.2" + lodash.zip "^4.2.0" + +eslint-config-oclif-typescript@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-oclif-typescript/-/eslint-config-oclif-typescript-0.1.0.tgz#c310767c5ee8916ea5d08cf027d0317dd52ed8ba" + integrity sha512-BjXNJcH2F02MdaSFml9vJskviUFVkLHbTPGM5tinIt98H6klFNKP7/lQ+fB/Goc2wB45usEuuw6+l/fwAv9i7g== + dependencies: + "@typescript-eslint/eslint-plugin" "^2.6.1" + "@typescript-eslint/parser" "^2.6.1" + eslint-config-oclif "^3.1.0" + eslint-config-xo-space "^0.20.0" + eslint-plugin-mocha "^5.2.0" + eslint-plugin-node "^7.0.1" + eslint-plugin-unicorn "^6.0.1" + +eslint-config-oclif@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-oclif/-/eslint-config-oclif-3.1.0.tgz#cbc207ced09e31676dcee2f724fc509cd20eb0bd" + integrity sha512-Tqgy43cNXsSdhTLWW4RuDYGFhV240sC4ISSv/ZiUEg/zFxExSEUpRE6J+AGnkKY9dYwIW4C9b2YSUVv8z/miMA== + dependencies: + eslint-config-xo-space "^0.20.0" + eslint-plugin-mocha "^5.2.0" + eslint-plugin-node "^7.0.1" + eslint-plugin-unicorn "^6.0.1" + +eslint-config-xo-space@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/eslint-config-xo-space/-/eslint-config-xo-space-0.20.0.tgz#75e1fb86d1b052fc1cc3036ca2fa441fa92b85e4" + integrity sha512-bOsoZA8M6v1HviDUIGVq1fLVnSu3mMZzn85m2tqKb73tSzu4GKD4Jd2Py4ZKjCgvCbRRByEB5HPC3fTMnnJ1uw== + dependencies: + eslint-config-xo "^0.24.0" + +eslint-config-xo@^0.24.0: + version "0.24.2" + resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.24.2.tgz#f61b8ce692e9f9519bdb6edc4ed7ebcd5be48f48" + integrity sha512-ivQ7qISScW6gfBp+p31nQntz1rg34UCybd3uvlngcxt5Utsf4PMMi9QoAluLFcPUM5Tvqk4JGraR9qu3msKPKQ== + +eslint-plugin-es@^1.3.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998" + integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA== + dependencies: + eslint-utils "^1.4.2" + regexpp "^2.0.1" + +eslint-plugin-mocha@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-5.3.0.tgz#cf3eb18ae0e44e433aef7159637095a7cb19b15b" + integrity sha512-3uwlJVLijjEmBeNyH60nzqgA1gacUWLUmcKV8PIGNvj1kwP/CTgAWQHn2ayyJVwziX+KETkr9opNwT1qD/RZ5A== + dependencies: + ramda "^0.26.1" + +eslint-plugin-node@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" + integrity sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw== + dependencies: + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^4.0.2" + minimatch "^3.0.4" + resolve "^1.8.1" + semver "^5.5.0" + +eslint-plugin-unicorn@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-6.0.1.tgz#4a97f0bc9449e20b82848dad12094ee2ba72347e" + integrity sha512-hjy9LhTdtL7pz8WTrzS0CGXRkWK3VAPLDjihofj8JC+uxQLfXm0WwZPPPB7xKmcjRyoH+jruPHOCrHNEINpG/Q== + dependencies: + clean-regexp "^1.0.0" + eslint-ast-utils "^1.0.0" + import-modules "^1.1.0" + lodash.camelcase "^4.1.1" + lodash.kebabcase "^4.0.1" + lodash.snakecase "^4.0.1" + lodash.upperfirst "^4.2.0" + safe-regex "^1.1.0" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1, eslint-utils@^1.4.2, eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" + integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esutils@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" - integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U= +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + 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.2" @@ -888,6 +1153,15 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -917,6 +1191,11 @@ fancy-test@^1.4.3: mock-stdin "^0.3.1" stdout-stderr "^0.1.9" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + fast-glob@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" @@ -929,6 +1208,30 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +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= + +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + fill-keys@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" @@ -969,6 +1272,15 @@ find-up@^2.0.0: dependencies: locate-path "^2.0.0" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + flat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" @@ -976,6 +1288,11 @@ flat@^4.1.0: dependencies: is-buffer "~2.0.3" +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -1007,12 +1324,17 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.0, get-caller-file@^2.0.1: +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== @@ -1092,6 +1414,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" @@ -1109,10 +1438,10 @@ glob@7.1.3, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +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" @@ -1121,6 +1450,11 @@ glob@^7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +globals@^11.7.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== + globby@^9.2.0: version "9.2.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" @@ -1214,11 +1548,36 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== -ignore@^4.0.3: +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" + +ignore@^4.0.2, ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-modules@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-1.1.0.tgz#748db79c5cc42bb9701efab424f894e72600e9dc" + integrity sha1-dI23nFzEK7lwHvq0JPiU5yYA6dw= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -1254,10 +1613,24 @@ ini@^1.3.2: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inversify@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e" - integrity sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ== +inquirer@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" + integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" invert-kv@^2.0.0: version "2.0.0" @@ -1371,6 +1744,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +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-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -1378,7 +1756,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -1414,6 +1792,11 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -1450,11 +1833,6 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -1495,6 +1873,16 @@ json-parse-better-errors@^1.0.1: 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-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + 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" @@ -1543,6 +1931,14 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +levn@^0.3.0, 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" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -1585,11 +1981,31 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.camelcase@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.kebabcase@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= + +lodash.snakecase@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= + lodash.template@^4.0.2: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -1605,7 +2021,22 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" -lodash@^4.17.11, lodash@^4.2.1: +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash.upperfirst@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984= + +lodash.zip@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" + integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.2.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -1728,7 +2159,7 @@ micromatch@^3.1.10: snapdragon "^0.8.1" to-regex "^3.0.2" -mimic-fn@^2.0.0: +mimic-fn@^2.0.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== @@ -1832,6 +2263,11 @@ ms@2.1.1, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -1849,6 +2285,11 @@ nanomatch@^1.2.9: 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= + neo-async@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" @@ -1947,6 +2388,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: 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" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -1955,6 +2403,18 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" +optionator@^0.8.2: + 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" + os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -1964,7 +2424,7 @@ os-locale@^3.0.0, os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -2022,6 +2482,13 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" @@ -2132,11 +2599,21 @@ posix-character-classes@^0.1.0: 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= + process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + proxyquire@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.0.tgz#c2263a38bf0725f2ae950facc130e27510edce8d" @@ -2154,6 +2631,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -2164,6 +2646,11 @@ quick-lru@^1.0.0: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +ramda@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" + integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -2236,11 +2723,6 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" -reflect-metadata@^0.1.12: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== - 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" @@ -2249,6 +2731,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" @@ -2281,6 +2768,11 @@ require-main-filename@^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-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -2293,10 +2785,10 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" -resolve@^1.3.2: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== +resolve@^1.8.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== dependencies: path-parse "^1.0.6" @@ -2307,11 +2799,40 @@ resolve@~1.8.1: dependencies: path-parse "^1.0.5" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + 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@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rxjs@^6.4.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -2324,11 +2845,21 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.7.0: +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.7.0: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== +semver@^6.1.2, 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" @@ -2366,7 +2897,7 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -signal-exit@^3.0.0: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= @@ -2376,6 +2907,15 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -2534,6 +3074,15 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.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" + string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" @@ -2562,13 +3111,20 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.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@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -2603,6 +3159,11 @@ strip-json-comments@2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" @@ -2617,6 +3178,16 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + tempfile@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" @@ -2630,6 +3201,11 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + through2@^2.0.0, through2@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -2645,11 +3221,18 @@ through2@^3.0.0: dependencies: readable-stream "2 || 3" -through@2, "through@>=2.2.7 <3": +through@2, "through@>=2.2.7 <3", through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + 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" @@ -2701,100 +3284,35 @@ ts-node@^8.1.0: source-map-support "^0.5.6" yn "^3.0.0" -tslib@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" - integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== - -tslib@^1.7.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - -tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tslint-consistent-codestyle@^1.11.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.1.tgz#a0c5cd5a5860d40b659c490d8013c5732e02af8c" - integrity sha512-38Y3Dz4zcABe/PlPAQSGNEWPGVq0OzcIQR7SEU6dNujp/SgvhxhJOhIhI9gY4r0I3/TNtvVQwARWor9O9LPZWg== - dependencies: - "@fimbul/bifrost" "^0.17.0" - tslib "^1.7.1" - tsutils "^2.29.0" - -tslint-eslint-rules@^5.3.1, tslint-eslint-rules@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" - integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w== - dependencies: - doctrine "0.7.2" - tslib "1.9.0" - tsutils "^3.0.0" - -tslint-microsoft-contrib@^5.0.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz#a6286839f800e2591d041ea2800c77487844ad81" - integrity sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA== - dependencies: - tsutils "^2.27.2 <2.29.0" - -tslint-xo@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/tslint-xo/-/tslint-xo-0.9.0.tgz#e1faa505fecd5ac705460fc9f5ca417c3036c14f" - integrity sha512-Zk5jBdQVUaHEmR9TUoh1TJOjjCr7/nRplA+jDZBvucyBMx65pt0unTr6H/0HvrtSlucFvOMYsyBZE1W8b4AOig== - dependencies: - tslint-consistent-codestyle "^1.11.0" - tslint-eslint-rules "^5.3.1" - tslint-microsoft-contrib "^5.0.2" - -tslint@^5.16.0: - version "5.18.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.18.0.tgz#f61a6ddcf372344ac5e41708095bbf043a147ac6" - integrity sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^3.2.0" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.1" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.29.0" - -"tsutils@^2.27.2 <2.29.0": - version "2.28.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1" - integrity sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA== - dependencies: - tslib "^1.8.1" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== dependencies: tslib "^1.8.1" -tsutils@^3.0.0, tsutils@^3.5.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.10.0.tgz#6f1c95c94606e098592b0dff06590cf9659227d6" - integrity sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q== +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: - tslib "^1.8.1" + prelude-ls "~1.1.2" type-detect@^4.0.0, type-detect@^4.0.5: 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.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + typescript@^3.4.5: version "3.5.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" @@ -2831,6 +3349,13 @@ unset-value@^1.0.0: 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" @@ -2851,6 +3376,11 @@ uuid@^2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + 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" @@ -2878,6 +3408,11 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" +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== + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -2905,6 +3440,13 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"