mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
[tslint] lint typescript code (#19105)
* [tslint] lint typescript code * [tslint] filter projects when running specific project * [dev/ts] use more explicit types * [dev/ts] add note about why using glob * [dev/ts] rely on ts, use fewer getters
This commit is contained in:
parent
0485ebb7c7
commit
4c2a90dbdd
27 changed files with 588 additions and 75 deletions
14
package.json
14
package.json
|
@ -61,8 +61,8 @@
|
|||
"debug-break": "node --nolazy --inspect-brk scripts/kibana --dev",
|
||||
"precommit": "node scripts/precommit_hook",
|
||||
"karma": "karma start",
|
||||
"lint": "echo 'use `node scripts/eslint`' && false",
|
||||
"lintroller": "echo 'use `node scripts/eslint --fix`' && false",
|
||||
"lint": "echo 'use `node scripts/eslint` and/or `node scripts/tslint`' && false",
|
||||
"lintroller": "echo 'use `node scripts/eslint --fix` and/or `node scripts/tslint --fix`' && false",
|
||||
"makelogs": "echo 'use `node scripts/makelogs`' && false",
|
||||
"mocha": "echo 'use `node scripts/mocha`' && false",
|
||||
"sterilize": "grunt sterilize",
|
||||
|
@ -226,7 +226,11 @@
|
|||
"@kbn/eslint-plugin-license-header": "link:packages/kbn-eslint-plugin-license-header",
|
||||
"@kbn/plugin-generator": "link:packages/kbn-plugin-generator",
|
||||
"@kbn/test": "link:packages/kbn-test",
|
||||
"@types/globby": "^6.1.0",
|
||||
"@types/eslint": "^4.16.2",
|
||||
"@types/execa": "^0.9.0",
|
||||
"@types/getopts": "^2.0.0",
|
||||
"@types/glob": "^5.0.35",
|
||||
"@types/listr": "^0.13.0",
|
||||
"@types/minimatch": "^2.0.29",
|
||||
"angular-mocks": "1.4.7",
|
||||
"babel-eslint": "8.1.2",
|
||||
|
@ -283,6 +287,7 @@
|
|||
"karma-safari-launcher": "1.0.0",
|
||||
"leadfoot": "1.7.5",
|
||||
"license-checker": "^16.0.0",
|
||||
"listr": "^0.14.1",
|
||||
"load-grunt-config": "0.19.2",
|
||||
"makelogs": "^4.0.5",
|
||||
"marked-text-renderer": "0.1.0",
|
||||
|
@ -305,6 +310,9 @@
|
|||
"ts-jest": "^22.4.6",
|
||||
"ts-loader": "^3.5.0",
|
||||
"ts-node": "^6.0.3",
|
||||
"tslint": "^5.10.0",
|
||||
"tslint-config-prettier": "^1.12.0",
|
||||
"tslint-plugin-prettier": "^1.3.0",
|
||||
"typescript": "^2.8.3",
|
||||
"vinyl-fs": "^3.0.2",
|
||||
"xml2js": "^0.4.19",
|
||||
|
|
18
packages/kbn-dev-utils/index.d.ts
vendored
Normal file
18
packages/kbn-dev-utils/index.d.ts
vendored
Normal file
|
@ -0,0 +1,18 @@
|
|||
import { Readable } from 'stream';
|
||||
|
||||
type LogLevel = 'silent' | 'error' | 'warning' | 'info' | 'debug' | 'verbose';
|
||||
|
||||
export class ToolingLog extends Readable {
|
||||
public verbose(...args: any[]): void;
|
||||
public debug(...args: any[]): void;
|
||||
public info(...args: any[]): void;
|
||||
public success(...args: any[]): void;
|
||||
public warning(...args: any[]): void;
|
||||
public error(errOrMsg: string | Error): void;
|
||||
public write(...args: any[]): void;
|
||||
public indent(spaces: number): void;
|
||||
public getLevel(): LogLevel;
|
||||
public setLevel(level: LogLevel): void;
|
||||
}
|
||||
|
||||
export function createToolingLog(level?: LogLevel): ToolingLog;
|
6
packages/kbn-dev-utils/tsconfig.json
Normal file
6
packages/kbn-dev-utils/tsconfig.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"include": [
|
||||
"index.d.ts"
|
||||
],
|
||||
}
|
19
packages/kbn-pm/tslint.yaml
Normal file
19
packages/kbn-pm/tslint.yaml
Normal file
|
@ -0,0 +1,19 @@
|
|||
extends: ../../tslint.yaml
|
||||
|
||||
rules:
|
||||
max-classes-per-file: false
|
||||
interface-name: false
|
||||
variable-name: false
|
||||
no-empty: false
|
||||
object-literal-sort-keys: false
|
||||
member-ordering: false
|
||||
no-console: false
|
||||
only-arrow-functions: false
|
||||
no-shadowed-variable: false
|
||||
no-empty-interface: false
|
||||
ordered-imports: false
|
||||
interface-over-type-literal: false
|
||||
prettier: false
|
||||
prefer-const: false
|
||||
member-access: false
|
||||
no-unused-variable: false
|
14
packages/kbn-system-loader/tslint.yaml
Normal file
14
packages/kbn-system-loader/tslint.yaml
Normal file
|
@ -0,0 +1,14 @@
|
|||
extends: ../../tslint.yaml
|
||||
|
||||
rules:
|
||||
max-classes-per-file: false
|
||||
interface-name: false
|
||||
variable-name: false
|
||||
no-empty: false
|
||||
object-literal-sort-keys: false
|
||||
member-ordering: false
|
||||
member-access: false
|
||||
ordered-imports: false
|
||||
interface-over-type-literal: false
|
||||
array-type: false
|
||||
prefer-const: false
|
2
scripts/tslint.js
Normal file
2
scripts/tslint.js
Normal file
|
@ -0,0 +1,2 @@
|
|||
require('../src/babel-register');
|
||||
require('../src/dev/tslint').runTslintCli();
|
|
@ -25,10 +25,10 @@ export function lintFiles(log, files) {
|
|||
if (report.warningCount > 0) failTypes.push('warning');
|
||||
|
||||
if (!failTypes.length) {
|
||||
log.success('%d files linted successfully', files.length);
|
||||
log.success('[eslint] %d files linted successfully', files.length);
|
||||
return;
|
||||
}
|
||||
|
||||
log.error(cli.getFormatter()(report.results));
|
||||
throw createFailError(`eslint ${failTypes.join(' & ')}`, 1);
|
||||
throw createFailError(`[eslint] ${failTypes.join(' & ')}`, 1);
|
||||
}
|
||||
|
|
|
@ -18,11 +18,11 @@ export function pickFilesToLint(log, files) {
|
|||
const path = file.getRelativePath();
|
||||
|
||||
if (cli.isPathIgnored(path)) {
|
||||
log.warning(`%j ignored by .eslintignore`, file);
|
||||
log.warning(`[eslint] %j ignored by .eslintignore`, file);
|
||||
return false;
|
||||
}
|
||||
|
||||
log.debug('linting %j', file);
|
||||
log.debug('[eslint] linting %j', file);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import { getCacheKey, install, process } from 'ts-jest';
|
||||
import { JestConfig, TransformOptions } from 'ts-jest/dist/jest-types';
|
||||
|
||||
import { transform } from 'typescript';
|
||||
import { findProjectForAbsolutePath } from '../typescript';
|
||||
import { getTsProjectForAbsolutePath } from '../typescript';
|
||||
|
||||
function extendJestConfigJSON(jestConfigJSON: string, filePath: string) {
|
||||
const jestConfig = JSON.parse(jestConfigJSON) as JestConfig;
|
||||
|
@ -15,20 +14,30 @@ function extendJestConfig(jestConfig: JestConfig, filePath: string) {
|
|||
globals: {
|
||||
...(jestConfig.globals || {}),
|
||||
'ts-jest': {
|
||||
tsConfigFile: findProjectForAbsolutePath(filePath).getTsConfigPath(),
|
||||
skipBabel: true,
|
||||
tsConfigFile: getTsProjectForAbsolutePath(filePath).tsConfigPath,
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
process(src: string, filePath: string, jestConfig: JestConfig, transformOptions: TransformOptions) {
|
||||
process(
|
||||
src: string,
|
||||
filePath: string,
|
||||
jestConfig: JestConfig,
|
||||
transformOptions: TransformOptions
|
||||
) {
|
||||
const extendedConfig = extendJestConfig(jestConfig, filePath);
|
||||
return process(src, filePath, extendedConfig, transformOptions);
|
||||
},
|
||||
|
||||
getCacheKey(src: string, filePath: string, jestConfigJSON: string, transformOptions: TransformOptions) {
|
||||
getCacheKey(
|
||||
src: string,
|
||||
filePath: string,
|
||||
jestConfigJSON: string,
|
||||
transformOptions: TransformOptions
|
||||
) {
|
||||
const extendedConfigJSON = extendJestConfigJSON(jestConfigJSON, filePath);
|
||||
return getCacheKey(src, filePath, extendedConfigJSON, transformOptions);
|
||||
},
|
||||
|
|
|
@ -20,6 +20,7 @@ export const IGNORE_FILE_GLOBS = [
|
|||
'**/.*',
|
||||
'**/{webpackShims,__mocks__}/**/*',
|
||||
'x-pack/docs/**/*',
|
||||
'src/dev/tslint/rules/*',
|
||||
];
|
||||
|
||||
|
||||
|
|
1
src/dev/run/index.d.ts
vendored
Normal file
1
src/dev/run/index.d.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
export function createFailError(msg: string, exitCode: number): Error;
|
|
@ -1,10 +1,17 @@
|
|||
import { run } from './run';
|
||||
|
||||
import { lintFiles, pickFilesToLint } from './eslint';
|
||||
import * as Eslint from './eslint';
|
||||
import * as Tslint from './tslint';
|
||||
import { getFilesForCommit, checkFileCasing } from './precommit_hook';
|
||||
|
||||
run(async ({ log }) => {
|
||||
const files = await getFilesForCommit();
|
||||
await checkFileCasing(log, files);
|
||||
await lintFiles(log, pickFilesToLint(log, files));
|
||||
|
||||
for (const Linter of [Eslint, Tslint]) {
|
||||
const filesToLint = Linter.pickFilesToLint(log, files);
|
||||
if (filesToLint.length > 0) {
|
||||
await Linter.lintFiles(log, filesToLint);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
3
src/dev/tslint/index.ts
Normal file
3
src/dev/tslint/index.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
export { runTslintCli } from './run_tslint_cli';
|
||||
export { lintFiles } from './lint_files';
|
||||
export { pickFilesToLint } from './pick_files_to_lint';
|
63
src/dev/tslint/lint_files.ts
Normal file
63
src/dev/tslint/lint_files.ts
Normal file
|
@ -0,0 +1,63 @@
|
|||
import { run } from 'tslint/lib/runner';
|
||||
|
||||
import { ToolingLog } from '@kbn/dev-utils';
|
||||
import { File } from '../file';
|
||||
import { createFailError } from '../run';
|
||||
import { getTsProjectForAbsolutePath, Project } from '../typescript';
|
||||
|
||||
function groupFilesByProject(files: File[]) {
|
||||
const filesByProject: Map<Project, File[]> = new Map();
|
||||
|
||||
files.forEach(file => {
|
||||
const project = getTsProjectForAbsolutePath(file.getAbsolutePath());
|
||||
const filesForProject = filesByProject.get(project);
|
||||
|
||||
if (!filesForProject) {
|
||||
filesByProject.set(project, [file]);
|
||||
} else {
|
||||
filesForProject.push(file);
|
||||
}
|
||||
});
|
||||
|
||||
return filesByProject;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lints a list of files with eslint. eslint reports are written to the log
|
||||
* and a FailError is thrown when linting errors occur.
|
||||
*
|
||||
* @param {ToolingLog} log
|
||||
* @param {Array<File>} files
|
||||
* @return {undefined}
|
||||
*/
|
||||
export async function lintFiles(log: ToolingLog, files: File[]) {
|
||||
for (const [project, filesInProject] of groupFilesByProject(files)) {
|
||||
const exitCode = await run(
|
||||
{
|
||||
exclude: [],
|
||||
files: filesInProject.map(f => f.getAbsolutePath()),
|
||||
fix: false,
|
||||
format: 'stylish',
|
||||
project: project.tsConfigPath,
|
||||
},
|
||||
{
|
||||
log(m: string) {
|
||||
log.write(m);
|
||||
},
|
||||
error(m: string) {
|
||||
log.error(m);
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
if (exitCode > 0) {
|
||||
throw createFailError(`[tslint] failure`, 1);
|
||||
} else {
|
||||
log.success(
|
||||
'[tslint/%s] %d files linted successfully',
|
||||
project.name,
|
||||
files.length
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
7
src/dev/tslint/pick_files_to_lint.ts
Normal file
7
src/dev/tslint/pick_files_to_lint.ts
Normal file
|
@ -0,0 +1,7 @@
|
|||
import { ToolingLog } from '@kbn/dev-utils';
|
||||
|
||||
import { File } from '../file';
|
||||
|
||||
export function pickFilesToLint(log: ToolingLog, files: File[]) {
|
||||
return files.filter(file => file.isTypescript());
|
||||
}
|
29
src/dev/tslint/rules/requireLicenseHeaderRule.js
Normal file
29
src/dev/tslint/rules/requireLicenseHeaderRule.js
Normal file
|
@ -0,0 +1,29 @@
|
|||
const Lint = require('tslint');
|
||||
|
||||
const FAILURE_STRING = 'File must start with a license header';
|
||||
const RULE_NAME = 'require-license-header';
|
||||
|
||||
exports.Rule = class extends Lint.Rules.AbstractRule {
|
||||
apply(sourceFile) {
|
||||
const [headerText] = this.getOptions().ruleArguments;
|
||||
|
||||
if (!headerText) {
|
||||
throw new Error(`${RULE_NAME} requires a single argument containing the header text`);
|
||||
}
|
||||
|
||||
if (sourceFile.text.startsWith(headerText)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [
|
||||
new Lint.RuleFailure(
|
||||
sourceFile,
|
||||
0,
|
||||
0,
|
||||
FAILURE_STRING,
|
||||
RULE_NAME,
|
||||
new Lint.Replacement(0, 0, `${headerText}\n\n`)
|
||||
)
|
||||
];
|
||||
}
|
||||
};
|
69
src/dev/tslint/run_tslint_cli.ts
Normal file
69
src/dev/tslint/run_tslint_cli.ts
Normal file
|
@ -0,0 +1,69 @@
|
|||
import { resolve } from 'path';
|
||||
|
||||
import { createToolingLog } from '@kbn/dev-utils';
|
||||
import chalk from 'chalk';
|
||||
import execa from 'execa';
|
||||
import getopts from 'getopts';
|
||||
import Listr from 'listr';
|
||||
|
||||
import { Project, PROJECTS } from '../typescript';
|
||||
|
||||
class LintFailure {
|
||||
constructor(public project: Project, public error: execa.ExecaError) {}
|
||||
}
|
||||
|
||||
export function runTslintCli() {
|
||||
const log = createToolingLog('info');
|
||||
log.pipe(process.stdout);
|
||||
|
||||
const opts = getopts(process.argv.slice(2));
|
||||
|
||||
if (!opts.format) {
|
||||
process.argv.push('--format', 'stylish');
|
||||
}
|
||||
|
||||
const list = new Listr(
|
||||
PROJECTS.filter(project => {
|
||||
if (!opts.project) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return resolve(opts.project) === project.tsConfigPath;
|
||||
}).map(project => ({
|
||||
task: () =>
|
||||
execa(
|
||||
'tslint',
|
||||
[...process.argv.slice(2), '--project', project.tsConfigPath],
|
||||
{
|
||||
cwd: project.directory,
|
||||
env: chalk.enabled ? { FORCE_COLOR: 'true' } : {},
|
||||
stdio: ['ignore', 'pipe', 'pipe'],
|
||||
}
|
||||
).catch(error => {
|
||||
throw new LintFailure(project, error);
|
||||
}),
|
||||
title: project.name,
|
||||
})),
|
||||
{
|
||||
concurrent: true,
|
||||
exitOnError: false,
|
||||
}
|
||||
);
|
||||
|
||||
list.run().catch((error: any) => {
|
||||
if (!error.errors) {
|
||||
log.error('Unhandled execption!');
|
||||
log.error(error);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
for (const e of error.errors) {
|
||||
if (e instanceof LintFailure) {
|
||||
log.write('');
|
||||
log.error(`${e.project.name} failed\n${e.error.stdout}`);
|
||||
} else {
|
||||
log.error(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
40
src/dev/typescript/get_ts_project_for_absolute_path.ts
Normal file
40
src/dev/typescript/get_ts_project_for_absolute_path.ts
Normal file
|
@ -0,0 +1,40 @@
|
|||
import { relative } from 'path';
|
||||
|
||||
import { REPO_ROOT } from '../constants';
|
||||
import { PROJECTS } from './projects';
|
||||
|
||||
/**
|
||||
* Finds the `tsconfig.json` Project object for a specific path by looking through
|
||||
* Project instances defined in `src/dev/typescript/projects.ts`. If there isn't exactly one project
|
||||
* that includes the path an error is thrown with, hopefully, a helpful error
|
||||
* message that aims to help developers know how to fix the situation and ensure
|
||||
* that each TypeScript file maps to only a single `tsconfig.json` file.
|
||||
*
|
||||
* @param path Absolute path to a .ts file
|
||||
*/
|
||||
export function getTsProjectForAbsolutePath(path: string) {
|
||||
const relPath = relative(REPO_ROOT, path);
|
||||
const projects = PROJECTS.filter(p => p.isAbsolutePathSelected(path));
|
||||
|
||||
if (!projects.length) {
|
||||
throw new Error(
|
||||
`Unable to find tsconfig.json file selecting "${relPath}". Ensure one exists and it is listed in "src/dev/typescript/projects.ts"`
|
||||
);
|
||||
}
|
||||
|
||||
if (projects.length !== 1) {
|
||||
const configPaths = projects.map(
|
||||
p => `"${relative(REPO_ROOT, p.tsConfigPath)}"`
|
||||
);
|
||||
|
||||
const pathsMsg = `${configPaths.slice(0, -1).join(', ')} or ${
|
||||
configPaths[configPaths.length - 1]
|
||||
}`;
|
||||
|
||||
throw new Error(
|
||||
`"${relPath}" is selected by multiple tsconfig.json files. This probably means the includes/excludes in ${pathsMsg} are too broad and include the code from multiple projects.`
|
||||
);
|
||||
}
|
||||
|
||||
return projects[0];
|
||||
}
|
|
@ -1 +1,5 @@
|
|||
export { findProjectForAbsolutePath } from './project';
|
||||
export { Project } from './project';
|
||||
export { PROJECTS } from './projects';
|
||||
export {
|
||||
getTsProjectForAbsolutePath,
|
||||
} from './get_ts_project_for_absolute_path';
|
||||
|
|
|
@ -1,73 +1,64 @@
|
|||
import { readFileSync } from 'fs';
|
||||
import { basename, dirname, relative, resolve } from 'path';
|
||||
import globby from 'globby';
|
||||
|
||||
import { IMinimatch, Minimatch } from 'minimatch';
|
||||
import { parseConfigFileTextToJson } from 'typescript';
|
||||
|
||||
import { File } from '../file';
|
||||
|
||||
const ROOT_DIR = resolve(__dirname, '../../../');
|
||||
import { REPO_ROOT } from '../constants';
|
||||
|
||||
function makeMatchers(directory: string, patterns: string[]) {
|
||||
return patterns.map(pattern => new Minimatch(resolve(directory, pattern), {
|
||||
dot: true,
|
||||
}));
|
||||
return patterns.map(
|
||||
pattern =>
|
||||
new Minimatch(resolve(directory, pattern), {
|
||||
dot: true,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function parseTsConfig(path: string) {
|
||||
const { error, config } = parseConfigFileTextToJson(
|
||||
path,
|
||||
readFileSync(path, 'utf8')
|
||||
);
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
const files: string[] | undefined = config.files;
|
||||
const include: string[] | undefined = config.include;
|
||||
const exclude: string[] | undefined = config.exclude;
|
||||
return { files, include, exclude };
|
||||
}
|
||||
|
||||
function testMatchers(matchers: IMinimatch[], path: string) {
|
||||
return matchers.some(matcher => matcher.match(path));
|
||||
}
|
||||
|
||||
export class Project {
|
||||
public static fromConfig(path: string) {
|
||||
const { error, config } = parseConfigFileTextToJson(path, readFileSync(path, 'utf8'));
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return new Project(path, config.files, config.include, config.exclude);
|
||||
}
|
||||
|
||||
public directory: string;
|
||||
public name: string;
|
||||
private include: IMinimatch[];
|
||||
private exclude: IMinimatch[];
|
||||
|
||||
constructor(private tsConfigPath: string, files?: string[], include?: string[], exclude: string[] = []) {
|
||||
constructor(public tsConfigPath: string) {
|
||||
const { files, include, exclude = [] } = parseTsConfig(tsConfigPath);
|
||||
|
||||
if (files || !include) {
|
||||
throw new Error(
|
||||
'tsconfig.json files in the Kibana repo must use "include" keys and not "files"'
|
||||
);
|
||||
}
|
||||
|
||||
this.include = makeMatchers(dirname(tsConfigPath), include);
|
||||
this.exclude = makeMatchers(dirname(tsConfigPath), exclude);
|
||||
}
|
||||
|
||||
public getTsConfigPath() {
|
||||
return this.tsConfigPath;
|
||||
this.directory = dirname(this.tsConfigPath);
|
||||
this.name = relative(REPO_ROOT, this.directory) || basename(this.directory);
|
||||
this.include = makeMatchers(this.directory, include);
|
||||
this.exclude = makeMatchers(this.directory, exclude);
|
||||
}
|
||||
|
||||
public isAbsolutePathSelected(path: string) {
|
||||
return this.exclude.some(exc => exc.match(path))
|
||||
return testMatchers(this.exclude, path)
|
||||
? false
|
||||
: this.include.some(inc => inc.match(path));
|
||||
: testMatchers(this.include, path);
|
||||
}
|
||||
}
|
||||
|
||||
export const TS_PROJECTS = globby.sync([
|
||||
'packages/*/tsconfig.json',
|
||||
'tsconfig.json',
|
||||
'x-pack/tsconfig.json'
|
||||
], {
|
||||
cwd: ROOT_DIR,
|
||||
absolute: true,
|
||||
}).map(path => Project.fromConfig(path))
|
||||
|
||||
export function findProjectForAbsolutePath(path: string) {
|
||||
const project = TS_PROJECTS.find(p => p.isAbsolutePathSelected(path));
|
||||
|
||||
if (!project) {
|
||||
throw new Error(
|
||||
`Unable to find tsconfig.json file selecting file "${path}". Ensure one exists and it is listed in "src/dev/typescript/projects.ts"`
|
||||
);
|
||||
}
|
||||
|
||||
return project
|
||||
}
|
||||
|
|
14
src/dev/typescript/projects.ts
Normal file
14
src/dev/typescript/projects.ts
Normal file
|
@ -0,0 +1,14 @@
|
|||
import glob from 'glob';
|
||||
import { resolve } from 'path';
|
||||
|
||||
import { REPO_ROOT } from '../constants';
|
||||
import { Project } from './project';
|
||||
|
||||
export const PROJECTS = [
|
||||
'tsconfig.json',
|
||||
'x-pack/tsconfig.json',
|
||||
// NOTE: using glob.sync rather than glob-all or globby
|
||||
// because it takes less than 10 ms, while the other modules
|
||||
// both took closer to 1000ms.
|
||||
...glob.sync('packages/*/tsconfig.json', { cwd: REPO_ROOT }),
|
||||
].map(path => new Project(resolve(REPO_ROOT, path)));
|
|
@ -70,6 +70,15 @@ module.exports = function (grunt) {
|
|||
]
|
||||
},
|
||||
|
||||
// used by the test and jenkins:unit tasks
|
||||
// runs the tslint script to check for Typescript linting errors
|
||||
tslint: {
|
||||
cmd: process.execPath,
|
||||
args: [
|
||||
require.resolve('../../scripts/tslint')
|
||||
]
|
||||
},
|
||||
|
||||
// used by the test:server task
|
||||
// runs all node.js/server mocha tests
|
||||
mocha: {
|
||||
|
|
|
@ -5,6 +5,7 @@ module.exports = function (grunt) {
|
|||
|
||||
grunt.registerTask('jenkins:unit', [
|
||||
'run:eslint',
|
||||
'run:tslint',
|
||||
'licenses',
|
||||
'verifyDependencyVersions',
|
||||
'run:verifyNotice',
|
||||
|
|
|
@ -100,6 +100,7 @@ module.exports = function (grunt) {
|
|||
|
||||
grunt.task.run(_.compact([
|
||||
!grunt.option('quick') && 'run:eslint',
|
||||
!grunt.option('quick') && 'run:tslint',
|
||||
'licenses',
|
||||
'test:quick',
|
||||
'verifyTranslations',
|
||||
|
|
10
tslint.yaml
Normal file
10
tslint.yaml
Normal file
|
@ -0,0 +1,10 @@
|
|||
extends:
|
||||
- tslint:recommended
|
||||
- tslint-config-prettier
|
||||
|
||||
rulesDirectory:
|
||||
- tslint-plugin-prettier
|
||||
|
||||
rules:
|
||||
prettier: true
|
||||
no-unused-variable: true
|
14
x-pack/tslint.yaml
Normal file
14
x-pack/tslint.yaml
Normal file
|
@ -0,0 +1,14 @@
|
|||
extends: ../tslint.yaml
|
||||
|
||||
rulesDirectory:
|
||||
- ../src/dev/tslint/rules
|
||||
|
||||
rules:
|
||||
require-license-header:
|
||||
- true
|
||||
- |-
|
||||
/*
|
||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||
* or more contributor license agreements. Licensed under the Elastic License;
|
||||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
199
yarn.lock
199
yarn.lock
|
@ -172,17 +172,44 @@
|
|||
call-me-maybe "^1.0.1"
|
||||
glob-to-regexp "^0.3.0"
|
||||
|
||||
"@samverschueren/stream-to-observable@^0.3.0":
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
|
||||
dependencies:
|
||||
any-observable "^0.3.0"
|
||||
|
||||
"@sinonjs/formatio@^2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2"
|
||||
dependencies:
|
||||
samsam "1.3.0"
|
||||
|
||||
"@types/eslint@^4.16.2":
|
||||
version "4.16.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-4.16.2.tgz#30f4f026019eb78a6ef12f276b75cd16ea2afb27"
|
||||
dependencies:
|
||||
"@types/estree" "*"
|
||||
"@types/json-schema" "*"
|
||||
|
||||
"@types/estree@*":
|
||||
version "0.0.39"
|
||||
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
|
||||
|
||||
"@types/events@*":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
|
||||
|
||||
"@types/glob@*":
|
||||
"@types/execa@^0.9.0":
|
||||
version "0.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/execa/-/execa-0.9.0.tgz#9b025d2755f17e80beaf9368c3f4f319d8b0fb93"
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/getopts@^2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/getopts/-/getopts-2.0.0.tgz#8a603370cb367d3192bd8012ad39ab2320b5b476"
|
||||
|
||||
"@types/glob@^5.0.35":
|
||||
version "5.0.35"
|
||||
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a"
|
||||
dependencies:
|
||||
|
@ -190,16 +217,20 @@
|
|||
"@types/minimatch" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/globby@^6.1.0":
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/globby/-/globby-6.1.0.tgz#7c25b975512a89effea2a656ca8cf6db7fb29d11"
|
||||
dependencies:
|
||||
"@types/glob" "*"
|
||||
"@types/json-schema@*":
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-6.0.1.tgz#a761975746f1c1b2579c62e3a4b5e88f986f7e2e"
|
||||
|
||||
"@types/json-stable-stringify@^1.0.32":
|
||||
version "1.0.32"
|
||||
resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.32.tgz#121f6917c4389db3923640b2e68de5fa64dda88e"
|
||||
|
||||
"@types/listr@^0.13.0":
|
||||
version "0.13.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/listr/-/listr-0.13.0.tgz#6250bc4a04123cafa24fc73d1b880653a6ae6721"
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/minimatch@*":
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
|
||||
|
@ -446,7 +477,7 @@ ansi-colors@^1.0.1:
|
|||
dependencies:
|
||||
ansi-wrap "^0.1.0"
|
||||
|
||||
ansi-escapes@^1.1.0:
|
||||
ansi-escapes@^1.0.0, ansi-escapes@^1.1.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
|
||||
|
||||
|
@ -488,6 +519,10 @@ any-observable@^0.2.0:
|
|||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242"
|
||||
|
||||
any-observable@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b"
|
||||
|
||||
anymatch@^1.3.0:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
|
||||
|
@ -2380,7 +2415,7 @@ cli-boxes@^1.0.0:
|
|||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
|
||||
|
||||
cli-cursor@^1.0.1:
|
||||
cli-cursor@^1.0.1, cli-cursor@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
|
||||
dependencies:
|
||||
|
@ -2392,10 +2427,21 @@ cli-cursor@^2.1.0:
|
|||
dependencies:
|
||||
restore-cursor "^2.0.0"
|
||||
|
||||
cli-spinners@^0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c"
|
||||
|
||||
cli-spinners@^1.0.1:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06"
|
||||
|
||||
cli-truncate@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
|
||||
dependencies:
|
||||
slice-ansi "0.0.4"
|
||||
string-width "^1.0.1"
|
||||
|
||||
cli-width@^1.0.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d"
|
||||
|
@ -2571,7 +2617,7 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
|
|||
dependencies:
|
||||
delayed-stream "~1.0.0"
|
||||
|
||||
commander@2:
|
||||
commander@2, commander@^2.12.1:
|
||||
version "2.15.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
||||
|
||||
|
@ -3301,6 +3347,10 @@ dashdash@^1.12.0:
|
|||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
|
||||
date-fns@^1.27.2:
|
||||
version "1.29.0"
|
||||
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
|
||||
|
||||
date-now@^0.1.4:
|
||||
version "0.1.4"
|
||||
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
|
||||
|
@ -3798,6 +3848,10 @@ electron-to-chromium@^1.2.7:
|
|||
version "1.3.39"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.39.tgz#d7a4696409ca0995e2750156da612c221afad84d"
|
||||
|
||||
elegant-spinner@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
|
||||
|
||||
element-resize-detector@^1.1.12:
|
||||
version "1.1.14"
|
||||
resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.1.14.tgz#af064a0a618a820ad570a95c5eec5b77be0128c1"
|
||||
|
@ -4175,7 +4229,7 @@ eslint-plugin-prefer-object-spread@1.2.1:
|
|||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-object-spread/-/eslint-plugin-prefer-object-spread-1.2.1.tgz#27fb91853690cceb3ae6101d9c8aecc6a67a402c"
|
||||
|
||||
eslint-plugin-prettier@^2.6.0:
|
||||
eslint-plugin-prettier@^2.2.0, eslint-plugin-prettier@^2.6.0:
|
||||
version "2.6.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz#33e4e228bdb06142d03c560ce04ec23f6c767dd7"
|
||||
dependencies:
|
||||
|
@ -4671,7 +4725,7 @@ fetch-mock@^5.13.1:
|
|||
node-fetch "^1.3.3"
|
||||
path-to-regexp "^1.7.0"
|
||||
|
||||
figures@^1.3.5:
|
||||
figures@^1.3.5, figures@^1.7.0:
|
||||
version "1.7.0"
|
||||
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
|
||||
dependencies:
|
||||
|
@ -6450,6 +6504,12 @@ is-object@^1.0.1, is-object@~1.0.1:
|
|||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
|
||||
|
||||
is-observable@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e"
|
||||
dependencies:
|
||||
symbol-observable "^1.1.0"
|
||||
|
||||
is-odd@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
|
||||
|
@ -7629,6 +7689,53 @@ linkify-it@^2.0.0:
|
|||
dependencies:
|
||||
uc.micro "^1.0.1"
|
||||
|
||||
listr-silent-renderer@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
|
||||
|
||||
listr-update-renderer@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7"
|
||||
dependencies:
|
||||
chalk "^1.1.3"
|
||||
cli-truncate "^0.2.1"
|
||||
elegant-spinner "^1.0.1"
|
||||
figures "^1.7.0"
|
||||
indent-string "^3.0.0"
|
||||
log-symbols "^1.0.2"
|
||||
log-update "^1.0.2"
|
||||
strip-ansi "^3.0.1"
|
||||
|
||||
listr-verbose-renderer@^0.4.0:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35"
|
||||
dependencies:
|
||||
chalk "^1.1.3"
|
||||
cli-cursor "^1.0.2"
|
||||
date-fns "^1.27.2"
|
||||
figures "^1.7.0"
|
||||
|
||||
listr@^0.14.1:
|
||||
version "0.14.1"
|
||||
resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d"
|
||||
dependencies:
|
||||
"@samverschueren/stream-to-observable" "^0.3.0"
|
||||
cli-truncate "^0.2.1"
|
||||
figures "^1.7.0"
|
||||
indent-string "^2.1.0"
|
||||
is-observable "^1.1.0"
|
||||
is-promise "^2.1.0"
|
||||
is-stream "^1.1.0"
|
||||
listr-silent-renderer "^1.1.1"
|
||||
listr-update-renderer "^0.4.0"
|
||||
listr-verbose-renderer "^0.4.0"
|
||||
log-symbols "^1.0.2"
|
||||
log-update "^1.0.2"
|
||||
ora "^0.2.3"
|
||||
p-map "^1.1.1"
|
||||
rxjs "^6.1.0"
|
||||
strip-ansi "^3.0.1"
|
||||
|
||||
livereload-js@^2.2.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a"
|
||||
|
@ -7998,12 +8105,25 @@ lodash@~4.3.0:
|
|||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.3.0.tgz#efd9c4a6ec53f3b05412429915c3e4824e4d25a4"
|
||||
|
||||
log-symbols@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
|
||||
dependencies:
|
||||
chalk "^1.0.0"
|
||||
|
||||
log-symbols@^2.1.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
|
||||
dependencies:
|
||||
chalk "^2.0.1"
|
||||
|
||||
log-update@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
|
||||
dependencies:
|
||||
ansi-escapes "^1.0.0"
|
||||
cli-cursor "^1.0.2"
|
||||
|
||||
log4js@^0.6.31:
|
||||
version "0.6.38"
|
||||
resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd"
|
||||
|
@ -8932,6 +9052,15 @@ options@>=0.0.5:
|
|||
version "0.0.6"
|
||||
resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
|
||||
|
||||
ora@^0.2.3:
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
|
||||
dependencies:
|
||||
chalk "^1.1.1"
|
||||
cli-cursor "^1.0.2"
|
||||
cli-spinners "^0.1.2"
|
||||
object-assign "^4.0.1"
|
||||
|
||||
ora@^1.3.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5"
|
||||
|
@ -10754,7 +10883,7 @@ resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0, resolve@^1.5.0:
|
|||
dependencies:
|
||||
path-parse "^1.0.5"
|
||||
|
||||
resolve@^1.7.1:
|
||||
resolve@^1.3.2, resolve@^1.7.1:
|
||||
version "1.7.1"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3"
|
||||
dependencies:
|
||||
|
@ -10886,6 +11015,12 @@ rxjs@^5.4.3:
|
|||
dependencies:
|
||||
symbol-observable "1.0.1"
|
||||
|
||||
rxjs@^6.1.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.1.0.tgz#833447de4e4f6427b9cec3e5eb9f56415cd28315"
|
||||
dependencies:
|
||||
tslib "^1.9.0"
|
||||
|
||||
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
|
||||
|
@ -11775,7 +11910,7 @@ symbol-observable@1.0.1:
|
|||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
|
||||
|
||||
symbol-observable@^1.0.1, symbol-observable@^1.0.3:
|
||||
symbol-observable@^1.0.1, symbol-observable@^1.0.3, symbol-observable@^1.1.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
|
||||
|
||||
|
@ -12224,10 +12359,48 @@ ts-node@^6.0.3:
|
|||
source-map-support "^0.5.3"
|
||||
yn "^2.0.0"
|
||||
|
||||
tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1:
|
||||
version "1.9.1"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.1.tgz#a5d1f0532a49221c87755cfcc89ca37197242ba7"
|
||||
|
||||
tslib@^1.9.0:
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
|
||||
|
||||
tslint-config-prettier@^1.12.0:
|
||||
version "1.12.0"
|
||||
resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.12.0.tgz#bc8504f286ecf42b906f3d1126a093114f5729cc"
|
||||
|
||||
tslint-plugin-prettier@^1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/tslint-plugin-prettier/-/tslint-plugin-prettier-1.3.0.tgz#7eb65d19ea786a859501a42491b78c5de2031a3f"
|
||||
dependencies:
|
||||
eslint-plugin-prettier "^2.2.0"
|
||||
tslib "^1.7.1"
|
||||
|
||||
tslint@^5.10.0:
|
||||
version "5.10.0"
|
||||
resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3"
|
||||
dependencies:
|
||||
babel-code-frame "^6.22.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.7.0"
|
||||
minimatch "^3.0.4"
|
||||
resolve "^1.3.2"
|
||||
semver "^5.3.0"
|
||||
tslib "^1.8.0"
|
||||
tsutils "^2.12.1"
|
||||
|
||||
tsutils@^2.12.1:
|
||||
version "2.27.0"
|
||||
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.0.tgz#9efb252b188eaa0ca3ade41dc410d6ce7eaab816"
|
||||
dependencies:
|
||||
tslib "^1.8.1"
|
||||
|
||||
tty-browserify@0.0.0:
|
||||
version "0.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue