From 8e05132c58dd66ff5e16260a0c95c01705e755cd Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Tue, 9 Jul 2019 15:31:57 +0800 Subject: [PATCH 01/26] p --- .vscode/launch.json | 7 + d/P.tsx | 4 + d/cli.js | 130 +++++++++ d/compiler.js | 156 +++++++++++ d/helpers/build-prop-type-interface.js | 190 +++++++++++++ d/helpers/index.js | 197 +++++++++++++ d/index.js | 48 ++++ ...lapse-intersection-interfaces-transform.js | 187 +++++++++++++ ...react-js-make-props-and-state-transform.js | 258 ++++++++++++++++++ ...eact-move-prop-types-to-class-transform.js | 154 +++++++++++ ...-remove-prop-types-assignment-transform.js | 30 ++ .../react-remove-prop-types-import.js | 70 +++++ ...move-static-prop-types-member-transform.js | 59 ++++ ...stateless-function-make-props-transform.js | 133 +++++++++ package.json | 8 +- src/P.js | 5 + tsconfig.json | 8 +- yarn.lock | 19 +- 18 files changed, 1649 insertions(+), 14 deletions(-) create mode 100644 d/P.tsx create mode 100644 d/cli.js create mode 100644 d/compiler.js create mode 100644 d/helpers/build-prop-type-interface.js create mode 100644 d/helpers/index.js create mode 100644 d/index.js create mode 100644 d/transforms/collapse-intersection-interfaces-transform.js create mode 100644 d/transforms/react-js-make-props-and-state-transform.js create mode 100644 d/transforms/react-move-prop-types-to-class-transform.js create mode 100644 d/transforms/react-remove-prop-types-assignment-transform.js create mode 100644 d/transforms/react-remove-prop-types-import.js create mode 100644 d/transforms/react-remove-static-prop-types-member-transform.js create mode 100644 d/transforms/react-stateless-function-make-props-transform.js create mode 100644 src/P.js diff --git a/.vscode/launch.json b/.vscode/launch.json index fff8a01..cdeb78c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,6 +1,13 @@ { "version": "0.2.0", "configurations": [ + { + "type": "node", + "request": "launch", + "name": "node", + "program": "${workspaceFolder}/d/cli", + "args": ["./d/P.js"] + }, { "args": [], "cwd": "${workspaceRoot}", diff --git a/d/P.tsx b/d/P.tsx new file mode 100644 index 0000000..0ec3330 --- /dev/null +++ b/d/P.tsx @@ -0,0 +1,4 @@ +type PanelProps = { + multi?: any; +}; +class Panel extends React.Component {} diff --git a/d/cli.js b/d/cli.js new file mode 100644 index 0000000..a3b0b46 --- /dev/null +++ b/d/cli.js @@ -0,0 +1,130 @@ +#!/usr/bin/env node +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var program = require('commander'); +var glob = require('glob'); +var fs = require('fs'); +var path = require('path'); +var _1 = require('.'); + +// copy file +const filePath = path.join(__dirname, '../src/P.js'); +const content = fs.readFileSync(filePath, 'utf8'); +const newfile = path.join(__dirname, 'P.js'); +fs.writeFileSync(newfile, content); +// end of copy file + +function resolveGlobs(globPatterns) { + var files = []; + function addFile(file) { + file = path.resolve(file); + if (files.indexOf(file) === -1) { + files.push(file); + } + } + globPatterns.forEach(function(pattern) { + if (/[{}*?+\[\]]/.test(pattern)) { + // Smells like globs + glob.sync(pattern, {}).forEach(function(file) { + addFile(file); + }); + } else { + addFile(pattern); + } + }); + return files; +} +program + .version('1.0.0') + .option('--arrow-parens ', 'Include parentheses around a sole arrow function parameter.', 'avoid') + .option('--no-bracket-spacing', 'Do not print spaces between brackets.', false) + .option('--jsx-bracket-same-line', 'Put > on the last line instead of at a new line.', false) + .option('--print-width ', 'The line length where Prettier will try wrap.', 80) + .option('--prose-wrap How to wrap prose. (markdown)', 'preserve') + .option('--no-semi', 'Do not print semicolons, except at the beginning of lines which may need them', false) + .option('--single-quote', 'Use single quotes instead of double quotes.', false) + .option('--tab-width ', 'Number of spaces per indentation level.', 2) + .option('--trailing-comma ', 'Print trailing commas wherever possible when multi-line.', 'none') + .option('--use-tabs', 'Indent with tabs instead of spaces.', false) + .option('--ignore-prettier-errors', 'Ignore (but warn about) errors in Prettier', false) + .option('--keep-original-files', 'Keep original files', false) + .option('--keep-temporary-files', 'Keep temporary files', false) + .usage('[options] ') + .command('* [glob/filename...]') + .action(function(globPatterns) { + var e_1, _a; + var prettierOptions = { + arrowParens: program.arrowParens, + bracketSpacing: !program.noBracketSpacing, + jsxBracketSameLine: !!program.jsxBracketSameLine, + printWidth: parseInt(program.printWidth, 10), + proseWrap: program.proseWrap, + semi: !program.noSemi, + singleQuote: !!program.singleQuote, + tabWidth: parseInt(program.tabWidth, 10), + trailingComma: program.trailingComma, + useTabs: !!program.useTabs, + }; + var compilationOptions = { + ignorePrettierErrors: !!program.ignorePrettierErrors, + }; + var files = resolveGlobs(globPatterns); + if (!files.length) { + throw new Error('Nothing to do. You must provide file names or glob patterns to transform.'); + } + var errors = false; + try { + for ( + var files_1 = __values(files), files_1_1 = files_1.next(); + !files_1_1.done; + files_1_1 = files_1.next() + ) { + var filePath = files_1_1.value; + console.log('Transforming ' + filePath + '...'); + var newPath = filePath.replace(/\.jsx?$/, '.tsx'); + var temporaryPath = filePath.replace(/\.jsx?$/, '_js2ts_' + +new Date() + '.tsx'); + try { + fs.copyFileSync(filePath, temporaryPath); + var result = _1.run(temporaryPath, prettierOptions, compilationOptions); + fs.writeFileSync(newPath, result); + if (!program.keepOriginalFiles) { + fs.unlinkSync(filePath); + } + } catch (error) { + console.warn('Failed to convert ' + filePath); + console.warn(error); + errors = true; + } + if (!program.keepTemporaryFiles) { + if (fs.existsSync(temporaryPath)) { + fs.unlinkSync(temporaryPath); + } + } + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (files_1_1 && !files_1_1.done && (_a = files_1.return)) _a.call(files_1); + } finally { + if (e_1) throw e_1.error; + } + } + if (errors) { + process.exit(1); + } + }); +program.parse(process.argv); diff --git a/d/compiler.js b/d/compiler.js new file mode 100644 index 0000000..0170584 --- /dev/null +++ b/d/compiler.js @@ -0,0 +1,156 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var os = require('os'); +var fs = require('fs'); +var ts = require('typescript'); +var chalk_1 = require('chalk'); +var _ = require('lodash'); +var prettier = require('prettier'); +var detectIndent = require('detect-indent'); +var DEFAULT_COMPILATION_OPTIONS = { + ignorePrettierErrors: false, +}; +exports.DEFAULT_COMPILATION_OPTIONS = DEFAULT_COMPILATION_OPTIONS; +/** + * Compile and return result TypeScript + * @param filePath Path to file to compile + */ +function compile(filePath, factoryFactories, incomingPrettierOptions, compilationOptions) { + if (incomingPrettierOptions === void 0) { + incomingPrettierOptions = {}; + } + if (compilationOptions === void 0) { + compilationOptions = DEFAULT_COMPILATION_OPTIONS; + } + var e_1, _a; + var compilerOptions = { + target: ts.ScriptTarget.ES2017, + module: ts.ModuleKind.ES2015, + }; + var program = ts.createProgram([filePath], compilerOptions); + // `program.getSourceFiles()` will include those imported files, + // like: `import * as a from './file-a'`. + // We should only transform current file. + var sourceFiles = program.getSourceFiles().filter(function(sf) { + return sf.fileName === filePath; + }); + var typeChecker = program.getTypeChecker(); + var result = ts.transform( + sourceFiles, + factoryFactories.map(function(factoryFactory) { + return factoryFactory(typeChecker); + }, compilerOptions), + ); + if (result.diagnostics && result.diagnostics.length) { + console.log( + chalk_1.default.yellow( + '\n ======================= Diagnostics for ' + filePath + ' =======================\n ', + ), + ); + try { + for (var _b = __values(result.diagnostics), _c = _b.next(); !_c.done; _c = _b.next()) { + var diag = _c.value; + if (diag.file && diag.start) { + var pos = diag.file.getLineAndCharacterOfPosition(diag.start); + console.log('(' + pos.line + ', ' + pos.character + ') ' + diag.messageText); + } + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + } + var printer = ts.createPrinter(); + // TODO: fix the index 0 access... What if program have multiple source files? + var printed = printer.printNode(ts.EmitHint.SourceFile, result.transformed[0], sourceFiles[0]); + var inputSource = fs.readFileSync(filePath, 'utf-8'); + var prettierOptions = getPrettierOptions(filePath, inputSource, incomingPrettierOptions); + try { + return prettier.format(printed, prettierOptions); + } catch (prettierError) { + if (compilationOptions.ignorePrettierErrors) { + console.warn('Prettier failed for ' + filePath + ' (ignorePrettierErrors is on):'); + console.warn(prettierError); + return printed; + } + throw prettierError; + } +} +exports.compile = compile; +/** + * Get Prettier options based on style of a JavaScript + * @param filePath Path to source file + * @param source Body of a JavaScript + * @param options Existing prettier option + */ +function getPrettierOptions(filePath, source, options) { + var resolvedOptions = prettier.resolveConfig.sync(filePath); + if (resolvedOptions) { + _.defaults(resolvedOptions, options); + return resolvedOptions; + } + var _a = detectIndent(source), + indentAmount = _a.amount, + indentType = _a.type; + var sourceWidth = getCodeWidth(source, 80); + var semi = getUseOfSemi(source); + var quotations = getQuotation(source); + _.defaults(Object.assign({}, options), { + tabWidth: indentAmount, + useTabs: indentType && indentType === 'tab', + printWidth: sourceWidth, + semi: semi, + singleQuote: quotations === 'single', + }); + return options; +} +exports.getPrettierOptions = getPrettierOptions; +/** + * Given body of a source file, return its code width + * @param source + */ +function getCodeWidth(source, defaultWidth) { + return source.split(os.EOL).reduce(function(result, line) { + return Math.max(result, line.length); + }, defaultWidth); +} +/** + * Detect if a source file is using semicolon + * @todo: use an actual parser. This is not a proper implementation + * @param source + * @return true if code is using semicolons + */ +function getUseOfSemi(source) { + return source.indexOf(';') !== -1; +} +/** + * Detect if a source file is using single quotes or double quotes + * @todo use an actual parser. This is not a proper implementation + * @param source + */ +function getQuotation(source) { + var numberOfSingleQuotes = (source.match(/\'/g) || []).length; + var numberOfDoubleQuotes = (source.match(/\"/g) || []).length; + if (numberOfSingleQuotes > numberOfDoubleQuotes) { + return 'single'; + } + return 'double'; +} diff --git a/d/helpers/build-prop-type-interface.js b/d/helpers/build-prop-type-interface.js new file mode 100644 index 0000000..1928455 --- /dev/null +++ b/d/helpers/build-prop-type-interface.js @@ -0,0 +1,190 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +/** + * Build props interface from propTypes object + * @example + * { + * foo: React.PropTypes.string.isRequired + * } + * + * becomes + * { + * foo: string; + * } + * @param objectLiteral + */ +function buildInterfaceFromPropTypeObjectLiteral(objectLiteral) { + var members = objectLiteral.properties + // We only need to process PropertyAssignment: + // { + // a: 123 // PropertyAssignment + // } + // + // filter out: + // { + // a() {}, // MethodDeclaration + // b, // ShorthandPropertyAssignment + // ...c, // SpreadAssignment + // get d() {}, // AccessorDeclaration + // } + .filter(ts.isPropertyAssignment) + // Ignore children, React types have it + .filter(function(property) { + return property.name.getText() !== 'children'; + }) + .map(function(propertyAssignment) { + var name = propertyAssignment.name.getText(); + var initializer = propertyAssignment.initializer; + var isRequired = isPropTypeRequired(initializer); + var typeExpression = isRequired + ? // We have guaranteed the type in `isPropTypeRequired()` + initializer.expression + : initializer; + var typeValue = getTypeFromReactPropTypeExpression(typeExpression); + return ts.createPropertySignature( + [], + name, + isRequired ? undefined : ts.createToken(ts.SyntaxKind.QuestionToken), + typeValue, + undefined, + ); + }); + return ts.createTypeLiteralNode(members); +} +exports.buildInterfaceFromPropTypeObjectLiteral = buildInterfaceFromPropTypeObjectLiteral; +/** + * Turns React.PropTypes.* into TypeScript type value + * + * @param node React propTypes value + */ +function getTypeFromReactPropTypeExpression(node) { + var result = null; + if (ts.isPropertyAccessExpression(node)) { + /** + * PropTypes.array, + * PropTypes.bool, + * PropTypes.func, + * PropTypes.number, + * PropTypes.object, + * PropTypes.string, + * PropTypes.symbol, (ignore) + * PropTypes.node, + * PropTypes.element, + * PropTypes.any, + */ + var text = node.getText().replace(/React\.PropTypes\./, ''); + if (/string/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + } else if (/any/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + } else if (/array/.test(text)) { + result = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + } else if (/bool/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); + } else if (/number/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); + } else if (/object/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword); + } else if (/node/.test(text)) { + result = ts.createTypeReferenceNode('React.ReactNode', []); + } else if (/element/.test(text)) { + result = ts.createTypeReferenceNode('JSX.Element', []); + } else if (/func/.test(text)) { + var arrayOfAny = ts.createParameter( + [], + [], + ts.createToken(ts.SyntaxKind.DotDotDotToken), + 'args', + undefined, + ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)), + undefined, + ); + result = ts.createFunctionTypeNode([], [arrayOfAny], ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + } + } else if (ts.isCallExpression(node)) { + /** + * PropTypes.instanceOf(), (ignore) + * PropTypes.oneOf(), // only support oneOf([1, 2]), oneOf(['a', 'b']) + * PropTypes.oneOfType(), + * PropTypes.arrayOf(), + * PropTypes.objectOf(), + * PropTypes.shape(), + */ + var text = node.expression.getText(); + if (/oneOf$/.test(text)) { + var argument = node.arguments[0]; + if (ts.isArrayLiteralExpression(argument)) { + if ( + argument.elements.every(function(elm) { + return ts.isStringLiteral(elm) || ts.isNumericLiteral(elm); + }) + ) { + result = ts.createUnionTypeNode( + argument.elements.map(function(elm) { + return ts.createLiteralTypeNode(elm); + }), + ); + } + } + } else if (/oneOfType$/.test(text)) { + var argument = node.arguments[0]; + if (ts.isArrayLiteralExpression(argument)) { + result = ts.createUnionOrIntersectionTypeNode( + ts.SyntaxKind.UnionType, + argument.elements.map(function(elm) { + return getTypeFromReactPropTypeExpression(elm); + }), + ); + } + } else if (/arrayOf$/.test(text)) { + var argument = node.arguments[0]; + if (argument) { + result = ts.createArrayTypeNode(getTypeFromReactPropTypeExpression(argument)); + } + } else if (/objectOf$/.test(text)) { + var argument = node.arguments[0]; + if (argument) { + result = ts.createTypeLiteralNode([ + ts.createIndexSignature( + undefined, + undefined, + [ + ts.createParameter( + undefined, + undefined, + undefined, + 'key', + undefined, + ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + ), + ], + getTypeFromReactPropTypeExpression(argument), + ), + ]); + } + } else if (/shape$/.test(text)) { + var argument = node.arguments[0]; + if (ts.isObjectLiteralExpression(argument)) { + return buildInterfaceFromPropTypeObjectLiteral(argument); + } + } + } + /** + * customProp, + * anything others + */ + if (result === null) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + } + return result; +} +/** + * Decide if node is required + * @param node React propTypes member node + */ +function isPropTypeRequired(node) { + if (!ts.isPropertyAccessExpression(node)) return false; + var text = node.getText().replace(/React\.PropTypes\./, ''); + return /\.isRequired/.test(text); +} diff --git a/d/helpers/index.js b/d/helpers/index.js new file mode 100644 index 0000000..4c2adf9 --- /dev/null +++ b/d/helpers/index.js @@ -0,0 +1,197 @@ +'use strict'; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +__export(require('./build-prop-type-interface')); +/** + * If a class declaration a react class? + * @param classDeclaration + * @param typeChecker + */ +function isReactComponent(classDeclaration, typeChecker) { + // Only classes that extend React.Component + if (!classDeclaration.heritageClauses) { + return false; + } + if (classDeclaration.heritageClauses.length !== 1) { + return false; + } + var firstHeritageClauses = classDeclaration.heritageClauses[0]; + if (firstHeritageClauses.token !== ts.SyntaxKind.ExtendsKeyword) { + return false; + } + var expressionWithTypeArguments = firstHeritageClauses.types[0]; + if (!expressionWithTypeArguments) { + return false; + } + // Try type checker and fallback to node text + var type = typeChecker.getTypeAtLocation(expressionWithTypeArguments); + var typeSymbol = type && type.symbol && type.symbol.name; + if (!typeSymbol) { + typeSymbol = expressionWithTypeArguments.expression.getText(); + } + if (!/React\.Component|Component/.test(typeSymbol)) { + return false; + } + return true; +} +exports.isReactComponent = isReactComponent; +/** + * Determine if a ts.HeritageClause is React HeritageClause + * + * @example `extends React.Component<{}, {}>` is a React HeritageClause + * + * @todo: this is lazy. Use the typeChecker instead + * @param clause + */ +function isReactHeritageClause(clause) { + return ( + clause.token === ts.SyntaxKind.ExtendsKeyword && + clause.types.length === 1 && + ts.isExpressionWithTypeArguments(clause.types[0]) && + /Component/.test(clause.types[0].expression.getText()) + ); +} +exports.isReactHeritageClause = isReactHeritageClause; +/** + * Return true if a statement is a React propType assignment statement + * @example + * SomeComponent.propTypes = { foo: React.PropTypes.string }; + * @param statement + */ +function isReactPropTypeAssignmentStatement(statement) { + return ( + ts.isExpressionStatement(statement) && + ts.isBinaryExpression(statement.expression) && + statement.expression.operatorToken.kind === ts.SyntaxKind.FirstAssignment && + ts.isPropertyAccessExpression(statement.expression.left) && + /\.propTypes$|\.propTypes\..+$/.test(statement.expression.left.getText()) + ); +} +exports.isReactPropTypeAssignmentStatement = isReactPropTypeAssignmentStatement; +/** + * Does class member have a "static" member? + * @param classMember + */ +function hasStaticModifier(classMember) { + if (!classMember.modifiers) { + return false; + } + var staticModifier = _.find(classMember.modifiers, function(modifier) { + return modifier.kind == ts.SyntaxKind.StaticKeyword; + }); + return staticModifier !== undefined; +} +exports.hasStaticModifier = hasStaticModifier; +/** + * Is class member a React "propTypes" member? + * @param classMember + * @param sourceFile + */ +function isPropTypesMember(classMember, sourceFile) { + try { + var name_1 = + classMember.name !== undefined && ts.isIdentifier(classMember.name) ? classMember.name.escapedText : null; + return name_1 === 'propTypes'; + } catch (e) { + return false; + } +} +exports.isPropTypesMember = isPropTypesMember; +/** + * Get component name off of a propType assignment statement + * @param propTypeAssignment + * @param sourceFile + */ +function getComponentName(propTypeAssignment, sourceFile) { + var text = propTypeAssignment.getText(sourceFile); + return text.substr(0, text.indexOf('.')); +} +exports.getComponentName = getComponentName; +/** + * Convert react stateless function to arrow function + * @example + * Before: + * function Hello(message) { + * return
{message}
+ * } + * + * After: + * const Hello = message => { + * return
{message}
+ * } + */ +function convertReactStatelessFunctionToArrowFunction(statelessFunc) { + if (ts.isVariableStatement(statelessFunc)) return statelessFunc; + var funcName = statelessFunc.name || 'Component'; + var funcBody = statelessFunc.body || ts.createBlock([]); + var initializer = ts.createArrowFunction( + undefined, + undefined, + statelessFunc.parameters, + undefined, + undefined, + funcBody, + ); + return ts.createVariableStatement( + statelessFunc.modifiers, + ts.createVariableDeclarationList( + [ts.createVariableDeclaration(funcName, undefined, initializer)], + ts.NodeFlags.Const, + ), + ); +} +exports.convertReactStatelessFunctionToArrowFunction = convertReactStatelessFunctionToArrowFunction; +/** + * Insert an item in middle of an array after a specific item + * @param collection + * @param afterItem + * @param newItem + */ +function insertAfter(collection, afterItem, newItem) { + var index = _.indexOf(collection, afterItem) + 1; + return _.slice(collection, 0, index) + .concat(newItem) + .concat(_.slice(collection, index)); +} +exports.insertAfter = insertAfter; +/** + * Insert an item in middle of an array before a specific item + * @param collection + * @param beforeItem + * @param newItem + */ +function insertBefore(collection, beforeItem, newItems) { + var index = _.indexOf(collection, beforeItem); + return _.slice(collection, 0, index) + .concat(newItems) + .concat(_.slice(collection, index)); +} +exports.insertBefore = insertBefore; +/** + * Replace an item in a collection with another item + * @param collection + * @param item + * @param newItem + */ +function replaceItem(collection, item, newItem) { + var index = _.indexOf(collection, item); + return _.slice(collection, 0, index) + .concat(newItem) + .concat(_.slice(collection, index + 1)); +} +exports.replaceItem = replaceItem; +/** + * Remove an item from a collection + * @param collection + * @param item + * @param newItem + */ +function removeItem(collection, item) { + var index = _.indexOf(collection, item); + return _.slice(collection, 0, index).concat(_.slice(collection, index + 1)); +} +exports.removeItem = removeItem; diff --git a/d/index.js b/d/index.js new file mode 100644 index 0000000..45c3672 --- /dev/null +++ b/d/index.js @@ -0,0 +1,48 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var compiler_1 = require('./compiler'); +exports.compile = compiler_1.compile; +var react_js_make_props_and_state_transform_1 = require('./transforms/react-js-make-props-and-state-transform'); +exports.reactJSMakePropsAndStateInterfaceTransformFactoryFactory = + react_js_make_props_and_state_transform_1.reactJSMakePropsAndStateInterfaceTransformFactoryFactory; +var react_remove_prop_types_assignment_transform_1 = require('./transforms/react-remove-prop-types-assignment-transform'); +exports.reactRemovePropTypesAssignmentTransformFactoryFactory = + react_remove_prop_types_assignment_transform_1.reactRemovePropTypesAssignmentTransformFactoryFactory; +var react_move_prop_types_to_class_transform_1 = require('./transforms/react-move-prop-types-to-class-transform'); +exports.reactMovePropTypesToClassTransformFactoryFactory = + react_move_prop_types_to_class_transform_1.reactMovePropTypesToClassTransformFactoryFactory; +var collapse_intersection_interfaces_transform_1 = require('./transforms/collapse-intersection-interfaces-transform'); +exports.collapseIntersectionInterfacesTransformFactoryFactory = + collapse_intersection_interfaces_transform_1.collapseIntersectionInterfacesTransformFactoryFactory; +var react_remove_static_prop_types_member_transform_1 = require('./transforms/react-remove-static-prop-types-member-transform'); +exports.reactRemoveStaticPropTypesMemberTransformFactoryFactory = + react_remove_static_prop_types_member_transform_1.reactRemoveStaticPropTypesMemberTransformFactoryFactory; +var react_stateless_function_make_props_transform_1 = require('./transforms/react-stateless-function-make-props-transform'); +exports.reactStatelessFunctionMakePropsTransformFactoryFactory = + react_stateless_function_make_props_transform_1.reactStatelessFunctionMakePropsTransformFactoryFactory; +var react_remove_prop_types_import_1 = require('./transforms/react-remove-prop-types-import'); +exports.reactRemovePropTypesImportTransformFactoryFactory = + react_remove_prop_types_import_1.reactRemovePropTypesImportTransformFactoryFactory; +exports.allTransforms = [ + react_move_prop_types_to_class_transform_1.reactMovePropTypesToClassTransformFactoryFactory, + react_js_make_props_and_state_transform_1.reactJSMakePropsAndStateInterfaceTransformFactoryFactory, + react_stateless_function_make_props_transform_1.reactStatelessFunctionMakePropsTransformFactoryFactory, + collapse_intersection_interfaces_transform_1.collapseIntersectionInterfacesTransformFactoryFactory, + react_remove_prop_types_assignment_transform_1.reactRemovePropTypesAssignmentTransformFactoryFactory, + react_remove_static_prop_types_member_transform_1.reactRemoveStaticPropTypesMemberTransformFactoryFactory, + react_remove_prop_types_import_1.reactRemovePropTypesImportTransformFactoryFactory, +]; +/** + * Run React JavaScript to TypeScript transform for file at `filePath` + * @param filePath + */ +function run(filePath, prettierOptions, compilationOptions) { + if (prettierOptions === void 0) { + prettierOptions = {}; + } + if (compilationOptions === void 0) { + compilationOptions = compiler_1.DEFAULT_COMPILATION_OPTIONS; + } + return compiler_1.compile(filePath, exports.allTransforms, prettierOptions, compilationOptions); +} +exports.run = run; diff --git a/d/transforms/collapse-intersection-interfaces-transform.js b/d/transforms/collapse-intersection-interfaces-transform.js new file mode 100644 index 0000000..90e8df4 --- /dev/null +++ b/d/transforms/collapse-intersection-interfaces-transform.js @@ -0,0 +1,187 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +var __read = + (this && this.__read) || + function(o, n) { + var m = typeof Symbol === 'function' && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), + r, + ar = [], + e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } catch (error) { + e = { error: error }; + } finally { + try { + if (r && !r.done && (m = i['return'])) m.call(i); + } finally { + if (e) throw e.error; + } + } + return ar; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +/** + * Collapse unnecessary intersections between type literals + * + * @example + * Before: + * type Foo = {foo: string;} & {bar: number;} + * + * After + * type Foo = {foo: string; bar: number;} + */ +function collapseIntersectionInterfacesTransformFactoryFactory(typeChecker) { + return function collapseIntersectionInterfacesTransformFactory(context) { + return function collapseIntersectionInterfacesTransform(sourceFile) { + var visited = ts.visitEachChild(sourceFile, visitor, context); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + function visitor(node) { + if (ts.isTypeAliasDeclaration(node)) { + return visitTypeAliasDeclaration(node); + } + return node; + } + function visitTypeAliasDeclaration(node) { + if (ts.isIntersectionTypeNode(node.type)) { + return ts.createTypeAliasDeclaration( + [], + [], + node.name.text, + [], + visitIntersectionTypeNode(node.type), + ); + } + return node; + } + function visitIntersectionTypeNode(node) { + var e_1, _a; + // Only intersection of type literals can be colapsed. + // We are currently ignoring intersections such as `{foo: string} & {bar: string} & TypeRef` + // TODO: handle mix of type references and multiple literal types + if ( + !node.types.every(function(typeNode) { + return ts.isTypeLiteralNode(typeNode); + }) + ) { + return node; + } + // We need cast `node.type.types` to `ts.NodeArray` + // because TypeScript can't figure out `node.type.types.every(ts.isTypeLiteralNode)` + var types = node.types; + // Build a map of member names to all of types found in intersectioning type literals + // For instance {foo: string, bar: number} & { foo: number } will result in a map like this: + // Map { + // 'foo' => Set { 'string', 'number' }, + // 'bar' => Set { 'number' } + // } + var membersMap = new Map(); + // A sepecial member of type literal nodes is index signitures which don't have a name + // We use this symbol to track it in our members map + var INDEX_SIGNITUTRE_MEMBER = Symbol('Index signiture member'); + // Keep a reference of first index signiture member parameters. (ignore rest) + var indexMemberParameter = null; + // Iterate through all of type literal nodes members and add them to the members map + types.forEach(function(typeNode) { + typeNode.members.forEach(function(member) { + if (ts.isIndexSignatureDeclaration(member)) { + if (member.type !== undefined) { + if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) { + membersMap.get(INDEX_SIGNITUTRE_MEMBER).add(member.type); + } else { + indexMemberParameter = member.parameters; + membersMap.set(INDEX_SIGNITUTRE_MEMBER, new Set([member.type])); + } + } + } else if (ts.isPropertySignature(member)) { + if (member.type !== undefined) { + var memberName = member.name.getText(sourceFile); + // For unknown reasons, member.name.getText() is returning nothing in some cases + // This is probably because previous transformers did something with the AST that + // index of text string of member identifier is lost + // TODO: investigate + if (!memberName) { + memberName = member.name.escapedText; + } + if (membersMap.has(memberName)) { + membersMap.get(memberName).add(member.type); + } else { + membersMap.set(memberName, new Set([member.type])); + } + } + } + }); + }); + // Result type literal members list + var finalMembers = []; + try { + // Put together the map into a type literal that has member per each map entery and type of that + // member is a union of all types in vlues for that member name in members map + // if a member has only one type, create a simple type literal for it + for (var _b = __values(membersMap.entries()), _c = _b.next(); !_c.done; _c = _b.next()) { + var _d = __read(_c.value, 2), + name_1 = _d[0], + types_1 = _d[1]; + if (typeof name_1 === 'symbol') { + continue; + } + // if for this name there is only one type found use the first type, otherwise make a union of all types + var resultType = + types_1.size === 1 ? Array.from(types_1)[0] : createUnionType(Array.from(types_1)); + finalMembers.push(ts.createPropertySignature([], name_1, undefined, resultType, undefined)); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + // Handle index signiture member + if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) { + var indexTypes = Array.from(membersMap.get(INDEX_SIGNITUTRE_MEMBER)); + var indexType = indexTypes[0]; + if (indexTypes.length > 1) { + indexType = createUnionType(indexTypes); + } + var indexSigniture = ts.createIndexSignature([], [], indexMemberParameter, indexType); + finalMembers.push(indexSigniture); + } + // Generate one single type literal node + return ts.createTypeLiteralNode(finalMembers); + } + /** + * Create a union type from multiple type nodes + * @param types + */ + function createUnionType(types) { + // first dedupe literal types + // TODO: this only works if all types are primitive types like string or number + var uniqueTypes = _.uniqBy(types, function(type) { + return type.kind; + }); + return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.UnionType, uniqueTypes); + } + }; + }; +} +exports.collapseIntersectionInterfacesTransformFactoryFactory = collapseIntersectionInterfacesTransformFactoryFactory; diff --git a/d/transforms/react-js-make-props-and-state-transform.js b/d/transforms/react-js-make-props-and-state-transform.js new file mode 100644 index 0000000..5d6d935 --- /dev/null +++ b/d/transforms/react-js-make-props-and-state-transform.js @@ -0,0 +1,258 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +var helpers = require('../helpers'); +/** + * Get transform for transforming React code originally written in JS which does not have + * props and state generic types + * This transform will remove React component static "propTypes" member during transform + */ +function reactJSMakePropsAndStateInterfaceTransformFactoryFactory(typeChecker) { + return function reactJSMakePropsAndStateInterfaceTransformFactory(context) { + return function reactJSMakePropsAndStateInterfaceTransform(sourceFile) { + var visited = visitSourceFile(sourceFile, typeChecker); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactJSMakePropsAndStateInterfaceTransformFactoryFactory = reactJSMakePropsAndStateInterfaceTransformFactoryFactory; +function visitSourceFile(sourceFile, typeChecker) { + var e_1, _a; + var newSourceFile = sourceFile; + try { + for (var _b = __values(sourceFile.statements), _c = _b.next(); !_c.done; _c = _b.next()) { + var statement = _c.value; + if (ts.isClassDeclaration(statement) && helpers.isReactComponent(statement, typeChecker)) { + newSourceFile = visitReactClassDeclaration(statement, newSourceFile, typeChecker); + } + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + return newSourceFile; +} +function visitReactClassDeclaration(classDeclaration, sourceFile, typeChecker) { + if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { + return sourceFile; + } + var className = classDeclaration && classDeclaration.name && classDeclaration.name.getText(sourceFile); + var propType = getPropsTypeOfReactComponentClass(classDeclaration, sourceFile); + var stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); + var shouldMakePropTypeDeclaration = propType.members.length > 0; + var shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); + var propTypeName = className + 'Props'; + var stateTypeName = className + 'State'; + var propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); + var stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType); + var propTypeRef = ts.createTypeReferenceNode(propTypeName, []); + var stateTypeRef = ts.createTypeReferenceNode(stateTypeName, []); + var newClassDeclaration = getNewReactClassDeclaration( + classDeclaration, + shouldMakePropTypeDeclaration ? propTypeRef : propType, + shouldMakeStateTypeDeclaration ? stateTypeRef : stateType, + ); + var allTypeDeclarations = []; + if (shouldMakePropTypeDeclaration) allTypeDeclarations.push(propTypeDeclaration); + if (shouldMakeStateTypeDeclaration) allTypeDeclarations.push(stateTypeDeclaration); + var statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); + statements = helpers.replaceItem(statements, classDeclaration, newClassDeclaration); + return ts.updateSourceFileNode(sourceFile, statements); +} +function getNewReactClassDeclaration(classDeclaration, propTypeRef, stateTypeRef) { + if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { + return classDeclaration; + } + var firstHeritageClause = classDeclaration.heritageClauses[0]; + var newFirstHeritageClauseTypes = helpers.replaceItem( + firstHeritageClause.types, + firstHeritageClause.types[0], + ts.updateExpressionWithTypeArguments( + firstHeritageClause.types[0], + [propTypeRef, stateTypeRef], + firstHeritageClause.types[0].expression, + ), + ); + var newHeritageClauses = helpers.replaceItem( + classDeclaration.heritageClauses, + firstHeritageClause, + ts.updateHeritageClause(firstHeritageClause, newFirstHeritageClauseTypes), + ); + return ts.updateClassDeclaration( + classDeclaration, + classDeclaration.decorators, + classDeclaration.modifiers, + classDeclaration.name, + classDeclaration.typeParameters, + newHeritageClauses, + classDeclaration.members, + ); +} +function getPropsTypeOfReactComponentClass(classDeclaration, sourceFile) { + var staticPropTypesMember = _.find(classDeclaration.members, function(member) { + return ( + ts.isPropertyDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ); + }); + if ( + staticPropTypesMember !== undefined && + ts.isPropertyDeclaration(staticPropTypesMember) && // check to satisfy type checker + staticPropTypesMember.initializer && + ts.isObjectLiteralExpression(staticPropTypesMember.initializer) + ) { + return helpers.buildInterfaceFromPropTypeObjectLiteral(staticPropTypesMember.initializer); + } + var staticPropTypesGetterMember = _.find(classDeclaration.members, function(member) { + return ( + ts.isGetAccessorDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ); + }); + if ( + staticPropTypesGetterMember !== undefined && + ts.isGetAccessorDeclaration(staticPropTypesGetterMember) // check to satisfy typechecker + ) { + var returnStatement = _.find(staticPropTypesGetterMember.body.statements, function(statement) { + return ts.isReturnStatement(statement); + }); + if ( + returnStatement !== undefined && + ts.isReturnStatement(returnStatement) && // check to satisfy typechecker + returnStatement.expression && + ts.isObjectLiteralExpression(returnStatement.expression) + ) { + return helpers.buildInterfaceFromPropTypeObjectLiteral(returnStatement.expression); + } + } + return ts.createTypeLiteralNode([]); +} +function getStateTypeOfReactComponentClass(classDeclaration, typeChecker) { + var initialState = getInitialStateFromClassDeclaration(classDeclaration, typeChecker); + var initialStateIsVoid = initialState.kind === ts.SyntaxKind.VoidKeyword; + var collectedStateTypes = getStateLookingForSetStateCalls(classDeclaration, typeChecker); + if (!collectedStateTypes.length && initialStateIsVoid) { + return ts.createTypeLiteralNode([]); + } + if (!initialStateIsVoid) { + collectedStateTypes.push(initialState); + } + return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.IntersectionType, collectedStateTypes); +} +/** + * Get initial state of a React component looking for state value initially set + * @param classDeclaration + * @param typeChecker + */ +function getInitialStateFromClassDeclaration(classDeclaration, typeChecker) { + // initial state class member + var e_2, _a; + var initialStateMember = _.find(classDeclaration.members, function(member) { + try { + return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'state'; + } catch (e) { + return false; + } + }); + if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { + var type = typeChecker.getTypeAtLocation(initialStateMember.initializer); + return typeChecker.typeToTypeNode(type); + } + // Initial state in constructor + var constructor = _.find(classDeclaration.members, function(member) { + return member.kind === ts.SyntaxKind.Constructor; + }); + if (constructor && constructor.body) { + try { + for (var _b = __values(constructor.body.statements), _c = _b.next(); !_c.done; _c = _b.next()) { + var statement = _c.value; + if ( + ts.isExpressionStatement(statement) && + ts.isBinaryExpression(statement.expression) && + statement.expression.left.getText() === 'this.state' + ) { + return typeChecker.typeToTypeNode(typeChecker.getTypeAtLocation(statement.expression.right)); + } + } + } catch (e_2_1) { + e_2 = { error: e_2_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_2) throw e_2.error; + } + } + } + // No initial state, fall back to void + return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); +} +/** + * Look for setState() function calls to collect the state interface in a React class component + * @param classDeclaration + * @param typeChecker + */ +function getStateLookingForSetStateCalls(classDeclaration, typeChecker) { + var e_3, _a; + var typeNodes = []; + try { + for (var _b = __values(classDeclaration.members), _c = _b.next(); !_c.done; _c = _b.next()) { + var member = _c.value; + if (member && ts.isMethodDeclaration(member) && member.body) { + lookForSetState(member.body); + } + } + } catch (e_3_1) { + e_3 = { error: e_3_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_3) throw e_3.error; + } + } + return typeNodes; + function lookForSetState(node) { + ts.forEachChild(node, lookForSetState); + if ( + ts.isExpressionStatement(node) && + ts.isCallExpression(node.expression) && + node.expression.expression.getText().match(/setState/) + ) { + var type = typeChecker.getTypeAtLocation(node.expression.arguments[0]); + typeNodes.push(typeChecker.typeToTypeNode(type)); + } + } +} +function isStateTypeMemberEmpty(stateType) { + // Only need to handle TypeLiteralNode & IntersectionTypeNode + if (ts.isTypeLiteralNode(stateType)) { + return stateType.members.length === 0; + } + if (!ts.isIntersectionTypeNode(stateType)) { + return true; + } + return stateType.types.every(isStateTypeMemberEmpty); +} diff --git a/d/transforms/react-move-prop-types-to-class-transform.js b/d/transforms/react-move-prop-types-to-class-transform.js new file mode 100644 index 0000000..9a88384 --- /dev/null +++ b/d/transforms/react-move-prop-types-to-class-transform.js @@ -0,0 +1,154 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +var __read = + (this && this.__read) || + function(o, n) { + var m = typeof Symbol === 'function' && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), + r, + ar = [], + e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } catch (error) { + e = { error: error }; + } finally { + try { + if (r && !r.done && (m = i['return'])) m.call(i); + } finally { + if (e) throw e.error; + } + } + return ar; + }; +var __spread = + (this && this.__spread) || + function() { + for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); + return ar; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +var helpers = require('../helpers'); +/** + * Move Component.propTypes statements into class as a static member of the class + * if React component is defined using a class + * + * Note: This transform assumes React component declaration and propTypes assignment statement + * are both on root of the source file + * + * @example + * Before: + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + * SomeComponent.propTypes = { foo: React.PropTypes.string } + * + * After + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> { + * static propTypes = { foo: React.PropTypes.string } + * } + * + * @todo + * This is not supporting multiple statements for a single class yet + * ``` + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + * SomeComponent.propTypes = { foo: React.PropTypes.string } + * SomeComponent.propTypes.bar = React.PropTypes.number; + * ``` + */ +function reactMovePropTypesToClassTransformFactoryFactory(typeChecker) { + return function reactMovePropTypesToClassTransformFactory(context) { + return function reactMovePropTypesToClassTransform(sourceFile) { + var visited = visitSourceFile(sourceFile, typeChecker); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactMovePropTypesToClassTransformFactoryFactory = reactMovePropTypesToClassTransformFactoryFactory; +/** + * Make the move from propType statement to static member + * @param sourceFile + * @param typeChecker + */ +function visitSourceFile(sourceFile, typeChecker) { + var e_1, _a; + var statements = sourceFile.statements; + // Look for propType assignment statements + var propTypeAssignments = statements.filter(function(statement) { + return helpers.isReactPropTypeAssignmentStatement(statement); + }); + var _loop_1 = function(propTypeAssignment) { + // Look for the class declarations with the same name + var componentName = helpers.getComponentName(propTypeAssignment, sourceFile); + var classStatement = _.find(statements, function(statement) { + return ( + ts.isClassDeclaration(statement) && + statement.name !== undefined && + statement.name.getText(sourceFile) === componentName + ); + }); // Type weirdness + // && helpers.isBinaryExpression(propTypeAssignment.expression) is redundant to satisfy the type checker + if (classStatement && ts.isBinaryExpression(propTypeAssignment.expression)) { + var newClassStatement = addStaticMemberToClass( + classStatement, + 'propTypes', + propTypeAssignment.expression.right, + ); + statements = ts.createNodeArray(helpers.replaceItem(statements, classStatement, newClassStatement)); + } + }; + try { + for ( + var propTypeAssignments_1 = __values(propTypeAssignments), + propTypeAssignments_1_1 = propTypeAssignments_1.next(); + !propTypeAssignments_1_1.done; + propTypeAssignments_1_1 = propTypeAssignments_1.next() + ) { + var propTypeAssignment = propTypeAssignments_1_1.value; + _loop_1(propTypeAssignment); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (propTypeAssignments_1_1 && !propTypeAssignments_1_1.done && (_a = propTypeAssignments_1.return)) + _a.call(propTypeAssignments_1); + } finally { + if (e_1) throw e_1.error; + } + } + return ts.updateSourceFileNode(sourceFile, statements); +} +/** + * Insert a new static member into a class + * @param classDeclaration + * @param name + * @param value + */ +function addStaticMemberToClass(classDeclaration, name, value) { + var staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); + var propertyDeclaration = ts.createProperty([], [staticModifier], name, undefined, undefined, value); + return ts.updateClassDeclaration( + classDeclaration, + classDeclaration.decorators, + classDeclaration.modifiers, + classDeclaration.name, + classDeclaration.typeParameters, + ts.createNodeArray(classDeclaration.heritageClauses), + ts.createNodeArray(__spread([propertyDeclaration], classDeclaration.members)), + ); +} diff --git a/d/transforms/react-remove-prop-types-assignment-transform.js b/d/transforms/react-remove-prop-types-assignment-transform.js new file mode 100644 index 0000000..b56e158 --- /dev/null +++ b/d/transforms/react-remove-prop-types-assignment-transform.js @@ -0,0 +1,30 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var helpers = require('../helpers'); +/** + * Remove Component.propTypes statements + * + * @example + * Before: + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + * SomeComponent.propTypes = { foo: React.PropTypes.string } + * + * After + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + */ +function reactRemovePropTypesAssignmentTransformFactoryFactory(typeChecker) { + return function reactRemovePropTypesAssignmentTransformFactory(context) { + return function reactRemovePropTypesAssignmentTransform(sourceFile) { + var visited = ts.updateSourceFileNode( + sourceFile, + sourceFile.statements.filter(function(s) { + return !helpers.isReactPropTypeAssignmentStatement(s); + }), + ); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactRemovePropTypesAssignmentTransformFactoryFactory = reactRemovePropTypesAssignmentTransformFactoryFactory; diff --git a/d/transforms/react-remove-prop-types-import.js b/d/transforms/react-remove-prop-types-import.js new file mode 100644 index 0000000..5b3a9d2 --- /dev/null +++ b/d/transforms/react-remove-prop-types-import.js @@ -0,0 +1,70 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +/** + * Remove `import PropTypes from 'prop-types'` or + * `import { PropTypes } from 'react'` + * + * @example + * Before: + * import PropTypes from 'prop-types' + * import React, { PropTypes } from 'react' + * + * After: + * import React from 'react' + */ +function reactRemovePropTypesImportTransformFactoryFactory(typeChecker) { + return function reactRemovePropTypesImportTransformFactory(context) { + return function reactRemovePropTypesImportTransform(sourceFile) { + var visited = ts.updateSourceFileNode( + sourceFile, + sourceFile.statements + .filter(function(s) { + return !( + ts.isImportDeclaration(s) && + ts.isStringLiteral(s.moduleSpecifier) && + s.moduleSpecifier.text === 'prop-types' + ); + }) + .map(updateReactImportIfNeeded), + ); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactRemovePropTypesImportTransformFactoryFactory = reactRemovePropTypesImportTransformFactoryFactory; +function updateReactImportIfNeeded(statement) { + if ( + !ts.isImportDeclaration(statement) || + !ts.isStringLiteral(statement.moduleSpecifier) || + statement.moduleSpecifier.text !== 'react' || + !statement.importClause || + !statement.importClause.namedBindings || + !ts.isNamedImports(statement.importClause.namedBindings) + ) { + return statement; + } + var namedBindings = statement.importClause.namedBindings; + var newNamedBindingElements = namedBindings.elements.filter(function(elm) { + return elm.name.text !== 'PropTypes'; + }); + if (newNamedBindingElements.length === namedBindings.elements.length) { + // Means it has no 'PropTypes' named import + return statement; + } + var newImportClause = ts.updateImportClause( + statement.importClause, + statement.importClause.name, + newNamedBindingElements.length === 0 + ? undefined + : ts.updateNamedImports(namedBindings, newNamedBindingElements), + ); + return ts.updateImportDeclaration( + statement, + statement.decorators, + statement.modifiers, + newImportClause, + statement.moduleSpecifier, + ); +} diff --git a/d/transforms/react-remove-static-prop-types-member-transform.js b/d/transforms/react-remove-static-prop-types-member-transform.js new file mode 100644 index 0000000..064c63a --- /dev/null +++ b/d/transforms/react-remove-static-prop-types-member-transform.js @@ -0,0 +1,59 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var helpers = require('../helpers'); +/** + * Remove static propTypes + * + * @example + * Before: + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> { + * static propTypes = { + * foo: React.PropTypes.number.isRequired, + * } + * } + * + * After: + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + */ +function reactRemoveStaticPropTypesMemberTransformFactoryFactory(typeChecker) { + return function reactRemoveStaticPropTypesMemberTransformFactory(context) { + return function reactRemoveStaticPropTypesMemberTransform(sourceFile) { + var visited = ts.visitEachChild(sourceFile, visitor, context); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + function visitor(node) { + if (ts.isClassDeclaration(node) && helpers.isReactComponent(node, typeChecker)) { + return ts.updateClassDeclaration( + node, + node.decorators, + node.modifiers, + node.name, + node.typeParameters, + ts.createNodeArray(node.heritageClauses), + node.members.filter(function(member) { + if ( + ts.isPropertyDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ) { + return false; + } + // propTypes getter + if ( + ts.isGetAccessorDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ) { + return false; + } + return true; + }), + ); + } + return node; + } + }; + }; +} +exports.reactRemoveStaticPropTypesMemberTransformFactoryFactory = reactRemoveStaticPropTypesMemberTransformFactoryFactory; diff --git a/d/transforms/react-stateless-function-make-props-transform.js b/d/transforms/react-stateless-function-make-props-transform.js new file mode 100644 index 0000000..f3055e5 --- /dev/null +++ b/d/transforms/react-stateless-function-make-props-transform.js @@ -0,0 +1,133 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +var helpers = require('../helpers'); +/** + * Transform react stateless components + * + * @example + * Before: + * const Hello = ({ message }) => { + * return
hello {message}
+ * } + * // Or: + * // const Hello = ({ message }) =>
hello {message}
+ * + * Hello.propTypes = { + * message: React.PropTypes.string, + * } + * + * After: + * Type HelloProps = { + * message: string; + * } + * + * const Hello: React.SFC = ({ message }) => { + * return
hello {message}
+ * } + * + * Hello.propTypes = { + * message: React.PropTypes.string, + * } + */ +function reactStatelessFunctionMakePropsTransformFactoryFactory(typeChecker) { + return function reactStatelessFunctionMakePropsTransformFactory(context) { + return function reactStatelessFunctionMakePropsTransform(sourceFile) { + var visited = visitSourceFile(sourceFile, typeChecker); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactStatelessFunctionMakePropsTransformFactoryFactory = reactStatelessFunctionMakePropsTransformFactoryFactory; +function visitSourceFile(sourceFile, typeChecker) { + var e_1, _a; + // Look for propType assignment statements + var propTypeAssignments = sourceFile.statements.filter(function(statement) { + return helpers.isReactPropTypeAssignmentStatement(statement); + }); + var newSourceFile = sourceFile; + var _loop_1 = function(propTypeAssignment) { + var componentName = helpers.getComponentName(propTypeAssignment, newSourceFile); + var funcComponent = _.find(newSourceFile.statements, function(s) { + return ( + (ts.isFunctionDeclaration(s) && s.name !== undefined && s.name.getText() === componentName) || + (ts.isVariableStatement(s) && s.declarationList.declarations[0].name.getText() === componentName) + ); + }); // Type weirdness + if (funcComponent) { + newSourceFile = visitReactStatelessComponent(funcComponent, propTypeAssignment, newSourceFile); + } + }; + try { + for ( + var propTypeAssignments_1 = __values(propTypeAssignments), + propTypeAssignments_1_1 = propTypeAssignments_1.next(); + !propTypeAssignments_1_1.done; + propTypeAssignments_1_1 = propTypeAssignments_1.next() + ) { + var propTypeAssignment = propTypeAssignments_1_1.value; + _loop_1(propTypeAssignment); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (propTypeAssignments_1_1 && !propTypeAssignments_1_1.done && (_a = propTypeAssignments_1.return)) + _a.call(propTypeAssignments_1); + } finally { + if (e_1) throw e_1.error; + } + } + return newSourceFile; +} +function visitReactStatelessComponent(component, propTypesExpressionStatement, sourceFile) { + var arrowFuncComponent = helpers.convertReactStatelessFunctionToArrowFunction(component); + var componentName = arrowFuncComponent.declarationList.declarations[0].name.getText(); + var componentInitializer = arrowFuncComponent.declarationList.declarations[0].initializer; + var propType = getPropTypesFromTypeAssignment(propTypesExpressionStatement); + var shouldMakePropTypeDeclaration = propType.members.length > 0; + var propTypeName = componentName + 'Props'; + var propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); + var propTypeRef = ts.createTypeReferenceNode(propTypeName, []); + var componentType = ts.createTypeReferenceNode(ts.createQualifiedName(ts.createIdentifier('React'), 'SFC'), [ + shouldMakePropTypeDeclaration ? propTypeRef : propType, + ]); + // replace component with ts stateless component + var typedComponent = ts.createVariableStatement( + arrowFuncComponent.modifiers, + ts.createVariableDeclarationList( + [ts.createVariableDeclaration(componentName, componentType, componentInitializer)], + arrowFuncComponent.declarationList.flags, + ), + ); + var statements = shouldMakePropTypeDeclaration + ? helpers.insertBefore(sourceFile.statements, component, [propTypeDeclaration]) + : sourceFile.statements; + statements = helpers.replaceItem(statements, component, typedComponent); + return ts.updateSourceFileNode(sourceFile, statements); +} +function getPropTypesFromTypeAssignment(propTypesExpressionStatement) { + if ( + propTypesExpressionStatement !== undefined && + ts.isBinaryExpression(propTypesExpressionStatement.expression) && + ts.isObjectLiteralExpression(propTypesExpressionStatement.expression.right) + ) { + return helpers.buildInterfaceFromPropTypeObjectLiteral(propTypesExpressionStatement.expression.right); + } + return ts.createTypeLiteralNode([]); +} diff --git a/package.json b/package.json index 55994ac..8123b95 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "prelint": "npm run clean", "lint": "tslint --project tsconfig.json --format codeFrame --exclude test/**/*.tsx", "prepublish": "npm run build", - "clean": "rm -rf dist", + "clean": "rm -rf d", "prebuild": "npm run clean", "build": "tsc --pretty", "precommit": "lint-staged", @@ -35,9 +35,9 @@ "commander": "^2.15.1", "detect-indent": "^5.0.0", "glob": "^7.1.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "prettier": "^1.12.1", - "typescript": "2.8.3" + "typescript": "^2.8.3" }, "devDependencies": { "@types/chalk": "^2.2.0", @@ -45,7 +45,7 @@ "@types/detect-indent": "^5.0.0", "@types/glob": "^5.0.35", "@types/jest": "^22.2.3", - "@types/lodash": "^4.14.109", + "@types/lodash": "^4.14.135", "@types/node": "^10.1.2", "@types/prettier": "^1.12.2", "@types/react": "^16.3.14", diff --git a/src/P.js b/src/P.js new file mode 100644 index 0000000..0582c85 --- /dev/null +++ b/src/P.js @@ -0,0 +1,5 @@ +class Panel extends React.Component { + static propTypes = { + multi: false, + }; +} diff --git a/tsconfig.json b/tsconfig.json index 0a2ed71..f4d1f51 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,15 +2,15 @@ "compilerOptions": { "strict": true, "target": "es5", - "declaration": true, + "declaration": false, "moduleResolution": "node", "module": "commonjs", "emitDecoratorMetadata": true, "experimentalDecorators": true, "downlevelIteration": true, - "sourceMap": true, - "outDir": "dist", - "sourceRoot": "../src", + "sourceMap": false, + "outDir": "d", + "rootDir": "./src", "lib": ["dom", "es2015"] }, "exclude": ["node_modules", "test", "dist"], diff --git a/yarn.lock b/yarn.lock index fcb2ae6..6bc5241 100644 --- a/yarn.lock +++ b/yarn.lock @@ -48,9 +48,10 @@ version "22.2.3" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d" -"@types/lodash@^4.14.109": - version "4.14.109" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.109.tgz#b1c4442239730bf35cabaf493c772b18c045886d" +"@types/lodash@^4.14.135": + version "4.14.135" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.135.tgz#d2607c35dd68f70c2b35ba020c667493dedd8447" + integrity sha512-Ed+tSZ9qM1oYpi5kzdsBuOzcAIn1wDW+e8TFJ50IMJMlSopGdJgKAbhHzN6h1E1OfjlGOr2JepzEWtg9NIfoNg== "@types/minimatch@*": version "3.0.3" @@ -2345,6 +2346,11 @@ lodash@^4.14.0, lodash@^4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -3644,9 +3650,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -typescript@2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" +typescript@^2.8.3: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== uglify-js@^2.6: version "2.8.29" From d8f5899a6b6af5e91f43d6cb4e28a9584aa3baf7 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Tue, 9 Jul 2019 15:31:57 +0800 Subject: [PATCH 02/26] p --- .vscode/launch.json | 7 + d/P.tsx | 4 + d/cli.js | 130 +++++++++ d/compiler.js | 156 +++++++++++ d/helpers/build-prop-type-interface.js | 190 +++++++++++++ d/helpers/index.js | 197 +++++++++++++ d/index.js | 48 ++++ ...lapse-intersection-interfaces-transform.js | 187 +++++++++++++ ...react-js-make-props-and-state-transform.js | 258 ++++++++++++++++++ ...eact-move-prop-types-to-class-transform.js | 154 +++++++++++ ...-remove-prop-types-assignment-transform.js | 30 ++ .../react-remove-prop-types-import.js | 70 +++++ ...move-static-prop-types-member-transform.js | 59 ++++ ...stateless-function-make-props-transform.js | 133 +++++++++ package.json | 8 +- src/P.js | 5 + ...react-js-make-props-and-state-transform.ts | 5 +- .../output.tsx | 8 +- .../initial-state-and-proprypes/output.tsx | 8 +- .../end-to-end/multiple-components/output.tsx | 8 +- .../multiple-components/output.tsx | 8 +- .../static-proptypes-getter-simple/output.tsx | 8 +- .../static-proptypes-many-props/output.tsx | 62 ++--- .../static-proptypes-simple/output.tsx | 8 +- test/transformers.test.ts | 2 +- tsconfig.json | 8 +- yarn.lock | 19 +- 27 files changed, 1708 insertions(+), 72 deletions(-) create mode 100644 d/P.tsx create mode 100644 d/cli.js create mode 100644 d/compiler.js create mode 100644 d/helpers/build-prop-type-interface.js create mode 100644 d/helpers/index.js create mode 100644 d/index.js create mode 100644 d/transforms/collapse-intersection-interfaces-transform.js create mode 100644 d/transforms/react-js-make-props-and-state-transform.js create mode 100644 d/transforms/react-move-prop-types-to-class-transform.js create mode 100644 d/transforms/react-remove-prop-types-assignment-transform.js create mode 100644 d/transforms/react-remove-prop-types-import.js create mode 100644 d/transforms/react-remove-static-prop-types-member-transform.js create mode 100644 d/transforms/react-stateless-function-make-props-transform.js create mode 100644 src/P.js diff --git a/.vscode/launch.json b/.vscode/launch.json index fff8a01..cdeb78c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,6 +1,13 @@ { "version": "0.2.0", "configurations": [ + { + "type": "node", + "request": "launch", + "name": "node", + "program": "${workspaceFolder}/d/cli", + "args": ["./d/P.js"] + }, { "args": [], "cwd": "${workspaceRoot}", diff --git a/d/P.tsx b/d/P.tsx new file mode 100644 index 0000000..0ec3330 --- /dev/null +++ b/d/P.tsx @@ -0,0 +1,4 @@ +type PanelProps = { + multi?: any; +}; +class Panel extends React.Component {} diff --git a/d/cli.js b/d/cli.js new file mode 100644 index 0000000..a3b0b46 --- /dev/null +++ b/d/cli.js @@ -0,0 +1,130 @@ +#!/usr/bin/env node +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var program = require('commander'); +var glob = require('glob'); +var fs = require('fs'); +var path = require('path'); +var _1 = require('.'); + +// copy file +const filePath = path.join(__dirname, '../src/P.js'); +const content = fs.readFileSync(filePath, 'utf8'); +const newfile = path.join(__dirname, 'P.js'); +fs.writeFileSync(newfile, content); +// end of copy file + +function resolveGlobs(globPatterns) { + var files = []; + function addFile(file) { + file = path.resolve(file); + if (files.indexOf(file) === -1) { + files.push(file); + } + } + globPatterns.forEach(function(pattern) { + if (/[{}*?+\[\]]/.test(pattern)) { + // Smells like globs + glob.sync(pattern, {}).forEach(function(file) { + addFile(file); + }); + } else { + addFile(pattern); + } + }); + return files; +} +program + .version('1.0.0') + .option('--arrow-parens ', 'Include parentheses around a sole arrow function parameter.', 'avoid') + .option('--no-bracket-spacing', 'Do not print spaces between brackets.', false) + .option('--jsx-bracket-same-line', 'Put > on the last line instead of at a new line.', false) + .option('--print-width ', 'The line length where Prettier will try wrap.', 80) + .option('--prose-wrap How to wrap prose. (markdown)', 'preserve') + .option('--no-semi', 'Do not print semicolons, except at the beginning of lines which may need them', false) + .option('--single-quote', 'Use single quotes instead of double quotes.', false) + .option('--tab-width ', 'Number of spaces per indentation level.', 2) + .option('--trailing-comma ', 'Print trailing commas wherever possible when multi-line.', 'none') + .option('--use-tabs', 'Indent with tabs instead of spaces.', false) + .option('--ignore-prettier-errors', 'Ignore (but warn about) errors in Prettier', false) + .option('--keep-original-files', 'Keep original files', false) + .option('--keep-temporary-files', 'Keep temporary files', false) + .usage('[options] ') + .command('* [glob/filename...]') + .action(function(globPatterns) { + var e_1, _a; + var prettierOptions = { + arrowParens: program.arrowParens, + bracketSpacing: !program.noBracketSpacing, + jsxBracketSameLine: !!program.jsxBracketSameLine, + printWidth: parseInt(program.printWidth, 10), + proseWrap: program.proseWrap, + semi: !program.noSemi, + singleQuote: !!program.singleQuote, + tabWidth: parseInt(program.tabWidth, 10), + trailingComma: program.trailingComma, + useTabs: !!program.useTabs, + }; + var compilationOptions = { + ignorePrettierErrors: !!program.ignorePrettierErrors, + }; + var files = resolveGlobs(globPatterns); + if (!files.length) { + throw new Error('Nothing to do. You must provide file names or glob patterns to transform.'); + } + var errors = false; + try { + for ( + var files_1 = __values(files), files_1_1 = files_1.next(); + !files_1_1.done; + files_1_1 = files_1.next() + ) { + var filePath = files_1_1.value; + console.log('Transforming ' + filePath + '...'); + var newPath = filePath.replace(/\.jsx?$/, '.tsx'); + var temporaryPath = filePath.replace(/\.jsx?$/, '_js2ts_' + +new Date() + '.tsx'); + try { + fs.copyFileSync(filePath, temporaryPath); + var result = _1.run(temporaryPath, prettierOptions, compilationOptions); + fs.writeFileSync(newPath, result); + if (!program.keepOriginalFiles) { + fs.unlinkSync(filePath); + } + } catch (error) { + console.warn('Failed to convert ' + filePath); + console.warn(error); + errors = true; + } + if (!program.keepTemporaryFiles) { + if (fs.existsSync(temporaryPath)) { + fs.unlinkSync(temporaryPath); + } + } + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (files_1_1 && !files_1_1.done && (_a = files_1.return)) _a.call(files_1); + } finally { + if (e_1) throw e_1.error; + } + } + if (errors) { + process.exit(1); + } + }); +program.parse(process.argv); diff --git a/d/compiler.js b/d/compiler.js new file mode 100644 index 0000000..0170584 --- /dev/null +++ b/d/compiler.js @@ -0,0 +1,156 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var os = require('os'); +var fs = require('fs'); +var ts = require('typescript'); +var chalk_1 = require('chalk'); +var _ = require('lodash'); +var prettier = require('prettier'); +var detectIndent = require('detect-indent'); +var DEFAULT_COMPILATION_OPTIONS = { + ignorePrettierErrors: false, +}; +exports.DEFAULT_COMPILATION_OPTIONS = DEFAULT_COMPILATION_OPTIONS; +/** + * Compile and return result TypeScript + * @param filePath Path to file to compile + */ +function compile(filePath, factoryFactories, incomingPrettierOptions, compilationOptions) { + if (incomingPrettierOptions === void 0) { + incomingPrettierOptions = {}; + } + if (compilationOptions === void 0) { + compilationOptions = DEFAULT_COMPILATION_OPTIONS; + } + var e_1, _a; + var compilerOptions = { + target: ts.ScriptTarget.ES2017, + module: ts.ModuleKind.ES2015, + }; + var program = ts.createProgram([filePath], compilerOptions); + // `program.getSourceFiles()` will include those imported files, + // like: `import * as a from './file-a'`. + // We should only transform current file. + var sourceFiles = program.getSourceFiles().filter(function(sf) { + return sf.fileName === filePath; + }); + var typeChecker = program.getTypeChecker(); + var result = ts.transform( + sourceFiles, + factoryFactories.map(function(factoryFactory) { + return factoryFactory(typeChecker); + }, compilerOptions), + ); + if (result.diagnostics && result.diagnostics.length) { + console.log( + chalk_1.default.yellow( + '\n ======================= Diagnostics for ' + filePath + ' =======================\n ', + ), + ); + try { + for (var _b = __values(result.diagnostics), _c = _b.next(); !_c.done; _c = _b.next()) { + var diag = _c.value; + if (diag.file && diag.start) { + var pos = diag.file.getLineAndCharacterOfPosition(diag.start); + console.log('(' + pos.line + ', ' + pos.character + ') ' + diag.messageText); + } + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + } + var printer = ts.createPrinter(); + // TODO: fix the index 0 access... What if program have multiple source files? + var printed = printer.printNode(ts.EmitHint.SourceFile, result.transformed[0], sourceFiles[0]); + var inputSource = fs.readFileSync(filePath, 'utf-8'); + var prettierOptions = getPrettierOptions(filePath, inputSource, incomingPrettierOptions); + try { + return prettier.format(printed, prettierOptions); + } catch (prettierError) { + if (compilationOptions.ignorePrettierErrors) { + console.warn('Prettier failed for ' + filePath + ' (ignorePrettierErrors is on):'); + console.warn(prettierError); + return printed; + } + throw prettierError; + } +} +exports.compile = compile; +/** + * Get Prettier options based on style of a JavaScript + * @param filePath Path to source file + * @param source Body of a JavaScript + * @param options Existing prettier option + */ +function getPrettierOptions(filePath, source, options) { + var resolvedOptions = prettier.resolveConfig.sync(filePath); + if (resolvedOptions) { + _.defaults(resolvedOptions, options); + return resolvedOptions; + } + var _a = detectIndent(source), + indentAmount = _a.amount, + indentType = _a.type; + var sourceWidth = getCodeWidth(source, 80); + var semi = getUseOfSemi(source); + var quotations = getQuotation(source); + _.defaults(Object.assign({}, options), { + tabWidth: indentAmount, + useTabs: indentType && indentType === 'tab', + printWidth: sourceWidth, + semi: semi, + singleQuote: quotations === 'single', + }); + return options; +} +exports.getPrettierOptions = getPrettierOptions; +/** + * Given body of a source file, return its code width + * @param source + */ +function getCodeWidth(source, defaultWidth) { + return source.split(os.EOL).reduce(function(result, line) { + return Math.max(result, line.length); + }, defaultWidth); +} +/** + * Detect if a source file is using semicolon + * @todo: use an actual parser. This is not a proper implementation + * @param source + * @return true if code is using semicolons + */ +function getUseOfSemi(source) { + return source.indexOf(';') !== -1; +} +/** + * Detect if a source file is using single quotes or double quotes + * @todo use an actual parser. This is not a proper implementation + * @param source + */ +function getQuotation(source) { + var numberOfSingleQuotes = (source.match(/\'/g) || []).length; + var numberOfDoubleQuotes = (source.match(/\"/g) || []).length; + if (numberOfSingleQuotes > numberOfDoubleQuotes) { + return 'single'; + } + return 'double'; +} diff --git a/d/helpers/build-prop-type-interface.js b/d/helpers/build-prop-type-interface.js new file mode 100644 index 0000000..1928455 --- /dev/null +++ b/d/helpers/build-prop-type-interface.js @@ -0,0 +1,190 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +/** + * Build props interface from propTypes object + * @example + * { + * foo: React.PropTypes.string.isRequired + * } + * + * becomes + * { + * foo: string; + * } + * @param objectLiteral + */ +function buildInterfaceFromPropTypeObjectLiteral(objectLiteral) { + var members = objectLiteral.properties + // We only need to process PropertyAssignment: + // { + // a: 123 // PropertyAssignment + // } + // + // filter out: + // { + // a() {}, // MethodDeclaration + // b, // ShorthandPropertyAssignment + // ...c, // SpreadAssignment + // get d() {}, // AccessorDeclaration + // } + .filter(ts.isPropertyAssignment) + // Ignore children, React types have it + .filter(function(property) { + return property.name.getText() !== 'children'; + }) + .map(function(propertyAssignment) { + var name = propertyAssignment.name.getText(); + var initializer = propertyAssignment.initializer; + var isRequired = isPropTypeRequired(initializer); + var typeExpression = isRequired + ? // We have guaranteed the type in `isPropTypeRequired()` + initializer.expression + : initializer; + var typeValue = getTypeFromReactPropTypeExpression(typeExpression); + return ts.createPropertySignature( + [], + name, + isRequired ? undefined : ts.createToken(ts.SyntaxKind.QuestionToken), + typeValue, + undefined, + ); + }); + return ts.createTypeLiteralNode(members); +} +exports.buildInterfaceFromPropTypeObjectLiteral = buildInterfaceFromPropTypeObjectLiteral; +/** + * Turns React.PropTypes.* into TypeScript type value + * + * @param node React propTypes value + */ +function getTypeFromReactPropTypeExpression(node) { + var result = null; + if (ts.isPropertyAccessExpression(node)) { + /** + * PropTypes.array, + * PropTypes.bool, + * PropTypes.func, + * PropTypes.number, + * PropTypes.object, + * PropTypes.string, + * PropTypes.symbol, (ignore) + * PropTypes.node, + * PropTypes.element, + * PropTypes.any, + */ + var text = node.getText().replace(/React\.PropTypes\./, ''); + if (/string/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + } else if (/any/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + } else if (/array/.test(text)) { + result = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + } else if (/bool/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); + } else if (/number/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); + } else if (/object/.test(text)) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword); + } else if (/node/.test(text)) { + result = ts.createTypeReferenceNode('React.ReactNode', []); + } else if (/element/.test(text)) { + result = ts.createTypeReferenceNode('JSX.Element', []); + } else if (/func/.test(text)) { + var arrayOfAny = ts.createParameter( + [], + [], + ts.createToken(ts.SyntaxKind.DotDotDotToken), + 'args', + undefined, + ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)), + undefined, + ); + result = ts.createFunctionTypeNode([], [arrayOfAny], ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + } + } else if (ts.isCallExpression(node)) { + /** + * PropTypes.instanceOf(), (ignore) + * PropTypes.oneOf(), // only support oneOf([1, 2]), oneOf(['a', 'b']) + * PropTypes.oneOfType(), + * PropTypes.arrayOf(), + * PropTypes.objectOf(), + * PropTypes.shape(), + */ + var text = node.expression.getText(); + if (/oneOf$/.test(text)) { + var argument = node.arguments[0]; + if (ts.isArrayLiteralExpression(argument)) { + if ( + argument.elements.every(function(elm) { + return ts.isStringLiteral(elm) || ts.isNumericLiteral(elm); + }) + ) { + result = ts.createUnionTypeNode( + argument.elements.map(function(elm) { + return ts.createLiteralTypeNode(elm); + }), + ); + } + } + } else if (/oneOfType$/.test(text)) { + var argument = node.arguments[0]; + if (ts.isArrayLiteralExpression(argument)) { + result = ts.createUnionOrIntersectionTypeNode( + ts.SyntaxKind.UnionType, + argument.elements.map(function(elm) { + return getTypeFromReactPropTypeExpression(elm); + }), + ); + } + } else if (/arrayOf$/.test(text)) { + var argument = node.arguments[0]; + if (argument) { + result = ts.createArrayTypeNode(getTypeFromReactPropTypeExpression(argument)); + } + } else if (/objectOf$/.test(text)) { + var argument = node.arguments[0]; + if (argument) { + result = ts.createTypeLiteralNode([ + ts.createIndexSignature( + undefined, + undefined, + [ + ts.createParameter( + undefined, + undefined, + undefined, + 'key', + undefined, + ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + ), + ], + getTypeFromReactPropTypeExpression(argument), + ), + ]); + } + } else if (/shape$/.test(text)) { + var argument = node.arguments[0]; + if (ts.isObjectLiteralExpression(argument)) { + return buildInterfaceFromPropTypeObjectLiteral(argument); + } + } + } + /** + * customProp, + * anything others + */ + if (result === null) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + } + return result; +} +/** + * Decide if node is required + * @param node React propTypes member node + */ +function isPropTypeRequired(node) { + if (!ts.isPropertyAccessExpression(node)) return false; + var text = node.getText().replace(/React\.PropTypes\./, ''); + return /\.isRequired/.test(text); +} diff --git a/d/helpers/index.js b/d/helpers/index.js new file mode 100644 index 0000000..4c2adf9 --- /dev/null +++ b/d/helpers/index.js @@ -0,0 +1,197 @@ +'use strict'; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +__export(require('./build-prop-type-interface')); +/** + * If a class declaration a react class? + * @param classDeclaration + * @param typeChecker + */ +function isReactComponent(classDeclaration, typeChecker) { + // Only classes that extend React.Component + if (!classDeclaration.heritageClauses) { + return false; + } + if (classDeclaration.heritageClauses.length !== 1) { + return false; + } + var firstHeritageClauses = classDeclaration.heritageClauses[0]; + if (firstHeritageClauses.token !== ts.SyntaxKind.ExtendsKeyword) { + return false; + } + var expressionWithTypeArguments = firstHeritageClauses.types[0]; + if (!expressionWithTypeArguments) { + return false; + } + // Try type checker and fallback to node text + var type = typeChecker.getTypeAtLocation(expressionWithTypeArguments); + var typeSymbol = type && type.symbol && type.symbol.name; + if (!typeSymbol) { + typeSymbol = expressionWithTypeArguments.expression.getText(); + } + if (!/React\.Component|Component/.test(typeSymbol)) { + return false; + } + return true; +} +exports.isReactComponent = isReactComponent; +/** + * Determine if a ts.HeritageClause is React HeritageClause + * + * @example `extends React.Component<{}, {}>` is a React HeritageClause + * + * @todo: this is lazy. Use the typeChecker instead + * @param clause + */ +function isReactHeritageClause(clause) { + return ( + clause.token === ts.SyntaxKind.ExtendsKeyword && + clause.types.length === 1 && + ts.isExpressionWithTypeArguments(clause.types[0]) && + /Component/.test(clause.types[0].expression.getText()) + ); +} +exports.isReactHeritageClause = isReactHeritageClause; +/** + * Return true if a statement is a React propType assignment statement + * @example + * SomeComponent.propTypes = { foo: React.PropTypes.string }; + * @param statement + */ +function isReactPropTypeAssignmentStatement(statement) { + return ( + ts.isExpressionStatement(statement) && + ts.isBinaryExpression(statement.expression) && + statement.expression.operatorToken.kind === ts.SyntaxKind.FirstAssignment && + ts.isPropertyAccessExpression(statement.expression.left) && + /\.propTypes$|\.propTypes\..+$/.test(statement.expression.left.getText()) + ); +} +exports.isReactPropTypeAssignmentStatement = isReactPropTypeAssignmentStatement; +/** + * Does class member have a "static" member? + * @param classMember + */ +function hasStaticModifier(classMember) { + if (!classMember.modifiers) { + return false; + } + var staticModifier = _.find(classMember.modifiers, function(modifier) { + return modifier.kind == ts.SyntaxKind.StaticKeyword; + }); + return staticModifier !== undefined; +} +exports.hasStaticModifier = hasStaticModifier; +/** + * Is class member a React "propTypes" member? + * @param classMember + * @param sourceFile + */ +function isPropTypesMember(classMember, sourceFile) { + try { + var name_1 = + classMember.name !== undefined && ts.isIdentifier(classMember.name) ? classMember.name.escapedText : null; + return name_1 === 'propTypes'; + } catch (e) { + return false; + } +} +exports.isPropTypesMember = isPropTypesMember; +/** + * Get component name off of a propType assignment statement + * @param propTypeAssignment + * @param sourceFile + */ +function getComponentName(propTypeAssignment, sourceFile) { + var text = propTypeAssignment.getText(sourceFile); + return text.substr(0, text.indexOf('.')); +} +exports.getComponentName = getComponentName; +/** + * Convert react stateless function to arrow function + * @example + * Before: + * function Hello(message) { + * return
{message}
+ * } + * + * After: + * const Hello = message => { + * return
{message}
+ * } + */ +function convertReactStatelessFunctionToArrowFunction(statelessFunc) { + if (ts.isVariableStatement(statelessFunc)) return statelessFunc; + var funcName = statelessFunc.name || 'Component'; + var funcBody = statelessFunc.body || ts.createBlock([]); + var initializer = ts.createArrowFunction( + undefined, + undefined, + statelessFunc.parameters, + undefined, + undefined, + funcBody, + ); + return ts.createVariableStatement( + statelessFunc.modifiers, + ts.createVariableDeclarationList( + [ts.createVariableDeclaration(funcName, undefined, initializer)], + ts.NodeFlags.Const, + ), + ); +} +exports.convertReactStatelessFunctionToArrowFunction = convertReactStatelessFunctionToArrowFunction; +/** + * Insert an item in middle of an array after a specific item + * @param collection + * @param afterItem + * @param newItem + */ +function insertAfter(collection, afterItem, newItem) { + var index = _.indexOf(collection, afterItem) + 1; + return _.slice(collection, 0, index) + .concat(newItem) + .concat(_.slice(collection, index)); +} +exports.insertAfter = insertAfter; +/** + * Insert an item in middle of an array before a specific item + * @param collection + * @param beforeItem + * @param newItem + */ +function insertBefore(collection, beforeItem, newItems) { + var index = _.indexOf(collection, beforeItem); + return _.slice(collection, 0, index) + .concat(newItems) + .concat(_.slice(collection, index)); +} +exports.insertBefore = insertBefore; +/** + * Replace an item in a collection with another item + * @param collection + * @param item + * @param newItem + */ +function replaceItem(collection, item, newItem) { + var index = _.indexOf(collection, item); + return _.slice(collection, 0, index) + .concat(newItem) + .concat(_.slice(collection, index + 1)); +} +exports.replaceItem = replaceItem; +/** + * Remove an item from a collection + * @param collection + * @param item + * @param newItem + */ +function removeItem(collection, item) { + var index = _.indexOf(collection, item); + return _.slice(collection, 0, index).concat(_.slice(collection, index + 1)); +} +exports.removeItem = removeItem; diff --git a/d/index.js b/d/index.js new file mode 100644 index 0000000..45c3672 --- /dev/null +++ b/d/index.js @@ -0,0 +1,48 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var compiler_1 = require('./compiler'); +exports.compile = compiler_1.compile; +var react_js_make_props_and_state_transform_1 = require('./transforms/react-js-make-props-and-state-transform'); +exports.reactJSMakePropsAndStateInterfaceTransformFactoryFactory = + react_js_make_props_and_state_transform_1.reactJSMakePropsAndStateInterfaceTransformFactoryFactory; +var react_remove_prop_types_assignment_transform_1 = require('./transforms/react-remove-prop-types-assignment-transform'); +exports.reactRemovePropTypesAssignmentTransformFactoryFactory = + react_remove_prop_types_assignment_transform_1.reactRemovePropTypesAssignmentTransformFactoryFactory; +var react_move_prop_types_to_class_transform_1 = require('./transforms/react-move-prop-types-to-class-transform'); +exports.reactMovePropTypesToClassTransformFactoryFactory = + react_move_prop_types_to_class_transform_1.reactMovePropTypesToClassTransformFactoryFactory; +var collapse_intersection_interfaces_transform_1 = require('./transforms/collapse-intersection-interfaces-transform'); +exports.collapseIntersectionInterfacesTransformFactoryFactory = + collapse_intersection_interfaces_transform_1.collapseIntersectionInterfacesTransformFactoryFactory; +var react_remove_static_prop_types_member_transform_1 = require('./transforms/react-remove-static-prop-types-member-transform'); +exports.reactRemoveStaticPropTypesMemberTransformFactoryFactory = + react_remove_static_prop_types_member_transform_1.reactRemoveStaticPropTypesMemberTransformFactoryFactory; +var react_stateless_function_make_props_transform_1 = require('./transforms/react-stateless-function-make-props-transform'); +exports.reactStatelessFunctionMakePropsTransformFactoryFactory = + react_stateless_function_make_props_transform_1.reactStatelessFunctionMakePropsTransformFactoryFactory; +var react_remove_prop_types_import_1 = require('./transforms/react-remove-prop-types-import'); +exports.reactRemovePropTypesImportTransformFactoryFactory = + react_remove_prop_types_import_1.reactRemovePropTypesImportTransformFactoryFactory; +exports.allTransforms = [ + react_move_prop_types_to_class_transform_1.reactMovePropTypesToClassTransformFactoryFactory, + react_js_make_props_and_state_transform_1.reactJSMakePropsAndStateInterfaceTransformFactoryFactory, + react_stateless_function_make_props_transform_1.reactStatelessFunctionMakePropsTransformFactoryFactory, + collapse_intersection_interfaces_transform_1.collapseIntersectionInterfacesTransformFactoryFactory, + react_remove_prop_types_assignment_transform_1.reactRemovePropTypesAssignmentTransformFactoryFactory, + react_remove_static_prop_types_member_transform_1.reactRemoveStaticPropTypesMemberTransformFactoryFactory, + react_remove_prop_types_import_1.reactRemovePropTypesImportTransformFactoryFactory, +]; +/** + * Run React JavaScript to TypeScript transform for file at `filePath` + * @param filePath + */ +function run(filePath, prettierOptions, compilationOptions) { + if (prettierOptions === void 0) { + prettierOptions = {}; + } + if (compilationOptions === void 0) { + compilationOptions = compiler_1.DEFAULT_COMPILATION_OPTIONS; + } + return compiler_1.compile(filePath, exports.allTransforms, prettierOptions, compilationOptions); +} +exports.run = run; diff --git a/d/transforms/collapse-intersection-interfaces-transform.js b/d/transforms/collapse-intersection-interfaces-transform.js new file mode 100644 index 0000000..90e8df4 --- /dev/null +++ b/d/transforms/collapse-intersection-interfaces-transform.js @@ -0,0 +1,187 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +var __read = + (this && this.__read) || + function(o, n) { + var m = typeof Symbol === 'function' && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), + r, + ar = [], + e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } catch (error) { + e = { error: error }; + } finally { + try { + if (r && !r.done && (m = i['return'])) m.call(i); + } finally { + if (e) throw e.error; + } + } + return ar; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +/** + * Collapse unnecessary intersections between type literals + * + * @example + * Before: + * type Foo = {foo: string;} & {bar: number;} + * + * After + * type Foo = {foo: string; bar: number;} + */ +function collapseIntersectionInterfacesTransformFactoryFactory(typeChecker) { + return function collapseIntersectionInterfacesTransformFactory(context) { + return function collapseIntersectionInterfacesTransform(sourceFile) { + var visited = ts.visitEachChild(sourceFile, visitor, context); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + function visitor(node) { + if (ts.isTypeAliasDeclaration(node)) { + return visitTypeAliasDeclaration(node); + } + return node; + } + function visitTypeAliasDeclaration(node) { + if (ts.isIntersectionTypeNode(node.type)) { + return ts.createTypeAliasDeclaration( + [], + [], + node.name.text, + [], + visitIntersectionTypeNode(node.type), + ); + } + return node; + } + function visitIntersectionTypeNode(node) { + var e_1, _a; + // Only intersection of type literals can be colapsed. + // We are currently ignoring intersections such as `{foo: string} & {bar: string} & TypeRef` + // TODO: handle mix of type references and multiple literal types + if ( + !node.types.every(function(typeNode) { + return ts.isTypeLiteralNode(typeNode); + }) + ) { + return node; + } + // We need cast `node.type.types` to `ts.NodeArray` + // because TypeScript can't figure out `node.type.types.every(ts.isTypeLiteralNode)` + var types = node.types; + // Build a map of member names to all of types found in intersectioning type literals + // For instance {foo: string, bar: number} & { foo: number } will result in a map like this: + // Map { + // 'foo' => Set { 'string', 'number' }, + // 'bar' => Set { 'number' } + // } + var membersMap = new Map(); + // A sepecial member of type literal nodes is index signitures which don't have a name + // We use this symbol to track it in our members map + var INDEX_SIGNITUTRE_MEMBER = Symbol('Index signiture member'); + // Keep a reference of first index signiture member parameters. (ignore rest) + var indexMemberParameter = null; + // Iterate through all of type literal nodes members and add them to the members map + types.forEach(function(typeNode) { + typeNode.members.forEach(function(member) { + if (ts.isIndexSignatureDeclaration(member)) { + if (member.type !== undefined) { + if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) { + membersMap.get(INDEX_SIGNITUTRE_MEMBER).add(member.type); + } else { + indexMemberParameter = member.parameters; + membersMap.set(INDEX_SIGNITUTRE_MEMBER, new Set([member.type])); + } + } + } else if (ts.isPropertySignature(member)) { + if (member.type !== undefined) { + var memberName = member.name.getText(sourceFile); + // For unknown reasons, member.name.getText() is returning nothing in some cases + // This is probably because previous transformers did something with the AST that + // index of text string of member identifier is lost + // TODO: investigate + if (!memberName) { + memberName = member.name.escapedText; + } + if (membersMap.has(memberName)) { + membersMap.get(memberName).add(member.type); + } else { + membersMap.set(memberName, new Set([member.type])); + } + } + } + }); + }); + // Result type literal members list + var finalMembers = []; + try { + // Put together the map into a type literal that has member per each map entery and type of that + // member is a union of all types in vlues for that member name in members map + // if a member has only one type, create a simple type literal for it + for (var _b = __values(membersMap.entries()), _c = _b.next(); !_c.done; _c = _b.next()) { + var _d = __read(_c.value, 2), + name_1 = _d[0], + types_1 = _d[1]; + if (typeof name_1 === 'symbol') { + continue; + } + // if for this name there is only one type found use the first type, otherwise make a union of all types + var resultType = + types_1.size === 1 ? Array.from(types_1)[0] : createUnionType(Array.from(types_1)); + finalMembers.push(ts.createPropertySignature([], name_1, undefined, resultType, undefined)); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + // Handle index signiture member + if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) { + var indexTypes = Array.from(membersMap.get(INDEX_SIGNITUTRE_MEMBER)); + var indexType = indexTypes[0]; + if (indexTypes.length > 1) { + indexType = createUnionType(indexTypes); + } + var indexSigniture = ts.createIndexSignature([], [], indexMemberParameter, indexType); + finalMembers.push(indexSigniture); + } + // Generate one single type literal node + return ts.createTypeLiteralNode(finalMembers); + } + /** + * Create a union type from multiple type nodes + * @param types + */ + function createUnionType(types) { + // first dedupe literal types + // TODO: this only works if all types are primitive types like string or number + var uniqueTypes = _.uniqBy(types, function(type) { + return type.kind; + }); + return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.UnionType, uniqueTypes); + } + }; + }; +} +exports.collapseIntersectionInterfacesTransformFactoryFactory = collapseIntersectionInterfacesTransformFactoryFactory; diff --git a/d/transforms/react-js-make-props-and-state-transform.js b/d/transforms/react-js-make-props-and-state-transform.js new file mode 100644 index 0000000..5d6d935 --- /dev/null +++ b/d/transforms/react-js-make-props-and-state-transform.js @@ -0,0 +1,258 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +var helpers = require('../helpers'); +/** + * Get transform for transforming React code originally written in JS which does not have + * props and state generic types + * This transform will remove React component static "propTypes" member during transform + */ +function reactJSMakePropsAndStateInterfaceTransformFactoryFactory(typeChecker) { + return function reactJSMakePropsAndStateInterfaceTransformFactory(context) { + return function reactJSMakePropsAndStateInterfaceTransform(sourceFile) { + var visited = visitSourceFile(sourceFile, typeChecker); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactJSMakePropsAndStateInterfaceTransformFactoryFactory = reactJSMakePropsAndStateInterfaceTransformFactoryFactory; +function visitSourceFile(sourceFile, typeChecker) { + var e_1, _a; + var newSourceFile = sourceFile; + try { + for (var _b = __values(sourceFile.statements), _c = _b.next(); !_c.done; _c = _b.next()) { + var statement = _c.value; + if (ts.isClassDeclaration(statement) && helpers.isReactComponent(statement, typeChecker)) { + newSourceFile = visitReactClassDeclaration(statement, newSourceFile, typeChecker); + } + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + return newSourceFile; +} +function visitReactClassDeclaration(classDeclaration, sourceFile, typeChecker) { + if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { + return sourceFile; + } + var className = classDeclaration && classDeclaration.name && classDeclaration.name.getText(sourceFile); + var propType = getPropsTypeOfReactComponentClass(classDeclaration, sourceFile); + var stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); + var shouldMakePropTypeDeclaration = propType.members.length > 0; + var shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); + var propTypeName = className + 'Props'; + var stateTypeName = className + 'State'; + var propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); + var stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType); + var propTypeRef = ts.createTypeReferenceNode(propTypeName, []); + var stateTypeRef = ts.createTypeReferenceNode(stateTypeName, []); + var newClassDeclaration = getNewReactClassDeclaration( + classDeclaration, + shouldMakePropTypeDeclaration ? propTypeRef : propType, + shouldMakeStateTypeDeclaration ? stateTypeRef : stateType, + ); + var allTypeDeclarations = []; + if (shouldMakePropTypeDeclaration) allTypeDeclarations.push(propTypeDeclaration); + if (shouldMakeStateTypeDeclaration) allTypeDeclarations.push(stateTypeDeclaration); + var statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); + statements = helpers.replaceItem(statements, classDeclaration, newClassDeclaration); + return ts.updateSourceFileNode(sourceFile, statements); +} +function getNewReactClassDeclaration(classDeclaration, propTypeRef, stateTypeRef) { + if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { + return classDeclaration; + } + var firstHeritageClause = classDeclaration.heritageClauses[0]; + var newFirstHeritageClauseTypes = helpers.replaceItem( + firstHeritageClause.types, + firstHeritageClause.types[0], + ts.updateExpressionWithTypeArguments( + firstHeritageClause.types[0], + [propTypeRef, stateTypeRef], + firstHeritageClause.types[0].expression, + ), + ); + var newHeritageClauses = helpers.replaceItem( + classDeclaration.heritageClauses, + firstHeritageClause, + ts.updateHeritageClause(firstHeritageClause, newFirstHeritageClauseTypes), + ); + return ts.updateClassDeclaration( + classDeclaration, + classDeclaration.decorators, + classDeclaration.modifiers, + classDeclaration.name, + classDeclaration.typeParameters, + newHeritageClauses, + classDeclaration.members, + ); +} +function getPropsTypeOfReactComponentClass(classDeclaration, sourceFile) { + var staticPropTypesMember = _.find(classDeclaration.members, function(member) { + return ( + ts.isPropertyDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ); + }); + if ( + staticPropTypesMember !== undefined && + ts.isPropertyDeclaration(staticPropTypesMember) && // check to satisfy type checker + staticPropTypesMember.initializer && + ts.isObjectLiteralExpression(staticPropTypesMember.initializer) + ) { + return helpers.buildInterfaceFromPropTypeObjectLiteral(staticPropTypesMember.initializer); + } + var staticPropTypesGetterMember = _.find(classDeclaration.members, function(member) { + return ( + ts.isGetAccessorDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ); + }); + if ( + staticPropTypesGetterMember !== undefined && + ts.isGetAccessorDeclaration(staticPropTypesGetterMember) // check to satisfy typechecker + ) { + var returnStatement = _.find(staticPropTypesGetterMember.body.statements, function(statement) { + return ts.isReturnStatement(statement); + }); + if ( + returnStatement !== undefined && + ts.isReturnStatement(returnStatement) && // check to satisfy typechecker + returnStatement.expression && + ts.isObjectLiteralExpression(returnStatement.expression) + ) { + return helpers.buildInterfaceFromPropTypeObjectLiteral(returnStatement.expression); + } + } + return ts.createTypeLiteralNode([]); +} +function getStateTypeOfReactComponentClass(classDeclaration, typeChecker) { + var initialState = getInitialStateFromClassDeclaration(classDeclaration, typeChecker); + var initialStateIsVoid = initialState.kind === ts.SyntaxKind.VoidKeyword; + var collectedStateTypes = getStateLookingForSetStateCalls(classDeclaration, typeChecker); + if (!collectedStateTypes.length && initialStateIsVoid) { + return ts.createTypeLiteralNode([]); + } + if (!initialStateIsVoid) { + collectedStateTypes.push(initialState); + } + return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.IntersectionType, collectedStateTypes); +} +/** + * Get initial state of a React component looking for state value initially set + * @param classDeclaration + * @param typeChecker + */ +function getInitialStateFromClassDeclaration(classDeclaration, typeChecker) { + // initial state class member + var e_2, _a; + var initialStateMember = _.find(classDeclaration.members, function(member) { + try { + return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'state'; + } catch (e) { + return false; + } + }); + if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { + var type = typeChecker.getTypeAtLocation(initialStateMember.initializer); + return typeChecker.typeToTypeNode(type); + } + // Initial state in constructor + var constructor = _.find(classDeclaration.members, function(member) { + return member.kind === ts.SyntaxKind.Constructor; + }); + if (constructor && constructor.body) { + try { + for (var _b = __values(constructor.body.statements), _c = _b.next(); !_c.done; _c = _b.next()) { + var statement = _c.value; + if ( + ts.isExpressionStatement(statement) && + ts.isBinaryExpression(statement.expression) && + statement.expression.left.getText() === 'this.state' + ) { + return typeChecker.typeToTypeNode(typeChecker.getTypeAtLocation(statement.expression.right)); + } + } + } catch (e_2_1) { + e_2 = { error: e_2_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_2) throw e_2.error; + } + } + } + // No initial state, fall back to void + return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); +} +/** + * Look for setState() function calls to collect the state interface in a React class component + * @param classDeclaration + * @param typeChecker + */ +function getStateLookingForSetStateCalls(classDeclaration, typeChecker) { + var e_3, _a; + var typeNodes = []; + try { + for (var _b = __values(classDeclaration.members), _c = _b.next(); !_c.done; _c = _b.next()) { + var member = _c.value; + if (member && ts.isMethodDeclaration(member) && member.body) { + lookForSetState(member.body); + } + } + } catch (e_3_1) { + e_3 = { error: e_3_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_3) throw e_3.error; + } + } + return typeNodes; + function lookForSetState(node) { + ts.forEachChild(node, lookForSetState); + if ( + ts.isExpressionStatement(node) && + ts.isCallExpression(node.expression) && + node.expression.expression.getText().match(/setState/) + ) { + var type = typeChecker.getTypeAtLocation(node.expression.arguments[0]); + typeNodes.push(typeChecker.typeToTypeNode(type)); + } + } +} +function isStateTypeMemberEmpty(stateType) { + // Only need to handle TypeLiteralNode & IntersectionTypeNode + if (ts.isTypeLiteralNode(stateType)) { + return stateType.members.length === 0; + } + if (!ts.isIntersectionTypeNode(stateType)) { + return true; + } + return stateType.types.every(isStateTypeMemberEmpty); +} diff --git a/d/transforms/react-move-prop-types-to-class-transform.js b/d/transforms/react-move-prop-types-to-class-transform.js new file mode 100644 index 0000000..9a88384 --- /dev/null +++ b/d/transforms/react-move-prop-types-to-class-transform.js @@ -0,0 +1,154 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +var __read = + (this && this.__read) || + function(o, n) { + var m = typeof Symbol === 'function' && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), + r, + ar = [], + e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } catch (error) { + e = { error: error }; + } finally { + try { + if (r && !r.done && (m = i['return'])) m.call(i); + } finally { + if (e) throw e.error; + } + } + return ar; + }; +var __spread = + (this && this.__spread) || + function() { + for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); + return ar; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +var helpers = require('../helpers'); +/** + * Move Component.propTypes statements into class as a static member of the class + * if React component is defined using a class + * + * Note: This transform assumes React component declaration and propTypes assignment statement + * are both on root of the source file + * + * @example + * Before: + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + * SomeComponent.propTypes = { foo: React.PropTypes.string } + * + * After + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> { + * static propTypes = { foo: React.PropTypes.string } + * } + * + * @todo + * This is not supporting multiple statements for a single class yet + * ``` + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + * SomeComponent.propTypes = { foo: React.PropTypes.string } + * SomeComponent.propTypes.bar = React.PropTypes.number; + * ``` + */ +function reactMovePropTypesToClassTransformFactoryFactory(typeChecker) { + return function reactMovePropTypesToClassTransformFactory(context) { + return function reactMovePropTypesToClassTransform(sourceFile) { + var visited = visitSourceFile(sourceFile, typeChecker); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactMovePropTypesToClassTransformFactoryFactory = reactMovePropTypesToClassTransformFactoryFactory; +/** + * Make the move from propType statement to static member + * @param sourceFile + * @param typeChecker + */ +function visitSourceFile(sourceFile, typeChecker) { + var e_1, _a; + var statements = sourceFile.statements; + // Look for propType assignment statements + var propTypeAssignments = statements.filter(function(statement) { + return helpers.isReactPropTypeAssignmentStatement(statement); + }); + var _loop_1 = function(propTypeAssignment) { + // Look for the class declarations with the same name + var componentName = helpers.getComponentName(propTypeAssignment, sourceFile); + var classStatement = _.find(statements, function(statement) { + return ( + ts.isClassDeclaration(statement) && + statement.name !== undefined && + statement.name.getText(sourceFile) === componentName + ); + }); // Type weirdness + // && helpers.isBinaryExpression(propTypeAssignment.expression) is redundant to satisfy the type checker + if (classStatement && ts.isBinaryExpression(propTypeAssignment.expression)) { + var newClassStatement = addStaticMemberToClass( + classStatement, + 'propTypes', + propTypeAssignment.expression.right, + ); + statements = ts.createNodeArray(helpers.replaceItem(statements, classStatement, newClassStatement)); + } + }; + try { + for ( + var propTypeAssignments_1 = __values(propTypeAssignments), + propTypeAssignments_1_1 = propTypeAssignments_1.next(); + !propTypeAssignments_1_1.done; + propTypeAssignments_1_1 = propTypeAssignments_1.next() + ) { + var propTypeAssignment = propTypeAssignments_1_1.value; + _loop_1(propTypeAssignment); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (propTypeAssignments_1_1 && !propTypeAssignments_1_1.done && (_a = propTypeAssignments_1.return)) + _a.call(propTypeAssignments_1); + } finally { + if (e_1) throw e_1.error; + } + } + return ts.updateSourceFileNode(sourceFile, statements); +} +/** + * Insert a new static member into a class + * @param classDeclaration + * @param name + * @param value + */ +function addStaticMemberToClass(classDeclaration, name, value) { + var staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); + var propertyDeclaration = ts.createProperty([], [staticModifier], name, undefined, undefined, value); + return ts.updateClassDeclaration( + classDeclaration, + classDeclaration.decorators, + classDeclaration.modifiers, + classDeclaration.name, + classDeclaration.typeParameters, + ts.createNodeArray(classDeclaration.heritageClauses), + ts.createNodeArray(__spread([propertyDeclaration], classDeclaration.members)), + ); +} diff --git a/d/transforms/react-remove-prop-types-assignment-transform.js b/d/transforms/react-remove-prop-types-assignment-transform.js new file mode 100644 index 0000000..b56e158 --- /dev/null +++ b/d/transforms/react-remove-prop-types-assignment-transform.js @@ -0,0 +1,30 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var helpers = require('../helpers'); +/** + * Remove Component.propTypes statements + * + * @example + * Before: + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + * SomeComponent.propTypes = { foo: React.PropTypes.string } + * + * After + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + */ +function reactRemovePropTypesAssignmentTransformFactoryFactory(typeChecker) { + return function reactRemovePropTypesAssignmentTransformFactory(context) { + return function reactRemovePropTypesAssignmentTransform(sourceFile) { + var visited = ts.updateSourceFileNode( + sourceFile, + sourceFile.statements.filter(function(s) { + return !helpers.isReactPropTypeAssignmentStatement(s); + }), + ); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactRemovePropTypesAssignmentTransformFactoryFactory = reactRemovePropTypesAssignmentTransformFactoryFactory; diff --git a/d/transforms/react-remove-prop-types-import.js b/d/transforms/react-remove-prop-types-import.js new file mode 100644 index 0000000..5b3a9d2 --- /dev/null +++ b/d/transforms/react-remove-prop-types-import.js @@ -0,0 +1,70 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +/** + * Remove `import PropTypes from 'prop-types'` or + * `import { PropTypes } from 'react'` + * + * @example + * Before: + * import PropTypes from 'prop-types' + * import React, { PropTypes } from 'react' + * + * After: + * import React from 'react' + */ +function reactRemovePropTypesImportTransformFactoryFactory(typeChecker) { + return function reactRemovePropTypesImportTransformFactory(context) { + return function reactRemovePropTypesImportTransform(sourceFile) { + var visited = ts.updateSourceFileNode( + sourceFile, + sourceFile.statements + .filter(function(s) { + return !( + ts.isImportDeclaration(s) && + ts.isStringLiteral(s.moduleSpecifier) && + s.moduleSpecifier.text === 'prop-types' + ); + }) + .map(updateReactImportIfNeeded), + ); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactRemovePropTypesImportTransformFactoryFactory = reactRemovePropTypesImportTransformFactoryFactory; +function updateReactImportIfNeeded(statement) { + if ( + !ts.isImportDeclaration(statement) || + !ts.isStringLiteral(statement.moduleSpecifier) || + statement.moduleSpecifier.text !== 'react' || + !statement.importClause || + !statement.importClause.namedBindings || + !ts.isNamedImports(statement.importClause.namedBindings) + ) { + return statement; + } + var namedBindings = statement.importClause.namedBindings; + var newNamedBindingElements = namedBindings.elements.filter(function(elm) { + return elm.name.text !== 'PropTypes'; + }); + if (newNamedBindingElements.length === namedBindings.elements.length) { + // Means it has no 'PropTypes' named import + return statement; + } + var newImportClause = ts.updateImportClause( + statement.importClause, + statement.importClause.name, + newNamedBindingElements.length === 0 + ? undefined + : ts.updateNamedImports(namedBindings, newNamedBindingElements), + ); + return ts.updateImportDeclaration( + statement, + statement.decorators, + statement.modifiers, + newImportClause, + statement.moduleSpecifier, + ); +} diff --git a/d/transforms/react-remove-static-prop-types-member-transform.js b/d/transforms/react-remove-static-prop-types-member-transform.js new file mode 100644 index 0000000..064c63a --- /dev/null +++ b/d/transforms/react-remove-static-prop-types-member-transform.js @@ -0,0 +1,59 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var helpers = require('../helpers'); +/** + * Remove static propTypes + * + * @example + * Before: + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> { + * static propTypes = { + * foo: React.PropTypes.number.isRequired, + * } + * } + * + * After: + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + */ +function reactRemoveStaticPropTypesMemberTransformFactoryFactory(typeChecker) { + return function reactRemoveStaticPropTypesMemberTransformFactory(context) { + return function reactRemoveStaticPropTypesMemberTransform(sourceFile) { + var visited = ts.visitEachChild(sourceFile, visitor, context); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + function visitor(node) { + if (ts.isClassDeclaration(node) && helpers.isReactComponent(node, typeChecker)) { + return ts.updateClassDeclaration( + node, + node.decorators, + node.modifiers, + node.name, + node.typeParameters, + ts.createNodeArray(node.heritageClauses), + node.members.filter(function(member) { + if ( + ts.isPropertyDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ) { + return false; + } + // propTypes getter + if ( + ts.isGetAccessorDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ) { + return false; + } + return true; + }), + ); + } + return node; + } + }; + }; +} +exports.reactRemoveStaticPropTypesMemberTransformFactoryFactory = reactRemoveStaticPropTypesMemberTransformFactoryFactory; diff --git a/d/transforms/react-stateless-function-make-props-transform.js b/d/transforms/react-stateless-function-make-props-transform.js new file mode 100644 index 0000000..f3055e5 --- /dev/null +++ b/d/transforms/react-stateless-function-make-props-transform.js @@ -0,0 +1,133 @@ +'use strict'; +var __values = + (this && this.__values) || + function(o) { + var m = typeof Symbol === 'function' && o[Symbol.iterator], + i = 0; + if (m) return m.call(o); + return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + }; +Object.defineProperty(exports, '__esModule', { value: true }); +var ts = require('typescript'); +var _ = require('lodash'); +var helpers = require('../helpers'); +/** + * Transform react stateless components + * + * @example + * Before: + * const Hello = ({ message }) => { + * return
hello {message}
+ * } + * // Or: + * // const Hello = ({ message }) =>
hello {message}
+ * + * Hello.propTypes = { + * message: React.PropTypes.string, + * } + * + * After: + * Type HelloProps = { + * message: string; + * } + * + * const Hello: React.SFC = ({ message }) => { + * return
hello {message}
+ * } + * + * Hello.propTypes = { + * message: React.PropTypes.string, + * } + */ +function reactStatelessFunctionMakePropsTransformFactoryFactory(typeChecker) { + return function reactStatelessFunctionMakePropsTransformFactory(context) { + return function reactStatelessFunctionMakePropsTransform(sourceFile) { + var visited = visitSourceFile(sourceFile, typeChecker); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + return visited; + }; + }; +} +exports.reactStatelessFunctionMakePropsTransformFactoryFactory = reactStatelessFunctionMakePropsTransformFactoryFactory; +function visitSourceFile(sourceFile, typeChecker) { + var e_1, _a; + // Look for propType assignment statements + var propTypeAssignments = sourceFile.statements.filter(function(statement) { + return helpers.isReactPropTypeAssignmentStatement(statement); + }); + var newSourceFile = sourceFile; + var _loop_1 = function(propTypeAssignment) { + var componentName = helpers.getComponentName(propTypeAssignment, newSourceFile); + var funcComponent = _.find(newSourceFile.statements, function(s) { + return ( + (ts.isFunctionDeclaration(s) && s.name !== undefined && s.name.getText() === componentName) || + (ts.isVariableStatement(s) && s.declarationList.declarations[0].name.getText() === componentName) + ); + }); // Type weirdness + if (funcComponent) { + newSourceFile = visitReactStatelessComponent(funcComponent, propTypeAssignment, newSourceFile); + } + }; + try { + for ( + var propTypeAssignments_1 = __values(propTypeAssignments), + propTypeAssignments_1_1 = propTypeAssignments_1.next(); + !propTypeAssignments_1_1.done; + propTypeAssignments_1_1 = propTypeAssignments_1.next() + ) { + var propTypeAssignment = propTypeAssignments_1_1.value; + _loop_1(propTypeAssignment); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (propTypeAssignments_1_1 && !propTypeAssignments_1_1.done && (_a = propTypeAssignments_1.return)) + _a.call(propTypeAssignments_1); + } finally { + if (e_1) throw e_1.error; + } + } + return newSourceFile; +} +function visitReactStatelessComponent(component, propTypesExpressionStatement, sourceFile) { + var arrowFuncComponent = helpers.convertReactStatelessFunctionToArrowFunction(component); + var componentName = arrowFuncComponent.declarationList.declarations[0].name.getText(); + var componentInitializer = arrowFuncComponent.declarationList.declarations[0].initializer; + var propType = getPropTypesFromTypeAssignment(propTypesExpressionStatement); + var shouldMakePropTypeDeclaration = propType.members.length > 0; + var propTypeName = componentName + 'Props'; + var propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); + var propTypeRef = ts.createTypeReferenceNode(propTypeName, []); + var componentType = ts.createTypeReferenceNode(ts.createQualifiedName(ts.createIdentifier('React'), 'SFC'), [ + shouldMakePropTypeDeclaration ? propTypeRef : propType, + ]); + // replace component with ts stateless component + var typedComponent = ts.createVariableStatement( + arrowFuncComponent.modifiers, + ts.createVariableDeclarationList( + [ts.createVariableDeclaration(componentName, componentType, componentInitializer)], + arrowFuncComponent.declarationList.flags, + ), + ); + var statements = shouldMakePropTypeDeclaration + ? helpers.insertBefore(sourceFile.statements, component, [propTypeDeclaration]) + : sourceFile.statements; + statements = helpers.replaceItem(statements, component, typedComponent); + return ts.updateSourceFileNode(sourceFile, statements); +} +function getPropTypesFromTypeAssignment(propTypesExpressionStatement) { + if ( + propTypesExpressionStatement !== undefined && + ts.isBinaryExpression(propTypesExpressionStatement.expression) && + ts.isObjectLiteralExpression(propTypesExpressionStatement.expression.right) + ) { + return helpers.buildInterfaceFromPropTypeObjectLiteral(propTypesExpressionStatement.expression.right); + } + return ts.createTypeLiteralNode([]); +} diff --git a/package.json b/package.json index 55994ac..8123b95 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "prelint": "npm run clean", "lint": "tslint --project tsconfig.json --format codeFrame --exclude test/**/*.tsx", "prepublish": "npm run build", - "clean": "rm -rf dist", + "clean": "rm -rf d", "prebuild": "npm run clean", "build": "tsc --pretty", "precommit": "lint-staged", @@ -35,9 +35,9 @@ "commander": "^2.15.1", "detect-indent": "^5.0.0", "glob": "^7.1.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "prettier": "^1.12.1", - "typescript": "2.8.3" + "typescript": "^2.8.3" }, "devDependencies": { "@types/chalk": "^2.2.0", @@ -45,7 +45,7 @@ "@types/detect-indent": "^5.0.0", "@types/glob": "^5.0.35", "@types/jest": "^22.2.3", - "@types/lodash": "^4.14.109", + "@types/lodash": "^4.14.135", "@types/node": "^10.1.2", "@types/prettier": "^1.12.2", "@types/react": "^16.3.14", diff --git a/src/P.js b/src/P.js new file mode 100644 index 0000000..072f11b --- /dev/null +++ b/src/P.js @@ -0,0 +1,5 @@ +class Panel extends React.Component { + static propTypes = { + multi: PropTypes.string.isRequired, + }; +} diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index c61d193..cec52bb 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -44,9 +44,10 @@ function visitReactClassDeclaration( const stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); const shouldMakePropTypeDeclaration = propType.members.length > 0; const shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); - const propTypeName = `${className}Props`; + const propTypeName = `I${className}Props`; const stateTypeName = `${className}State`; - const propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); + // const propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); + const propTypeDeclaration = ts.createInterfaceDeclaration([], [], propTypeName, [], [], propType.members); const stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType); const propTypeRef = ts.createTypeReferenceNode(propTypeName, []); const stateTypeRef = ts.createTypeReferenceNode(stateTypeName, []); diff --git a/test/end-to-end/initial-state-and-proprypes-and-set-state/output.tsx b/test/end-to-end/initial-state-and-proprypes-and-set-state/output.tsx index 95fae0f..58fa324 100644 --- a/test/end-to-end/initial-state-and-proprypes-and-set-state/output.tsx +++ b/test/end-to-end/initial-state-and-proprypes-and-set-state/output.tsx @@ -1,13 +1,13 @@ import * as React from 'react'; -type MyComponentProps = { - baz: string, -}; +interface IMyComponentProps { + baz: string; +} type MyComponentState = { dynamicState: number, foo: number, bar: string, }; -export default class MyComponent extends React.Component { +export default class MyComponent extends React.Component { state = { foo: 1, bar: 'str' }; render() { return
; diff --git a/test/end-to-end/initial-state-and-proprypes/output.tsx b/test/end-to-end/initial-state-and-proprypes/output.tsx index 912e3b8..cf52bc2 100644 --- a/test/end-to-end/initial-state-and-proprypes/output.tsx +++ b/test/end-to-end/initial-state-and-proprypes/output.tsx @@ -1,12 +1,12 @@ import * as React from 'react'; -type MyComponentProps = { - baz: string, -}; +interface IMyComponentProps { + baz: string; +} type MyComponentState = { foo: number, bar: string, }; -export default class MyComponent extends React.Component { +export default class MyComponent extends React.Component { state = { foo: 1, bar: 'str' }; render() { return
; diff --git a/test/end-to-end/multiple-components/output.tsx b/test/end-to-end/multiple-components/output.tsx index 5495538..72dc1d9 100644 --- a/test/end-to-end/multiple-components/output.tsx +++ b/test/end-to-end/multiple-components/output.tsx @@ -22,10 +22,10 @@ export default class MyComponent extends React.Component<{}, MyComponentState> { this.setState({ foo: 1, bar: 2 }); } } -type AnotherComponentProps = { - foo: string, -}; -export class AnotherComponent extends React.Component { +interface IAnotherComponentProps { + foo: string; +} +export class AnotherComponent extends React.Component { render() { return
; } diff --git a/test/react-js-make-props-and-state-transform/multiple-components/output.tsx b/test/react-js-make-props-and-state-transform/multiple-components/output.tsx index c5fdde8..4ebb9e9 100644 --- a/test/react-js-make-props-and-state-transform/multiple-components/output.tsx +++ b/test/react-js-make-props-and-state-transform/multiple-components/output.tsx @@ -8,10 +8,10 @@ export default class MyComponent extends React.Component<{}, MyComponentState> { this.setState({ foo: 1, bar: 2 }); } } -type AnotherComponentProps = { - foo: string, -}; -export class AnotherComponent extends React.Component { +interface IAnotherComponentProps { + foo: string; +} +export class AnotherComponent extends React.Component { static propTypes = { foo: React.PropTypes.string.isRequired, }; diff --git a/test/react-js-make-props-and-state-transform/static-proptypes-getter-simple/output.tsx b/test/react-js-make-props-and-state-transform/static-proptypes-getter-simple/output.tsx index b4206de..afae8c0 100644 --- a/test/react-js-make-props-and-state-transform/static-proptypes-getter-simple/output.tsx +++ b/test/react-js-make-props-and-state-transform/static-proptypes-getter-simple/output.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; -type MyComponentProps = { - foo: string, -}; -export default class MyComponent extends React.Component { +interface IMyComponentProps { + foo: string; +} +export default class MyComponent extends React.Component { static get propTypes() { return { foo: React.PropTypes.string.isRequired, diff --git a/test/react-js-make-props-and-state-transform/static-proptypes-many-props/output.tsx b/test/react-js-make-props-and-state-transform/static-proptypes-many-props/output.tsx index 7604480..05d7321 100644 --- a/test/react-js-make-props-and-state-transform/static-proptypes-many-props/output.tsx +++ b/test/react-js-make-props-and-state-transform/static-proptypes-many-props/output.tsx @@ -1,45 +1,45 @@ import * as React from 'react'; -type MyComponentProps = { - any?: any, - array?: any[], - bool?: boolean, - func?: (...args: any[]) => any, - number?: number, - object?: object, - string?: string, - node?: React.ReactNode, - element?: JSX.Element, - oneOf?: 'a' | 'b' | 'c', - oneOfType?: string | number, - arrayOf?: string[], +interface IMyComponentProps { + any?: any; + array?: any[]; + bool?: boolean; + func?: (...args: any[]) => any; + number?: number; + object?: object; + string?: string; + node?: React.ReactNode; + element?: JSX.Element; + oneOf?: 'a' | 'b' | 'c'; + oneOfType?: string | number; + arrayOf?: string[]; objectOf?: { [key: string]: string, - }, + }; shape?: { color?: string, fontSize?: number, - }, - anyRequired: any, - arrayRequired: any[], - boolRequired: boolean, - funcRequired: (...args: any[]) => any, - numberRequired: number, - objectRequired: object, - stringRequired: string, - nodeRequired: React.ReactNode, - elementRequired: JSX.Element, - oneOfRequired: 'a' | 'b' | 'c', - oneOfTypeRequired: string | number, - arrayOfRequired: string[], + }; + anyRequired: any; + arrayRequired: any[]; + boolRequired: boolean; + funcRequired: (...args: any[]) => any; + numberRequired: number; + objectRequired: object; + stringRequired: string; + nodeRequired: React.ReactNode; + elementRequired: JSX.Element; + oneOfRequired: 'a' | 'b' | 'c'; + oneOfTypeRequired: string | number; + arrayOfRequired: string[]; objectOfRequired: { [key: string]: string, - }, + }; shapeRequired: { color?: string, fontSize: number, - }, -}; -export default class MyComponent extends React.Component { + }; +} +export default class MyComponent extends React.Component { static propTypes = { children: React.PropTypes.node, any: React.PropTypes.any, diff --git a/test/react-js-make-props-and-state-transform/static-proptypes-simple/output.tsx b/test/react-js-make-props-and-state-transform/static-proptypes-simple/output.tsx index 1d7764e..81731dc 100644 --- a/test/react-js-make-props-and-state-transform/static-proptypes-simple/output.tsx +++ b/test/react-js-make-props-and-state-transform/static-proptypes-simple/output.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; -type MyComponentProps = { - foo: string, -}; -export default class MyComponent extends React.Component { +interface IMyComponentProps { + foo: string; +} +export default class MyComponent extends React.Component { static propTypes = { foo: React.PropTypes.string.isRequired, }; diff --git a/test/transformers.test.ts b/test/transformers.test.ts index 8b845d4..7a083f2 100644 --- a/test/transformers.test.ts +++ b/test/transformers.test.ts @@ -32,7 +32,7 @@ const transformToFolderMap: [string, TransformFactoryFactory[]][] = [ ['collapse-intersection-interfaces-transform', [collapseIntersectionInterfacesTransformFactoryFactory]], ['react-move-prop-types-to-class-transform', [reactMovePropTypesToClassTransformFactoryFactory]], ['react-remove-prop-types-import', [reactRemovePropTypesImportTransformFactoryFactory]], - ['end-to-end', allTransforms], + ['end-to-end', allTransforms] ]; const isJestUpdateSnapshotEnabled = !!_.intersection(process.argv, ['-u', '--updateSnapshot']).length; diff --git a/tsconfig.json b/tsconfig.json index 0a2ed71..f4d1f51 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,15 +2,15 @@ "compilerOptions": { "strict": true, "target": "es5", - "declaration": true, + "declaration": false, "moduleResolution": "node", "module": "commonjs", "emitDecoratorMetadata": true, "experimentalDecorators": true, "downlevelIteration": true, - "sourceMap": true, - "outDir": "dist", - "sourceRoot": "../src", + "sourceMap": false, + "outDir": "d", + "rootDir": "./src", "lib": ["dom", "es2015"] }, "exclude": ["node_modules", "test", "dist"], diff --git a/yarn.lock b/yarn.lock index fcb2ae6..6bc5241 100644 --- a/yarn.lock +++ b/yarn.lock @@ -48,9 +48,10 @@ version "22.2.3" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d" -"@types/lodash@^4.14.109": - version "4.14.109" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.109.tgz#b1c4442239730bf35cabaf493c772b18c045886d" +"@types/lodash@^4.14.135": + version "4.14.135" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.135.tgz#d2607c35dd68f70c2b35ba020c667493dedd8447" + integrity sha512-Ed+tSZ9qM1oYpi5kzdsBuOzcAIn1wDW+e8TFJ50IMJMlSopGdJgKAbhHzN6h1E1OfjlGOr2JepzEWtg9NIfoNg== "@types/minimatch@*": version "3.0.3" @@ -2345,6 +2346,11 @@ lodash@^4.14.0, lodash@^4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -3644,9 +3650,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -typescript@2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" +typescript@^2.8.3: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== uglify-js@^2.6: version "2.8.29" From 826e1b1281728f285de95ab63eaec69133e5fbeb Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Wed, 10 Jul 2019 13:21:12 +0800 Subject: [PATCH 03/26] p --- .gitignore | 2 + d/P.tsx | 4 - d/cli.js | 130 --------- d/compiler.js | 156 ----------- d/helpers/build-prop-type-interface.js | 190 ------------- d/helpers/index.js | 197 ------------- d/index.js | 48 ---- ...lapse-intersection-interfaces-transform.js | 187 ------------- ...react-js-make-props-and-state-transform.js | 258 ------------------ ...eact-move-prop-types-to-class-transform.js | 154 ----------- ...-remove-prop-types-assignment-transform.js | 30 -- .../react-remove-prop-types-import.js | 70 ----- ...move-static-prop-types-member-transform.js | 59 ---- ...stateless-function-make-props-transform.js | 133 --------- 14 files changed, 2 insertions(+), 1616 deletions(-) delete mode 100644 d/P.tsx delete mode 100644 d/cli.js delete mode 100644 d/compiler.js delete mode 100644 d/helpers/build-prop-type-interface.js delete mode 100644 d/helpers/index.js delete mode 100644 d/index.js delete mode 100644 d/transforms/collapse-intersection-interfaces-transform.js delete mode 100644 d/transforms/react-js-make-props-and-state-transform.js delete mode 100644 d/transforms/react-move-prop-types-to-class-transform.js delete mode 100644 d/transforms/react-remove-prop-types-assignment-transform.js delete mode 100644 d/transforms/react-remove-prop-types-import.js delete mode 100644 d/transforms/react-remove-static-prop-types-member-transform.js delete mode 100644 d/transforms/react-stateless-function-make-props-transform.js diff --git a/.gitignore b/.gitignore index 6897440..6921174 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ dist .DS_Store coverage/ *.log +d + diff --git a/d/P.tsx b/d/P.tsx deleted file mode 100644 index 0ec3330..0000000 --- a/d/P.tsx +++ /dev/null @@ -1,4 +0,0 @@ -type PanelProps = { - multi?: any; -}; -class Panel extends React.Component {} diff --git a/d/cli.js b/d/cli.js deleted file mode 100644 index a3b0b46..0000000 --- a/d/cli.js +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env node -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var program = require('commander'); -var glob = require('glob'); -var fs = require('fs'); -var path = require('path'); -var _1 = require('.'); - -// copy file -const filePath = path.join(__dirname, '../src/P.js'); -const content = fs.readFileSync(filePath, 'utf8'); -const newfile = path.join(__dirname, 'P.js'); -fs.writeFileSync(newfile, content); -// end of copy file - -function resolveGlobs(globPatterns) { - var files = []; - function addFile(file) { - file = path.resolve(file); - if (files.indexOf(file) === -1) { - files.push(file); - } - } - globPatterns.forEach(function(pattern) { - if (/[{}*?+\[\]]/.test(pattern)) { - // Smells like globs - glob.sync(pattern, {}).forEach(function(file) { - addFile(file); - }); - } else { - addFile(pattern); - } - }); - return files; -} -program - .version('1.0.0') - .option('--arrow-parens ', 'Include parentheses around a sole arrow function parameter.', 'avoid') - .option('--no-bracket-spacing', 'Do not print spaces between brackets.', false) - .option('--jsx-bracket-same-line', 'Put > on the last line instead of at a new line.', false) - .option('--print-width ', 'The line length where Prettier will try wrap.', 80) - .option('--prose-wrap How to wrap prose. (markdown)', 'preserve') - .option('--no-semi', 'Do not print semicolons, except at the beginning of lines which may need them', false) - .option('--single-quote', 'Use single quotes instead of double quotes.', false) - .option('--tab-width ', 'Number of spaces per indentation level.', 2) - .option('--trailing-comma ', 'Print trailing commas wherever possible when multi-line.', 'none') - .option('--use-tabs', 'Indent with tabs instead of spaces.', false) - .option('--ignore-prettier-errors', 'Ignore (but warn about) errors in Prettier', false) - .option('--keep-original-files', 'Keep original files', false) - .option('--keep-temporary-files', 'Keep temporary files', false) - .usage('[options] ') - .command('* [glob/filename...]') - .action(function(globPatterns) { - var e_1, _a; - var prettierOptions = { - arrowParens: program.arrowParens, - bracketSpacing: !program.noBracketSpacing, - jsxBracketSameLine: !!program.jsxBracketSameLine, - printWidth: parseInt(program.printWidth, 10), - proseWrap: program.proseWrap, - semi: !program.noSemi, - singleQuote: !!program.singleQuote, - tabWidth: parseInt(program.tabWidth, 10), - trailingComma: program.trailingComma, - useTabs: !!program.useTabs, - }; - var compilationOptions = { - ignorePrettierErrors: !!program.ignorePrettierErrors, - }; - var files = resolveGlobs(globPatterns); - if (!files.length) { - throw new Error('Nothing to do. You must provide file names or glob patterns to transform.'); - } - var errors = false; - try { - for ( - var files_1 = __values(files), files_1_1 = files_1.next(); - !files_1_1.done; - files_1_1 = files_1.next() - ) { - var filePath = files_1_1.value; - console.log('Transforming ' + filePath + '...'); - var newPath = filePath.replace(/\.jsx?$/, '.tsx'); - var temporaryPath = filePath.replace(/\.jsx?$/, '_js2ts_' + +new Date() + '.tsx'); - try { - fs.copyFileSync(filePath, temporaryPath); - var result = _1.run(temporaryPath, prettierOptions, compilationOptions); - fs.writeFileSync(newPath, result); - if (!program.keepOriginalFiles) { - fs.unlinkSync(filePath); - } - } catch (error) { - console.warn('Failed to convert ' + filePath); - console.warn(error); - errors = true; - } - if (!program.keepTemporaryFiles) { - if (fs.existsSync(temporaryPath)) { - fs.unlinkSync(temporaryPath); - } - } - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (files_1_1 && !files_1_1.done && (_a = files_1.return)) _a.call(files_1); - } finally { - if (e_1) throw e_1.error; - } - } - if (errors) { - process.exit(1); - } - }); -program.parse(process.argv); diff --git a/d/compiler.js b/d/compiler.js deleted file mode 100644 index 0170584..0000000 --- a/d/compiler.js +++ /dev/null @@ -1,156 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var os = require('os'); -var fs = require('fs'); -var ts = require('typescript'); -var chalk_1 = require('chalk'); -var _ = require('lodash'); -var prettier = require('prettier'); -var detectIndent = require('detect-indent'); -var DEFAULT_COMPILATION_OPTIONS = { - ignorePrettierErrors: false, -}; -exports.DEFAULT_COMPILATION_OPTIONS = DEFAULT_COMPILATION_OPTIONS; -/** - * Compile and return result TypeScript - * @param filePath Path to file to compile - */ -function compile(filePath, factoryFactories, incomingPrettierOptions, compilationOptions) { - if (incomingPrettierOptions === void 0) { - incomingPrettierOptions = {}; - } - if (compilationOptions === void 0) { - compilationOptions = DEFAULT_COMPILATION_OPTIONS; - } - var e_1, _a; - var compilerOptions = { - target: ts.ScriptTarget.ES2017, - module: ts.ModuleKind.ES2015, - }; - var program = ts.createProgram([filePath], compilerOptions); - // `program.getSourceFiles()` will include those imported files, - // like: `import * as a from './file-a'`. - // We should only transform current file. - var sourceFiles = program.getSourceFiles().filter(function(sf) { - return sf.fileName === filePath; - }); - var typeChecker = program.getTypeChecker(); - var result = ts.transform( - sourceFiles, - factoryFactories.map(function(factoryFactory) { - return factoryFactory(typeChecker); - }, compilerOptions), - ); - if (result.diagnostics && result.diagnostics.length) { - console.log( - chalk_1.default.yellow( - '\n ======================= Diagnostics for ' + filePath + ' =======================\n ', - ), - ); - try { - for (var _b = __values(result.diagnostics), _c = _b.next(); !_c.done; _c = _b.next()) { - var diag = _c.value; - if (diag.file && diag.start) { - var pos = diag.file.getLineAndCharacterOfPosition(diag.start); - console.log('(' + pos.line + ', ' + pos.character + ') ' + diag.messageText); - } - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_1) throw e_1.error; - } - } - } - var printer = ts.createPrinter(); - // TODO: fix the index 0 access... What if program have multiple source files? - var printed = printer.printNode(ts.EmitHint.SourceFile, result.transformed[0], sourceFiles[0]); - var inputSource = fs.readFileSync(filePath, 'utf-8'); - var prettierOptions = getPrettierOptions(filePath, inputSource, incomingPrettierOptions); - try { - return prettier.format(printed, prettierOptions); - } catch (prettierError) { - if (compilationOptions.ignorePrettierErrors) { - console.warn('Prettier failed for ' + filePath + ' (ignorePrettierErrors is on):'); - console.warn(prettierError); - return printed; - } - throw prettierError; - } -} -exports.compile = compile; -/** - * Get Prettier options based on style of a JavaScript - * @param filePath Path to source file - * @param source Body of a JavaScript - * @param options Existing prettier option - */ -function getPrettierOptions(filePath, source, options) { - var resolvedOptions = prettier.resolveConfig.sync(filePath); - if (resolvedOptions) { - _.defaults(resolvedOptions, options); - return resolvedOptions; - } - var _a = detectIndent(source), - indentAmount = _a.amount, - indentType = _a.type; - var sourceWidth = getCodeWidth(source, 80); - var semi = getUseOfSemi(source); - var quotations = getQuotation(source); - _.defaults(Object.assign({}, options), { - tabWidth: indentAmount, - useTabs: indentType && indentType === 'tab', - printWidth: sourceWidth, - semi: semi, - singleQuote: quotations === 'single', - }); - return options; -} -exports.getPrettierOptions = getPrettierOptions; -/** - * Given body of a source file, return its code width - * @param source - */ -function getCodeWidth(source, defaultWidth) { - return source.split(os.EOL).reduce(function(result, line) { - return Math.max(result, line.length); - }, defaultWidth); -} -/** - * Detect if a source file is using semicolon - * @todo: use an actual parser. This is not a proper implementation - * @param source - * @return true if code is using semicolons - */ -function getUseOfSemi(source) { - return source.indexOf(';') !== -1; -} -/** - * Detect if a source file is using single quotes or double quotes - * @todo use an actual parser. This is not a proper implementation - * @param source - */ -function getQuotation(source) { - var numberOfSingleQuotes = (source.match(/\'/g) || []).length; - var numberOfDoubleQuotes = (source.match(/\"/g) || []).length; - if (numberOfSingleQuotes > numberOfDoubleQuotes) { - return 'single'; - } - return 'double'; -} diff --git a/d/helpers/build-prop-type-interface.js b/d/helpers/build-prop-type-interface.js deleted file mode 100644 index 1928455..0000000 --- a/d/helpers/build-prop-type-interface.js +++ /dev/null @@ -1,190 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -/** - * Build props interface from propTypes object - * @example - * { - * foo: React.PropTypes.string.isRequired - * } - * - * becomes - * { - * foo: string; - * } - * @param objectLiteral - */ -function buildInterfaceFromPropTypeObjectLiteral(objectLiteral) { - var members = objectLiteral.properties - // We only need to process PropertyAssignment: - // { - // a: 123 // PropertyAssignment - // } - // - // filter out: - // { - // a() {}, // MethodDeclaration - // b, // ShorthandPropertyAssignment - // ...c, // SpreadAssignment - // get d() {}, // AccessorDeclaration - // } - .filter(ts.isPropertyAssignment) - // Ignore children, React types have it - .filter(function(property) { - return property.name.getText() !== 'children'; - }) - .map(function(propertyAssignment) { - var name = propertyAssignment.name.getText(); - var initializer = propertyAssignment.initializer; - var isRequired = isPropTypeRequired(initializer); - var typeExpression = isRequired - ? // We have guaranteed the type in `isPropTypeRequired()` - initializer.expression - : initializer; - var typeValue = getTypeFromReactPropTypeExpression(typeExpression); - return ts.createPropertySignature( - [], - name, - isRequired ? undefined : ts.createToken(ts.SyntaxKind.QuestionToken), - typeValue, - undefined, - ); - }); - return ts.createTypeLiteralNode(members); -} -exports.buildInterfaceFromPropTypeObjectLiteral = buildInterfaceFromPropTypeObjectLiteral; -/** - * Turns React.PropTypes.* into TypeScript type value - * - * @param node React propTypes value - */ -function getTypeFromReactPropTypeExpression(node) { - var result = null; - if (ts.isPropertyAccessExpression(node)) { - /** - * PropTypes.array, - * PropTypes.bool, - * PropTypes.func, - * PropTypes.number, - * PropTypes.object, - * PropTypes.string, - * PropTypes.symbol, (ignore) - * PropTypes.node, - * PropTypes.element, - * PropTypes.any, - */ - var text = node.getText().replace(/React\.PropTypes\./, ''); - if (/string/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); - } else if (/any/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); - } else if (/array/.test(text)) { - result = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - } else if (/bool/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); - } else if (/number/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); - } else if (/object/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword); - } else if (/node/.test(text)) { - result = ts.createTypeReferenceNode('React.ReactNode', []); - } else if (/element/.test(text)) { - result = ts.createTypeReferenceNode('JSX.Element', []); - } else if (/func/.test(text)) { - var arrayOfAny = ts.createParameter( - [], - [], - ts.createToken(ts.SyntaxKind.DotDotDotToken), - 'args', - undefined, - ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)), - undefined, - ); - result = ts.createFunctionTypeNode([], [arrayOfAny], ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - } - } else if (ts.isCallExpression(node)) { - /** - * PropTypes.instanceOf(), (ignore) - * PropTypes.oneOf(), // only support oneOf([1, 2]), oneOf(['a', 'b']) - * PropTypes.oneOfType(), - * PropTypes.arrayOf(), - * PropTypes.objectOf(), - * PropTypes.shape(), - */ - var text = node.expression.getText(); - if (/oneOf$/.test(text)) { - var argument = node.arguments[0]; - if (ts.isArrayLiteralExpression(argument)) { - if ( - argument.elements.every(function(elm) { - return ts.isStringLiteral(elm) || ts.isNumericLiteral(elm); - }) - ) { - result = ts.createUnionTypeNode( - argument.elements.map(function(elm) { - return ts.createLiteralTypeNode(elm); - }), - ); - } - } - } else if (/oneOfType$/.test(text)) { - var argument = node.arguments[0]; - if (ts.isArrayLiteralExpression(argument)) { - result = ts.createUnionOrIntersectionTypeNode( - ts.SyntaxKind.UnionType, - argument.elements.map(function(elm) { - return getTypeFromReactPropTypeExpression(elm); - }), - ); - } - } else if (/arrayOf$/.test(text)) { - var argument = node.arguments[0]; - if (argument) { - result = ts.createArrayTypeNode(getTypeFromReactPropTypeExpression(argument)); - } - } else if (/objectOf$/.test(text)) { - var argument = node.arguments[0]; - if (argument) { - result = ts.createTypeLiteralNode([ - ts.createIndexSignature( - undefined, - undefined, - [ - ts.createParameter( - undefined, - undefined, - undefined, - 'key', - undefined, - ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), - ), - ], - getTypeFromReactPropTypeExpression(argument), - ), - ]); - } - } else if (/shape$/.test(text)) { - var argument = node.arguments[0]; - if (ts.isObjectLiteralExpression(argument)) { - return buildInterfaceFromPropTypeObjectLiteral(argument); - } - } - } - /** - * customProp, - * anything others - */ - if (result === null) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); - } - return result; -} -/** - * Decide if node is required - * @param node React propTypes member node - */ -function isPropTypeRequired(node) { - if (!ts.isPropertyAccessExpression(node)) return false; - var text = node.getText().replace(/React\.PropTypes\./, ''); - return /\.isRequired/.test(text); -} diff --git a/d/helpers/index.js b/d/helpers/index.js deleted file mode 100644 index 4c2adf9..0000000 --- a/d/helpers/index.js +++ /dev/null @@ -1,197 +0,0 @@ -'use strict'; -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -__export(require('./build-prop-type-interface')); -/** - * If a class declaration a react class? - * @param classDeclaration - * @param typeChecker - */ -function isReactComponent(classDeclaration, typeChecker) { - // Only classes that extend React.Component - if (!classDeclaration.heritageClauses) { - return false; - } - if (classDeclaration.heritageClauses.length !== 1) { - return false; - } - var firstHeritageClauses = classDeclaration.heritageClauses[0]; - if (firstHeritageClauses.token !== ts.SyntaxKind.ExtendsKeyword) { - return false; - } - var expressionWithTypeArguments = firstHeritageClauses.types[0]; - if (!expressionWithTypeArguments) { - return false; - } - // Try type checker and fallback to node text - var type = typeChecker.getTypeAtLocation(expressionWithTypeArguments); - var typeSymbol = type && type.symbol && type.symbol.name; - if (!typeSymbol) { - typeSymbol = expressionWithTypeArguments.expression.getText(); - } - if (!/React\.Component|Component/.test(typeSymbol)) { - return false; - } - return true; -} -exports.isReactComponent = isReactComponent; -/** - * Determine if a ts.HeritageClause is React HeritageClause - * - * @example `extends React.Component<{}, {}>` is a React HeritageClause - * - * @todo: this is lazy. Use the typeChecker instead - * @param clause - */ -function isReactHeritageClause(clause) { - return ( - clause.token === ts.SyntaxKind.ExtendsKeyword && - clause.types.length === 1 && - ts.isExpressionWithTypeArguments(clause.types[0]) && - /Component/.test(clause.types[0].expression.getText()) - ); -} -exports.isReactHeritageClause = isReactHeritageClause; -/** - * Return true if a statement is a React propType assignment statement - * @example - * SomeComponent.propTypes = { foo: React.PropTypes.string }; - * @param statement - */ -function isReactPropTypeAssignmentStatement(statement) { - return ( - ts.isExpressionStatement(statement) && - ts.isBinaryExpression(statement.expression) && - statement.expression.operatorToken.kind === ts.SyntaxKind.FirstAssignment && - ts.isPropertyAccessExpression(statement.expression.left) && - /\.propTypes$|\.propTypes\..+$/.test(statement.expression.left.getText()) - ); -} -exports.isReactPropTypeAssignmentStatement = isReactPropTypeAssignmentStatement; -/** - * Does class member have a "static" member? - * @param classMember - */ -function hasStaticModifier(classMember) { - if (!classMember.modifiers) { - return false; - } - var staticModifier = _.find(classMember.modifiers, function(modifier) { - return modifier.kind == ts.SyntaxKind.StaticKeyword; - }); - return staticModifier !== undefined; -} -exports.hasStaticModifier = hasStaticModifier; -/** - * Is class member a React "propTypes" member? - * @param classMember - * @param sourceFile - */ -function isPropTypesMember(classMember, sourceFile) { - try { - var name_1 = - classMember.name !== undefined && ts.isIdentifier(classMember.name) ? classMember.name.escapedText : null; - return name_1 === 'propTypes'; - } catch (e) { - return false; - } -} -exports.isPropTypesMember = isPropTypesMember; -/** - * Get component name off of a propType assignment statement - * @param propTypeAssignment - * @param sourceFile - */ -function getComponentName(propTypeAssignment, sourceFile) { - var text = propTypeAssignment.getText(sourceFile); - return text.substr(0, text.indexOf('.')); -} -exports.getComponentName = getComponentName; -/** - * Convert react stateless function to arrow function - * @example - * Before: - * function Hello(message) { - * return
{message}
- * } - * - * After: - * const Hello = message => { - * return
{message}
- * } - */ -function convertReactStatelessFunctionToArrowFunction(statelessFunc) { - if (ts.isVariableStatement(statelessFunc)) return statelessFunc; - var funcName = statelessFunc.name || 'Component'; - var funcBody = statelessFunc.body || ts.createBlock([]); - var initializer = ts.createArrowFunction( - undefined, - undefined, - statelessFunc.parameters, - undefined, - undefined, - funcBody, - ); - return ts.createVariableStatement( - statelessFunc.modifiers, - ts.createVariableDeclarationList( - [ts.createVariableDeclaration(funcName, undefined, initializer)], - ts.NodeFlags.Const, - ), - ); -} -exports.convertReactStatelessFunctionToArrowFunction = convertReactStatelessFunctionToArrowFunction; -/** - * Insert an item in middle of an array after a specific item - * @param collection - * @param afterItem - * @param newItem - */ -function insertAfter(collection, afterItem, newItem) { - var index = _.indexOf(collection, afterItem) + 1; - return _.slice(collection, 0, index) - .concat(newItem) - .concat(_.slice(collection, index)); -} -exports.insertAfter = insertAfter; -/** - * Insert an item in middle of an array before a specific item - * @param collection - * @param beforeItem - * @param newItem - */ -function insertBefore(collection, beforeItem, newItems) { - var index = _.indexOf(collection, beforeItem); - return _.slice(collection, 0, index) - .concat(newItems) - .concat(_.slice(collection, index)); -} -exports.insertBefore = insertBefore; -/** - * Replace an item in a collection with another item - * @param collection - * @param item - * @param newItem - */ -function replaceItem(collection, item, newItem) { - var index = _.indexOf(collection, item); - return _.slice(collection, 0, index) - .concat(newItem) - .concat(_.slice(collection, index + 1)); -} -exports.replaceItem = replaceItem; -/** - * Remove an item from a collection - * @param collection - * @param item - * @param newItem - */ -function removeItem(collection, item) { - var index = _.indexOf(collection, item); - return _.slice(collection, 0, index).concat(_.slice(collection, index + 1)); -} -exports.removeItem = removeItem; diff --git a/d/index.js b/d/index.js deleted file mode 100644 index 45c3672..0000000 --- a/d/index.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var compiler_1 = require('./compiler'); -exports.compile = compiler_1.compile; -var react_js_make_props_and_state_transform_1 = require('./transforms/react-js-make-props-and-state-transform'); -exports.reactJSMakePropsAndStateInterfaceTransformFactoryFactory = - react_js_make_props_and_state_transform_1.reactJSMakePropsAndStateInterfaceTransformFactoryFactory; -var react_remove_prop_types_assignment_transform_1 = require('./transforms/react-remove-prop-types-assignment-transform'); -exports.reactRemovePropTypesAssignmentTransformFactoryFactory = - react_remove_prop_types_assignment_transform_1.reactRemovePropTypesAssignmentTransformFactoryFactory; -var react_move_prop_types_to_class_transform_1 = require('./transforms/react-move-prop-types-to-class-transform'); -exports.reactMovePropTypesToClassTransformFactoryFactory = - react_move_prop_types_to_class_transform_1.reactMovePropTypesToClassTransformFactoryFactory; -var collapse_intersection_interfaces_transform_1 = require('./transforms/collapse-intersection-interfaces-transform'); -exports.collapseIntersectionInterfacesTransformFactoryFactory = - collapse_intersection_interfaces_transform_1.collapseIntersectionInterfacesTransformFactoryFactory; -var react_remove_static_prop_types_member_transform_1 = require('./transforms/react-remove-static-prop-types-member-transform'); -exports.reactRemoveStaticPropTypesMemberTransformFactoryFactory = - react_remove_static_prop_types_member_transform_1.reactRemoveStaticPropTypesMemberTransformFactoryFactory; -var react_stateless_function_make_props_transform_1 = require('./transforms/react-stateless-function-make-props-transform'); -exports.reactStatelessFunctionMakePropsTransformFactoryFactory = - react_stateless_function_make_props_transform_1.reactStatelessFunctionMakePropsTransformFactoryFactory; -var react_remove_prop_types_import_1 = require('./transforms/react-remove-prop-types-import'); -exports.reactRemovePropTypesImportTransformFactoryFactory = - react_remove_prop_types_import_1.reactRemovePropTypesImportTransformFactoryFactory; -exports.allTransforms = [ - react_move_prop_types_to_class_transform_1.reactMovePropTypesToClassTransformFactoryFactory, - react_js_make_props_and_state_transform_1.reactJSMakePropsAndStateInterfaceTransformFactoryFactory, - react_stateless_function_make_props_transform_1.reactStatelessFunctionMakePropsTransformFactoryFactory, - collapse_intersection_interfaces_transform_1.collapseIntersectionInterfacesTransformFactoryFactory, - react_remove_prop_types_assignment_transform_1.reactRemovePropTypesAssignmentTransformFactoryFactory, - react_remove_static_prop_types_member_transform_1.reactRemoveStaticPropTypesMemberTransformFactoryFactory, - react_remove_prop_types_import_1.reactRemovePropTypesImportTransformFactoryFactory, -]; -/** - * Run React JavaScript to TypeScript transform for file at `filePath` - * @param filePath - */ -function run(filePath, prettierOptions, compilationOptions) { - if (prettierOptions === void 0) { - prettierOptions = {}; - } - if (compilationOptions === void 0) { - compilationOptions = compiler_1.DEFAULT_COMPILATION_OPTIONS; - } - return compiler_1.compile(filePath, exports.allTransforms, prettierOptions, compilationOptions); -} -exports.run = run; diff --git a/d/transforms/collapse-intersection-interfaces-transform.js b/d/transforms/collapse-intersection-interfaces-transform.js deleted file mode 100644 index 90e8df4..0000000 --- a/d/transforms/collapse-intersection-interfaces-transform.js +++ /dev/null @@ -1,187 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -var __read = - (this && this.__read) || - function(o, n) { - var m = typeof Symbol === 'function' && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), - r, - ar = [], - e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } catch (error) { - e = { error: error }; - } finally { - try { - if (r && !r.done && (m = i['return'])) m.call(i); - } finally { - if (e) throw e.error; - } - } - return ar; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -/** - * Collapse unnecessary intersections between type literals - * - * @example - * Before: - * type Foo = {foo: string;} & {bar: number;} - * - * After - * type Foo = {foo: string; bar: number;} - */ -function collapseIntersectionInterfacesTransformFactoryFactory(typeChecker) { - return function collapseIntersectionInterfacesTransformFactory(context) { - return function collapseIntersectionInterfacesTransform(sourceFile) { - var visited = ts.visitEachChild(sourceFile, visitor, context); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - function visitor(node) { - if (ts.isTypeAliasDeclaration(node)) { - return visitTypeAliasDeclaration(node); - } - return node; - } - function visitTypeAliasDeclaration(node) { - if (ts.isIntersectionTypeNode(node.type)) { - return ts.createTypeAliasDeclaration( - [], - [], - node.name.text, - [], - visitIntersectionTypeNode(node.type), - ); - } - return node; - } - function visitIntersectionTypeNode(node) { - var e_1, _a; - // Only intersection of type literals can be colapsed. - // We are currently ignoring intersections such as `{foo: string} & {bar: string} & TypeRef` - // TODO: handle mix of type references and multiple literal types - if ( - !node.types.every(function(typeNode) { - return ts.isTypeLiteralNode(typeNode); - }) - ) { - return node; - } - // We need cast `node.type.types` to `ts.NodeArray` - // because TypeScript can't figure out `node.type.types.every(ts.isTypeLiteralNode)` - var types = node.types; - // Build a map of member names to all of types found in intersectioning type literals - // For instance {foo: string, bar: number} & { foo: number } will result in a map like this: - // Map { - // 'foo' => Set { 'string', 'number' }, - // 'bar' => Set { 'number' } - // } - var membersMap = new Map(); - // A sepecial member of type literal nodes is index signitures which don't have a name - // We use this symbol to track it in our members map - var INDEX_SIGNITUTRE_MEMBER = Symbol('Index signiture member'); - // Keep a reference of first index signiture member parameters. (ignore rest) - var indexMemberParameter = null; - // Iterate through all of type literal nodes members and add them to the members map - types.forEach(function(typeNode) { - typeNode.members.forEach(function(member) { - if (ts.isIndexSignatureDeclaration(member)) { - if (member.type !== undefined) { - if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) { - membersMap.get(INDEX_SIGNITUTRE_MEMBER).add(member.type); - } else { - indexMemberParameter = member.parameters; - membersMap.set(INDEX_SIGNITUTRE_MEMBER, new Set([member.type])); - } - } - } else if (ts.isPropertySignature(member)) { - if (member.type !== undefined) { - var memberName = member.name.getText(sourceFile); - // For unknown reasons, member.name.getText() is returning nothing in some cases - // This is probably because previous transformers did something with the AST that - // index of text string of member identifier is lost - // TODO: investigate - if (!memberName) { - memberName = member.name.escapedText; - } - if (membersMap.has(memberName)) { - membersMap.get(memberName).add(member.type); - } else { - membersMap.set(memberName, new Set([member.type])); - } - } - } - }); - }); - // Result type literal members list - var finalMembers = []; - try { - // Put together the map into a type literal that has member per each map entery and type of that - // member is a union of all types in vlues for that member name in members map - // if a member has only one type, create a simple type literal for it - for (var _b = __values(membersMap.entries()), _c = _b.next(); !_c.done; _c = _b.next()) { - var _d = __read(_c.value, 2), - name_1 = _d[0], - types_1 = _d[1]; - if (typeof name_1 === 'symbol') { - continue; - } - // if for this name there is only one type found use the first type, otherwise make a union of all types - var resultType = - types_1.size === 1 ? Array.from(types_1)[0] : createUnionType(Array.from(types_1)); - finalMembers.push(ts.createPropertySignature([], name_1, undefined, resultType, undefined)); - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_1) throw e_1.error; - } - } - // Handle index signiture member - if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) { - var indexTypes = Array.from(membersMap.get(INDEX_SIGNITUTRE_MEMBER)); - var indexType = indexTypes[0]; - if (indexTypes.length > 1) { - indexType = createUnionType(indexTypes); - } - var indexSigniture = ts.createIndexSignature([], [], indexMemberParameter, indexType); - finalMembers.push(indexSigniture); - } - // Generate one single type literal node - return ts.createTypeLiteralNode(finalMembers); - } - /** - * Create a union type from multiple type nodes - * @param types - */ - function createUnionType(types) { - // first dedupe literal types - // TODO: this only works if all types are primitive types like string or number - var uniqueTypes = _.uniqBy(types, function(type) { - return type.kind; - }); - return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.UnionType, uniqueTypes); - } - }; - }; -} -exports.collapseIntersectionInterfacesTransformFactoryFactory = collapseIntersectionInterfacesTransformFactoryFactory; diff --git a/d/transforms/react-js-make-props-and-state-transform.js b/d/transforms/react-js-make-props-and-state-transform.js deleted file mode 100644 index 5d6d935..0000000 --- a/d/transforms/react-js-make-props-and-state-transform.js +++ /dev/null @@ -1,258 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -var helpers = require('../helpers'); -/** - * Get transform for transforming React code originally written in JS which does not have - * props and state generic types - * This transform will remove React component static "propTypes" member during transform - */ -function reactJSMakePropsAndStateInterfaceTransformFactoryFactory(typeChecker) { - return function reactJSMakePropsAndStateInterfaceTransformFactory(context) { - return function reactJSMakePropsAndStateInterfaceTransform(sourceFile) { - var visited = visitSourceFile(sourceFile, typeChecker); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactJSMakePropsAndStateInterfaceTransformFactoryFactory = reactJSMakePropsAndStateInterfaceTransformFactoryFactory; -function visitSourceFile(sourceFile, typeChecker) { - var e_1, _a; - var newSourceFile = sourceFile; - try { - for (var _b = __values(sourceFile.statements), _c = _b.next(); !_c.done; _c = _b.next()) { - var statement = _c.value; - if (ts.isClassDeclaration(statement) && helpers.isReactComponent(statement, typeChecker)) { - newSourceFile = visitReactClassDeclaration(statement, newSourceFile, typeChecker); - } - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_1) throw e_1.error; - } - } - return newSourceFile; -} -function visitReactClassDeclaration(classDeclaration, sourceFile, typeChecker) { - if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { - return sourceFile; - } - var className = classDeclaration && classDeclaration.name && classDeclaration.name.getText(sourceFile); - var propType = getPropsTypeOfReactComponentClass(classDeclaration, sourceFile); - var stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); - var shouldMakePropTypeDeclaration = propType.members.length > 0; - var shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); - var propTypeName = className + 'Props'; - var stateTypeName = className + 'State'; - var propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); - var stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType); - var propTypeRef = ts.createTypeReferenceNode(propTypeName, []); - var stateTypeRef = ts.createTypeReferenceNode(stateTypeName, []); - var newClassDeclaration = getNewReactClassDeclaration( - classDeclaration, - shouldMakePropTypeDeclaration ? propTypeRef : propType, - shouldMakeStateTypeDeclaration ? stateTypeRef : stateType, - ); - var allTypeDeclarations = []; - if (shouldMakePropTypeDeclaration) allTypeDeclarations.push(propTypeDeclaration); - if (shouldMakeStateTypeDeclaration) allTypeDeclarations.push(stateTypeDeclaration); - var statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); - statements = helpers.replaceItem(statements, classDeclaration, newClassDeclaration); - return ts.updateSourceFileNode(sourceFile, statements); -} -function getNewReactClassDeclaration(classDeclaration, propTypeRef, stateTypeRef) { - if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { - return classDeclaration; - } - var firstHeritageClause = classDeclaration.heritageClauses[0]; - var newFirstHeritageClauseTypes = helpers.replaceItem( - firstHeritageClause.types, - firstHeritageClause.types[0], - ts.updateExpressionWithTypeArguments( - firstHeritageClause.types[0], - [propTypeRef, stateTypeRef], - firstHeritageClause.types[0].expression, - ), - ); - var newHeritageClauses = helpers.replaceItem( - classDeclaration.heritageClauses, - firstHeritageClause, - ts.updateHeritageClause(firstHeritageClause, newFirstHeritageClauseTypes), - ); - return ts.updateClassDeclaration( - classDeclaration, - classDeclaration.decorators, - classDeclaration.modifiers, - classDeclaration.name, - classDeclaration.typeParameters, - newHeritageClauses, - classDeclaration.members, - ); -} -function getPropsTypeOfReactComponentClass(classDeclaration, sourceFile) { - var staticPropTypesMember = _.find(classDeclaration.members, function(member) { - return ( - ts.isPropertyDeclaration(member) && - helpers.hasStaticModifier(member) && - helpers.isPropTypesMember(member, sourceFile) - ); - }); - if ( - staticPropTypesMember !== undefined && - ts.isPropertyDeclaration(staticPropTypesMember) && // check to satisfy type checker - staticPropTypesMember.initializer && - ts.isObjectLiteralExpression(staticPropTypesMember.initializer) - ) { - return helpers.buildInterfaceFromPropTypeObjectLiteral(staticPropTypesMember.initializer); - } - var staticPropTypesGetterMember = _.find(classDeclaration.members, function(member) { - return ( - ts.isGetAccessorDeclaration(member) && - helpers.hasStaticModifier(member) && - helpers.isPropTypesMember(member, sourceFile) - ); - }); - if ( - staticPropTypesGetterMember !== undefined && - ts.isGetAccessorDeclaration(staticPropTypesGetterMember) // check to satisfy typechecker - ) { - var returnStatement = _.find(staticPropTypesGetterMember.body.statements, function(statement) { - return ts.isReturnStatement(statement); - }); - if ( - returnStatement !== undefined && - ts.isReturnStatement(returnStatement) && // check to satisfy typechecker - returnStatement.expression && - ts.isObjectLiteralExpression(returnStatement.expression) - ) { - return helpers.buildInterfaceFromPropTypeObjectLiteral(returnStatement.expression); - } - } - return ts.createTypeLiteralNode([]); -} -function getStateTypeOfReactComponentClass(classDeclaration, typeChecker) { - var initialState = getInitialStateFromClassDeclaration(classDeclaration, typeChecker); - var initialStateIsVoid = initialState.kind === ts.SyntaxKind.VoidKeyword; - var collectedStateTypes = getStateLookingForSetStateCalls(classDeclaration, typeChecker); - if (!collectedStateTypes.length && initialStateIsVoid) { - return ts.createTypeLiteralNode([]); - } - if (!initialStateIsVoid) { - collectedStateTypes.push(initialState); - } - return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.IntersectionType, collectedStateTypes); -} -/** - * Get initial state of a React component looking for state value initially set - * @param classDeclaration - * @param typeChecker - */ -function getInitialStateFromClassDeclaration(classDeclaration, typeChecker) { - // initial state class member - var e_2, _a; - var initialStateMember = _.find(classDeclaration.members, function(member) { - try { - return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'state'; - } catch (e) { - return false; - } - }); - if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { - var type = typeChecker.getTypeAtLocation(initialStateMember.initializer); - return typeChecker.typeToTypeNode(type); - } - // Initial state in constructor - var constructor = _.find(classDeclaration.members, function(member) { - return member.kind === ts.SyntaxKind.Constructor; - }); - if (constructor && constructor.body) { - try { - for (var _b = __values(constructor.body.statements), _c = _b.next(); !_c.done; _c = _b.next()) { - var statement = _c.value; - if ( - ts.isExpressionStatement(statement) && - ts.isBinaryExpression(statement.expression) && - statement.expression.left.getText() === 'this.state' - ) { - return typeChecker.typeToTypeNode(typeChecker.getTypeAtLocation(statement.expression.right)); - } - } - } catch (e_2_1) { - e_2 = { error: e_2_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_2) throw e_2.error; - } - } - } - // No initial state, fall back to void - return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); -} -/** - * Look for setState() function calls to collect the state interface in a React class component - * @param classDeclaration - * @param typeChecker - */ -function getStateLookingForSetStateCalls(classDeclaration, typeChecker) { - var e_3, _a; - var typeNodes = []; - try { - for (var _b = __values(classDeclaration.members), _c = _b.next(); !_c.done; _c = _b.next()) { - var member = _c.value; - if (member && ts.isMethodDeclaration(member) && member.body) { - lookForSetState(member.body); - } - } - } catch (e_3_1) { - e_3 = { error: e_3_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_3) throw e_3.error; - } - } - return typeNodes; - function lookForSetState(node) { - ts.forEachChild(node, lookForSetState); - if ( - ts.isExpressionStatement(node) && - ts.isCallExpression(node.expression) && - node.expression.expression.getText().match(/setState/) - ) { - var type = typeChecker.getTypeAtLocation(node.expression.arguments[0]); - typeNodes.push(typeChecker.typeToTypeNode(type)); - } - } -} -function isStateTypeMemberEmpty(stateType) { - // Only need to handle TypeLiteralNode & IntersectionTypeNode - if (ts.isTypeLiteralNode(stateType)) { - return stateType.members.length === 0; - } - if (!ts.isIntersectionTypeNode(stateType)) { - return true; - } - return stateType.types.every(isStateTypeMemberEmpty); -} diff --git a/d/transforms/react-move-prop-types-to-class-transform.js b/d/transforms/react-move-prop-types-to-class-transform.js deleted file mode 100644 index 9a88384..0000000 --- a/d/transforms/react-move-prop-types-to-class-transform.js +++ /dev/null @@ -1,154 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -var __read = - (this && this.__read) || - function(o, n) { - var m = typeof Symbol === 'function' && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), - r, - ar = [], - e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } catch (error) { - e = { error: error }; - } finally { - try { - if (r && !r.done && (m = i['return'])) m.call(i); - } finally { - if (e) throw e.error; - } - } - return ar; - }; -var __spread = - (this && this.__spread) || - function() { - for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); - return ar; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -var helpers = require('../helpers'); -/** - * Move Component.propTypes statements into class as a static member of the class - * if React component is defined using a class - * - * Note: This transform assumes React component declaration and propTypes assignment statement - * are both on root of the source file - * - * @example - * Before: - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - * SomeComponent.propTypes = { foo: React.PropTypes.string } - * - * After - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> { - * static propTypes = { foo: React.PropTypes.string } - * } - * - * @todo - * This is not supporting multiple statements for a single class yet - * ``` - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - * SomeComponent.propTypes = { foo: React.PropTypes.string } - * SomeComponent.propTypes.bar = React.PropTypes.number; - * ``` - */ -function reactMovePropTypesToClassTransformFactoryFactory(typeChecker) { - return function reactMovePropTypesToClassTransformFactory(context) { - return function reactMovePropTypesToClassTransform(sourceFile) { - var visited = visitSourceFile(sourceFile, typeChecker); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactMovePropTypesToClassTransformFactoryFactory = reactMovePropTypesToClassTransformFactoryFactory; -/** - * Make the move from propType statement to static member - * @param sourceFile - * @param typeChecker - */ -function visitSourceFile(sourceFile, typeChecker) { - var e_1, _a; - var statements = sourceFile.statements; - // Look for propType assignment statements - var propTypeAssignments = statements.filter(function(statement) { - return helpers.isReactPropTypeAssignmentStatement(statement); - }); - var _loop_1 = function(propTypeAssignment) { - // Look for the class declarations with the same name - var componentName = helpers.getComponentName(propTypeAssignment, sourceFile); - var classStatement = _.find(statements, function(statement) { - return ( - ts.isClassDeclaration(statement) && - statement.name !== undefined && - statement.name.getText(sourceFile) === componentName - ); - }); // Type weirdness - // && helpers.isBinaryExpression(propTypeAssignment.expression) is redundant to satisfy the type checker - if (classStatement && ts.isBinaryExpression(propTypeAssignment.expression)) { - var newClassStatement = addStaticMemberToClass( - classStatement, - 'propTypes', - propTypeAssignment.expression.right, - ); - statements = ts.createNodeArray(helpers.replaceItem(statements, classStatement, newClassStatement)); - } - }; - try { - for ( - var propTypeAssignments_1 = __values(propTypeAssignments), - propTypeAssignments_1_1 = propTypeAssignments_1.next(); - !propTypeAssignments_1_1.done; - propTypeAssignments_1_1 = propTypeAssignments_1.next() - ) { - var propTypeAssignment = propTypeAssignments_1_1.value; - _loop_1(propTypeAssignment); - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (propTypeAssignments_1_1 && !propTypeAssignments_1_1.done && (_a = propTypeAssignments_1.return)) - _a.call(propTypeAssignments_1); - } finally { - if (e_1) throw e_1.error; - } - } - return ts.updateSourceFileNode(sourceFile, statements); -} -/** - * Insert a new static member into a class - * @param classDeclaration - * @param name - * @param value - */ -function addStaticMemberToClass(classDeclaration, name, value) { - var staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - var propertyDeclaration = ts.createProperty([], [staticModifier], name, undefined, undefined, value); - return ts.updateClassDeclaration( - classDeclaration, - classDeclaration.decorators, - classDeclaration.modifiers, - classDeclaration.name, - classDeclaration.typeParameters, - ts.createNodeArray(classDeclaration.heritageClauses), - ts.createNodeArray(__spread([propertyDeclaration], classDeclaration.members)), - ); -} diff --git a/d/transforms/react-remove-prop-types-assignment-transform.js b/d/transforms/react-remove-prop-types-assignment-transform.js deleted file mode 100644 index b56e158..0000000 --- a/d/transforms/react-remove-prop-types-assignment-transform.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var helpers = require('../helpers'); -/** - * Remove Component.propTypes statements - * - * @example - * Before: - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - * SomeComponent.propTypes = { foo: React.PropTypes.string } - * - * After - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - */ -function reactRemovePropTypesAssignmentTransformFactoryFactory(typeChecker) { - return function reactRemovePropTypesAssignmentTransformFactory(context) { - return function reactRemovePropTypesAssignmentTransform(sourceFile) { - var visited = ts.updateSourceFileNode( - sourceFile, - sourceFile.statements.filter(function(s) { - return !helpers.isReactPropTypeAssignmentStatement(s); - }), - ); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactRemovePropTypesAssignmentTransformFactoryFactory = reactRemovePropTypesAssignmentTransformFactoryFactory; diff --git a/d/transforms/react-remove-prop-types-import.js b/d/transforms/react-remove-prop-types-import.js deleted file mode 100644 index 5b3a9d2..0000000 --- a/d/transforms/react-remove-prop-types-import.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -/** - * Remove `import PropTypes from 'prop-types'` or - * `import { PropTypes } from 'react'` - * - * @example - * Before: - * import PropTypes from 'prop-types' - * import React, { PropTypes } from 'react' - * - * After: - * import React from 'react' - */ -function reactRemovePropTypesImportTransformFactoryFactory(typeChecker) { - return function reactRemovePropTypesImportTransformFactory(context) { - return function reactRemovePropTypesImportTransform(sourceFile) { - var visited = ts.updateSourceFileNode( - sourceFile, - sourceFile.statements - .filter(function(s) { - return !( - ts.isImportDeclaration(s) && - ts.isStringLiteral(s.moduleSpecifier) && - s.moduleSpecifier.text === 'prop-types' - ); - }) - .map(updateReactImportIfNeeded), - ); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactRemovePropTypesImportTransformFactoryFactory = reactRemovePropTypesImportTransformFactoryFactory; -function updateReactImportIfNeeded(statement) { - if ( - !ts.isImportDeclaration(statement) || - !ts.isStringLiteral(statement.moduleSpecifier) || - statement.moduleSpecifier.text !== 'react' || - !statement.importClause || - !statement.importClause.namedBindings || - !ts.isNamedImports(statement.importClause.namedBindings) - ) { - return statement; - } - var namedBindings = statement.importClause.namedBindings; - var newNamedBindingElements = namedBindings.elements.filter(function(elm) { - return elm.name.text !== 'PropTypes'; - }); - if (newNamedBindingElements.length === namedBindings.elements.length) { - // Means it has no 'PropTypes' named import - return statement; - } - var newImportClause = ts.updateImportClause( - statement.importClause, - statement.importClause.name, - newNamedBindingElements.length === 0 - ? undefined - : ts.updateNamedImports(namedBindings, newNamedBindingElements), - ); - return ts.updateImportDeclaration( - statement, - statement.decorators, - statement.modifiers, - newImportClause, - statement.moduleSpecifier, - ); -} diff --git a/d/transforms/react-remove-static-prop-types-member-transform.js b/d/transforms/react-remove-static-prop-types-member-transform.js deleted file mode 100644 index 064c63a..0000000 --- a/d/transforms/react-remove-static-prop-types-member-transform.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var helpers = require('../helpers'); -/** - * Remove static propTypes - * - * @example - * Before: - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> { - * static propTypes = { - * foo: React.PropTypes.number.isRequired, - * } - * } - * - * After: - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - */ -function reactRemoveStaticPropTypesMemberTransformFactoryFactory(typeChecker) { - return function reactRemoveStaticPropTypesMemberTransformFactory(context) { - return function reactRemoveStaticPropTypesMemberTransform(sourceFile) { - var visited = ts.visitEachChild(sourceFile, visitor, context); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - function visitor(node) { - if (ts.isClassDeclaration(node) && helpers.isReactComponent(node, typeChecker)) { - return ts.updateClassDeclaration( - node, - node.decorators, - node.modifiers, - node.name, - node.typeParameters, - ts.createNodeArray(node.heritageClauses), - node.members.filter(function(member) { - if ( - ts.isPropertyDeclaration(member) && - helpers.hasStaticModifier(member) && - helpers.isPropTypesMember(member, sourceFile) - ) { - return false; - } - // propTypes getter - if ( - ts.isGetAccessorDeclaration(member) && - helpers.hasStaticModifier(member) && - helpers.isPropTypesMember(member, sourceFile) - ) { - return false; - } - return true; - }), - ); - } - return node; - } - }; - }; -} -exports.reactRemoveStaticPropTypesMemberTransformFactoryFactory = reactRemoveStaticPropTypesMemberTransformFactoryFactory; diff --git a/d/transforms/react-stateless-function-make-props-transform.js b/d/transforms/react-stateless-function-make-props-transform.js deleted file mode 100644 index f3055e5..0000000 --- a/d/transforms/react-stateless-function-make-props-transform.js +++ /dev/null @@ -1,133 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -var helpers = require('../helpers'); -/** - * Transform react stateless components - * - * @example - * Before: - * const Hello = ({ message }) => { - * return
hello {message}
- * } - * // Or: - * // const Hello = ({ message }) =>
hello {message}
- * - * Hello.propTypes = { - * message: React.PropTypes.string, - * } - * - * After: - * Type HelloProps = { - * message: string; - * } - * - * const Hello: React.SFC = ({ message }) => { - * return
hello {message}
- * } - * - * Hello.propTypes = { - * message: React.PropTypes.string, - * } - */ -function reactStatelessFunctionMakePropsTransformFactoryFactory(typeChecker) { - return function reactStatelessFunctionMakePropsTransformFactory(context) { - return function reactStatelessFunctionMakePropsTransform(sourceFile) { - var visited = visitSourceFile(sourceFile, typeChecker); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactStatelessFunctionMakePropsTransformFactoryFactory = reactStatelessFunctionMakePropsTransformFactoryFactory; -function visitSourceFile(sourceFile, typeChecker) { - var e_1, _a; - // Look for propType assignment statements - var propTypeAssignments = sourceFile.statements.filter(function(statement) { - return helpers.isReactPropTypeAssignmentStatement(statement); - }); - var newSourceFile = sourceFile; - var _loop_1 = function(propTypeAssignment) { - var componentName = helpers.getComponentName(propTypeAssignment, newSourceFile); - var funcComponent = _.find(newSourceFile.statements, function(s) { - return ( - (ts.isFunctionDeclaration(s) && s.name !== undefined && s.name.getText() === componentName) || - (ts.isVariableStatement(s) && s.declarationList.declarations[0].name.getText() === componentName) - ); - }); // Type weirdness - if (funcComponent) { - newSourceFile = visitReactStatelessComponent(funcComponent, propTypeAssignment, newSourceFile); - } - }; - try { - for ( - var propTypeAssignments_1 = __values(propTypeAssignments), - propTypeAssignments_1_1 = propTypeAssignments_1.next(); - !propTypeAssignments_1_1.done; - propTypeAssignments_1_1 = propTypeAssignments_1.next() - ) { - var propTypeAssignment = propTypeAssignments_1_1.value; - _loop_1(propTypeAssignment); - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (propTypeAssignments_1_1 && !propTypeAssignments_1_1.done && (_a = propTypeAssignments_1.return)) - _a.call(propTypeAssignments_1); - } finally { - if (e_1) throw e_1.error; - } - } - return newSourceFile; -} -function visitReactStatelessComponent(component, propTypesExpressionStatement, sourceFile) { - var arrowFuncComponent = helpers.convertReactStatelessFunctionToArrowFunction(component); - var componentName = arrowFuncComponent.declarationList.declarations[0].name.getText(); - var componentInitializer = arrowFuncComponent.declarationList.declarations[0].initializer; - var propType = getPropTypesFromTypeAssignment(propTypesExpressionStatement); - var shouldMakePropTypeDeclaration = propType.members.length > 0; - var propTypeName = componentName + 'Props'; - var propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); - var propTypeRef = ts.createTypeReferenceNode(propTypeName, []); - var componentType = ts.createTypeReferenceNode(ts.createQualifiedName(ts.createIdentifier('React'), 'SFC'), [ - shouldMakePropTypeDeclaration ? propTypeRef : propType, - ]); - // replace component with ts stateless component - var typedComponent = ts.createVariableStatement( - arrowFuncComponent.modifiers, - ts.createVariableDeclarationList( - [ts.createVariableDeclaration(componentName, componentType, componentInitializer)], - arrowFuncComponent.declarationList.flags, - ), - ); - var statements = shouldMakePropTypeDeclaration - ? helpers.insertBefore(sourceFile.statements, component, [propTypeDeclaration]) - : sourceFile.statements; - statements = helpers.replaceItem(statements, component, typedComponent); - return ts.updateSourceFileNode(sourceFile, statements); -} -function getPropTypesFromTypeAssignment(propTypesExpressionStatement) { - if ( - propTypesExpressionStatement !== undefined && - ts.isBinaryExpression(propTypesExpressionStatement.expression) && - ts.isObjectLiteralExpression(propTypesExpressionStatement.expression.right) - ) { - return helpers.buildInterfaceFromPropTypeObjectLiteral(propTypesExpressionStatement.expression.right); - } - return ts.createTypeLiteralNode([]); -} From 83ca67d79b8311022d0223d4495fd61676b8fc21 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Thu, 11 Jul 2019 14:54:42 +0800 Subject: [PATCH 04/26] sp --- src/P.js | 37 +++++++++++++++++++++++++++++++++++-- tsconfig.json | 7 ++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/P.js b/src/P.js index 072f11b..c515572 100644 --- a/src/P.js +++ b/src/P.js @@ -1,5 +1,38 @@ -class Panel extends React.Component { +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Panel as RawPanel } from 'react-bootstrap'; +import TruncText from '../TruncText/TruncText'; + +export default class Panel extends Component { static propTypes = { - multi: PropTypes.string.isRequired, + bsClass: PropTypes.string, + activeKey: PropTypes.any, + eventKey: PropTypes.string.isRequired, + header: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired, + id: PropTypes.string, + onSelect: PropTypes.func, + children: PropTypes.any, }; + + constructor(props) { + super(props); + this.childrenContent = []; + } + + render() { + const { activeKey, children, header, eventKey, bsClass, id } = this.props; + if (activeKey && activeKey == eventKey) this.childrenContent = children; + + return ( + + + + {header} + + {/* {header} */} + + {this.childrenContent} + + ); + } } diff --git a/tsconfig.json b/tsconfig.json index f4d1f51..719988b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,10 +8,11 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "downlevelIteration": true, - "sourceMap": false, - "outDir": "d", + "sourceMap": true, + "outDir": "dist", "rootDir": "./src", - "lib": ["dom", "es2015"] + "lib": ["dom", "es2015"], + "jsx": "react" }, "exclude": ["node_modules", "test", "dist"], "types": ["node", "jest"] From 2ef516bb6b806d3efad26621cb73bbf62c34e144 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Thu, 11 Jul 2019 15:15:55 +0800 Subject: [PATCH 05/26] p --- .gitignore | 1 - .vscode/launch.json | 9 +++++++++ .vscode/tasks.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6921174..98bd05f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,4 @@ dist .DS_Store coverage/ *.log -d diff --git a/.vscode/launch.json b/.vscode/launch.json index cdeb78c..ff8b896 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,6 +1,15 @@ { "version": "0.2.0", "configurations": [ + { + "type": "node", + "request": "launch", + "name": "ts", + "program": "${workspaceFolder}/src/cli.ts", + "args": ["${workspaceFolder}/P.js", "--keep-original-files"], + "preLaunchTask": "tsc", + "outFiles": ["${workspaceFolder}/dist/**/*.js"] + }, { "type": "node", "request": "launch", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 319e8a4..df502dc 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,7 +4,7 @@ "version": "0.1.0", "command": "tsc", "isShellCommand": true, - "args": ["-p", "."], + "args": ["--pretty"], "showOutput": "silent", "problemMatcher": "$tsc" } From 49632ac55da288aae5e3ccc3d15d7f8b5a883ca1 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Thu, 11 Jul 2019 15:21:02 +0800 Subject: [PATCH 06/26] sp --- d/P.tsx | 4 - d/cli.js | 130 --------- d/compiler.js | 156 ----------- d/helpers/build-prop-type-interface.js | 190 ------------- d/helpers/index.js | 197 ------------- d/index.js | 48 ---- ...lapse-intersection-interfaces-transform.js | 187 ------------- ...react-js-make-props-and-state-transform.js | 258 ------------------ ...eact-move-prop-types-to-class-transform.js | 154 ----------- ...-remove-prop-types-assignment-transform.js | 30 -- .../react-remove-prop-types-import.js | 70 ----- ...move-static-prop-types-member-transform.js | 59 ---- ...stateless-function-make-props-transform.js | 133 --------- 13 files changed, 1616 deletions(-) delete mode 100644 d/P.tsx delete mode 100644 d/cli.js delete mode 100644 d/compiler.js delete mode 100644 d/helpers/build-prop-type-interface.js delete mode 100644 d/helpers/index.js delete mode 100644 d/index.js delete mode 100644 d/transforms/collapse-intersection-interfaces-transform.js delete mode 100644 d/transforms/react-js-make-props-and-state-transform.js delete mode 100644 d/transforms/react-move-prop-types-to-class-transform.js delete mode 100644 d/transforms/react-remove-prop-types-assignment-transform.js delete mode 100644 d/transforms/react-remove-prop-types-import.js delete mode 100644 d/transforms/react-remove-static-prop-types-member-transform.js delete mode 100644 d/transforms/react-stateless-function-make-props-transform.js diff --git a/d/P.tsx b/d/P.tsx deleted file mode 100644 index 0ec3330..0000000 --- a/d/P.tsx +++ /dev/null @@ -1,4 +0,0 @@ -type PanelProps = { - multi?: any; -}; -class Panel extends React.Component {} diff --git a/d/cli.js b/d/cli.js deleted file mode 100644 index a3b0b46..0000000 --- a/d/cli.js +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env node -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var program = require('commander'); -var glob = require('glob'); -var fs = require('fs'); -var path = require('path'); -var _1 = require('.'); - -// copy file -const filePath = path.join(__dirname, '../src/P.js'); -const content = fs.readFileSync(filePath, 'utf8'); -const newfile = path.join(__dirname, 'P.js'); -fs.writeFileSync(newfile, content); -// end of copy file - -function resolveGlobs(globPatterns) { - var files = []; - function addFile(file) { - file = path.resolve(file); - if (files.indexOf(file) === -1) { - files.push(file); - } - } - globPatterns.forEach(function(pattern) { - if (/[{}*?+\[\]]/.test(pattern)) { - // Smells like globs - glob.sync(pattern, {}).forEach(function(file) { - addFile(file); - }); - } else { - addFile(pattern); - } - }); - return files; -} -program - .version('1.0.0') - .option('--arrow-parens ', 'Include parentheses around a sole arrow function parameter.', 'avoid') - .option('--no-bracket-spacing', 'Do not print spaces between brackets.', false) - .option('--jsx-bracket-same-line', 'Put > on the last line instead of at a new line.', false) - .option('--print-width ', 'The line length where Prettier will try wrap.', 80) - .option('--prose-wrap How to wrap prose. (markdown)', 'preserve') - .option('--no-semi', 'Do not print semicolons, except at the beginning of lines which may need them', false) - .option('--single-quote', 'Use single quotes instead of double quotes.', false) - .option('--tab-width ', 'Number of spaces per indentation level.', 2) - .option('--trailing-comma ', 'Print trailing commas wherever possible when multi-line.', 'none') - .option('--use-tabs', 'Indent with tabs instead of spaces.', false) - .option('--ignore-prettier-errors', 'Ignore (but warn about) errors in Prettier', false) - .option('--keep-original-files', 'Keep original files', false) - .option('--keep-temporary-files', 'Keep temporary files', false) - .usage('[options] ') - .command('* [glob/filename...]') - .action(function(globPatterns) { - var e_1, _a; - var prettierOptions = { - arrowParens: program.arrowParens, - bracketSpacing: !program.noBracketSpacing, - jsxBracketSameLine: !!program.jsxBracketSameLine, - printWidth: parseInt(program.printWidth, 10), - proseWrap: program.proseWrap, - semi: !program.noSemi, - singleQuote: !!program.singleQuote, - tabWidth: parseInt(program.tabWidth, 10), - trailingComma: program.trailingComma, - useTabs: !!program.useTabs, - }; - var compilationOptions = { - ignorePrettierErrors: !!program.ignorePrettierErrors, - }; - var files = resolveGlobs(globPatterns); - if (!files.length) { - throw new Error('Nothing to do. You must provide file names or glob patterns to transform.'); - } - var errors = false; - try { - for ( - var files_1 = __values(files), files_1_1 = files_1.next(); - !files_1_1.done; - files_1_1 = files_1.next() - ) { - var filePath = files_1_1.value; - console.log('Transforming ' + filePath + '...'); - var newPath = filePath.replace(/\.jsx?$/, '.tsx'); - var temporaryPath = filePath.replace(/\.jsx?$/, '_js2ts_' + +new Date() + '.tsx'); - try { - fs.copyFileSync(filePath, temporaryPath); - var result = _1.run(temporaryPath, prettierOptions, compilationOptions); - fs.writeFileSync(newPath, result); - if (!program.keepOriginalFiles) { - fs.unlinkSync(filePath); - } - } catch (error) { - console.warn('Failed to convert ' + filePath); - console.warn(error); - errors = true; - } - if (!program.keepTemporaryFiles) { - if (fs.existsSync(temporaryPath)) { - fs.unlinkSync(temporaryPath); - } - } - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (files_1_1 && !files_1_1.done && (_a = files_1.return)) _a.call(files_1); - } finally { - if (e_1) throw e_1.error; - } - } - if (errors) { - process.exit(1); - } - }); -program.parse(process.argv); diff --git a/d/compiler.js b/d/compiler.js deleted file mode 100644 index 0170584..0000000 --- a/d/compiler.js +++ /dev/null @@ -1,156 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var os = require('os'); -var fs = require('fs'); -var ts = require('typescript'); -var chalk_1 = require('chalk'); -var _ = require('lodash'); -var prettier = require('prettier'); -var detectIndent = require('detect-indent'); -var DEFAULT_COMPILATION_OPTIONS = { - ignorePrettierErrors: false, -}; -exports.DEFAULT_COMPILATION_OPTIONS = DEFAULT_COMPILATION_OPTIONS; -/** - * Compile and return result TypeScript - * @param filePath Path to file to compile - */ -function compile(filePath, factoryFactories, incomingPrettierOptions, compilationOptions) { - if (incomingPrettierOptions === void 0) { - incomingPrettierOptions = {}; - } - if (compilationOptions === void 0) { - compilationOptions = DEFAULT_COMPILATION_OPTIONS; - } - var e_1, _a; - var compilerOptions = { - target: ts.ScriptTarget.ES2017, - module: ts.ModuleKind.ES2015, - }; - var program = ts.createProgram([filePath], compilerOptions); - // `program.getSourceFiles()` will include those imported files, - // like: `import * as a from './file-a'`. - // We should only transform current file. - var sourceFiles = program.getSourceFiles().filter(function(sf) { - return sf.fileName === filePath; - }); - var typeChecker = program.getTypeChecker(); - var result = ts.transform( - sourceFiles, - factoryFactories.map(function(factoryFactory) { - return factoryFactory(typeChecker); - }, compilerOptions), - ); - if (result.diagnostics && result.diagnostics.length) { - console.log( - chalk_1.default.yellow( - '\n ======================= Diagnostics for ' + filePath + ' =======================\n ', - ), - ); - try { - for (var _b = __values(result.diagnostics), _c = _b.next(); !_c.done; _c = _b.next()) { - var diag = _c.value; - if (diag.file && diag.start) { - var pos = diag.file.getLineAndCharacterOfPosition(diag.start); - console.log('(' + pos.line + ', ' + pos.character + ') ' + diag.messageText); - } - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_1) throw e_1.error; - } - } - } - var printer = ts.createPrinter(); - // TODO: fix the index 0 access... What if program have multiple source files? - var printed = printer.printNode(ts.EmitHint.SourceFile, result.transformed[0], sourceFiles[0]); - var inputSource = fs.readFileSync(filePath, 'utf-8'); - var prettierOptions = getPrettierOptions(filePath, inputSource, incomingPrettierOptions); - try { - return prettier.format(printed, prettierOptions); - } catch (prettierError) { - if (compilationOptions.ignorePrettierErrors) { - console.warn('Prettier failed for ' + filePath + ' (ignorePrettierErrors is on):'); - console.warn(prettierError); - return printed; - } - throw prettierError; - } -} -exports.compile = compile; -/** - * Get Prettier options based on style of a JavaScript - * @param filePath Path to source file - * @param source Body of a JavaScript - * @param options Existing prettier option - */ -function getPrettierOptions(filePath, source, options) { - var resolvedOptions = prettier.resolveConfig.sync(filePath); - if (resolvedOptions) { - _.defaults(resolvedOptions, options); - return resolvedOptions; - } - var _a = detectIndent(source), - indentAmount = _a.amount, - indentType = _a.type; - var sourceWidth = getCodeWidth(source, 80); - var semi = getUseOfSemi(source); - var quotations = getQuotation(source); - _.defaults(Object.assign({}, options), { - tabWidth: indentAmount, - useTabs: indentType && indentType === 'tab', - printWidth: sourceWidth, - semi: semi, - singleQuote: quotations === 'single', - }); - return options; -} -exports.getPrettierOptions = getPrettierOptions; -/** - * Given body of a source file, return its code width - * @param source - */ -function getCodeWidth(source, defaultWidth) { - return source.split(os.EOL).reduce(function(result, line) { - return Math.max(result, line.length); - }, defaultWidth); -} -/** - * Detect if a source file is using semicolon - * @todo: use an actual parser. This is not a proper implementation - * @param source - * @return true if code is using semicolons - */ -function getUseOfSemi(source) { - return source.indexOf(';') !== -1; -} -/** - * Detect if a source file is using single quotes or double quotes - * @todo use an actual parser. This is not a proper implementation - * @param source - */ -function getQuotation(source) { - var numberOfSingleQuotes = (source.match(/\'/g) || []).length; - var numberOfDoubleQuotes = (source.match(/\"/g) || []).length; - if (numberOfSingleQuotes > numberOfDoubleQuotes) { - return 'single'; - } - return 'double'; -} diff --git a/d/helpers/build-prop-type-interface.js b/d/helpers/build-prop-type-interface.js deleted file mode 100644 index 1928455..0000000 --- a/d/helpers/build-prop-type-interface.js +++ /dev/null @@ -1,190 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -/** - * Build props interface from propTypes object - * @example - * { - * foo: React.PropTypes.string.isRequired - * } - * - * becomes - * { - * foo: string; - * } - * @param objectLiteral - */ -function buildInterfaceFromPropTypeObjectLiteral(objectLiteral) { - var members = objectLiteral.properties - // We only need to process PropertyAssignment: - // { - // a: 123 // PropertyAssignment - // } - // - // filter out: - // { - // a() {}, // MethodDeclaration - // b, // ShorthandPropertyAssignment - // ...c, // SpreadAssignment - // get d() {}, // AccessorDeclaration - // } - .filter(ts.isPropertyAssignment) - // Ignore children, React types have it - .filter(function(property) { - return property.name.getText() !== 'children'; - }) - .map(function(propertyAssignment) { - var name = propertyAssignment.name.getText(); - var initializer = propertyAssignment.initializer; - var isRequired = isPropTypeRequired(initializer); - var typeExpression = isRequired - ? // We have guaranteed the type in `isPropTypeRequired()` - initializer.expression - : initializer; - var typeValue = getTypeFromReactPropTypeExpression(typeExpression); - return ts.createPropertySignature( - [], - name, - isRequired ? undefined : ts.createToken(ts.SyntaxKind.QuestionToken), - typeValue, - undefined, - ); - }); - return ts.createTypeLiteralNode(members); -} -exports.buildInterfaceFromPropTypeObjectLiteral = buildInterfaceFromPropTypeObjectLiteral; -/** - * Turns React.PropTypes.* into TypeScript type value - * - * @param node React propTypes value - */ -function getTypeFromReactPropTypeExpression(node) { - var result = null; - if (ts.isPropertyAccessExpression(node)) { - /** - * PropTypes.array, - * PropTypes.bool, - * PropTypes.func, - * PropTypes.number, - * PropTypes.object, - * PropTypes.string, - * PropTypes.symbol, (ignore) - * PropTypes.node, - * PropTypes.element, - * PropTypes.any, - */ - var text = node.getText().replace(/React\.PropTypes\./, ''); - if (/string/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); - } else if (/any/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); - } else if (/array/.test(text)) { - result = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - } else if (/bool/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); - } else if (/number/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); - } else if (/object/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword); - } else if (/node/.test(text)) { - result = ts.createTypeReferenceNode('React.ReactNode', []); - } else if (/element/.test(text)) { - result = ts.createTypeReferenceNode('JSX.Element', []); - } else if (/func/.test(text)) { - var arrayOfAny = ts.createParameter( - [], - [], - ts.createToken(ts.SyntaxKind.DotDotDotToken), - 'args', - undefined, - ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)), - undefined, - ); - result = ts.createFunctionTypeNode([], [arrayOfAny], ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - } - } else if (ts.isCallExpression(node)) { - /** - * PropTypes.instanceOf(), (ignore) - * PropTypes.oneOf(), // only support oneOf([1, 2]), oneOf(['a', 'b']) - * PropTypes.oneOfType(), - * PropTypes.arrayOf(), - * PropTypes.objectOf(), - * PropTypes.shape(), - */ - var text = node.expression.getText(); - if (/oneOf$/.test(text)) { - var argument = node.arguments[0]; - if (ts.isArrayLiteralExpression(argument)) { - if ( - argument.elements.every(function(elm) { - return ts.isStringLiteral(elm) || ts.isNumericLiteral(elm); - }) - ) { - result = ts.createUnionTypeNode( - argument.elements.map(function(elm) { - return ts.createLiteralTypeNode(elm); - }), - ); - } - } - } else if (/oneOfType$/.test(text)) { - var argument = node.arguments[0]; - if (ts.isArrayLiteralExpression(argument)) { - result = ts.createUnionOrIntersectionTypeNode( - ts.SyntaxKind.UnionType, - argument.elements.map(function(elm) { - return getTypeFromReactPropTypeExpression(elm); - }), - ); - } - } else if (/arrayOf$/.test(text)) { - var argument = node.arguments[0]; - if (argument) { - result = ts.createArrayTypeNode(getTypeFromReactPropTypeExpression(argument)); - } - } else if (/objectOf$/.test(text)) { - var argument = node.arguments[0]; - if (argument) { - result = ts.createTypeLiteralNode([ - ts.createIndexSignature( - undefined, - undefined, - [ - ts.createParameter( - undefined, - undefined, - undefined, - 'key', - undefined, - ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), - ), - ], - getTypeFromReactPropTypeExpression(argument), - ), - ]); - } - } else if (/shape$/.test(text)) { - var argument = node.arguments[0]; - if (ts.isObjectLiteralExpression(argument)) { - return buildInterfaceFromPropTypeObjectLiteral(argument); - } - } - } - /** - * customProp, - * anything others - */ - if (result === null) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); - } - return result; -} -/** - * Decide if node is required - * @param node React propTypes member node - */ -function isPropTypeRequired(node) { - if (!ts.isPropertyAccessExpression(node)) return false; - var text = node.getText().replace(/React\.PropTypes\./, ''); - return /\.isRequired/.test(text); -} diff --git a/d/helpers/index.js b/d/helpers/index.js deleted file mode 100644 index 4c2adf9..0000000 --- a/d/helpers/index.js +++ /dev/null @@ -1,197 +0,0 @@ -'use strict'; -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -__export(require('./build-prop-type-interface')); -/** - * If a class declaration a react class? - * @param classDeclaration - * @param typeChecker - */ -function isReactComponent(classDeclaration, typeChecker) { - // Only classes that extend React.Component - if (!classDeclaration.heritageClauses) { - return false; - } - if (classDeclaration.heritageClauses.length !== 1) { - return false; - } - var firstHeritageClauses = classDeclaration.heritageClauses[0]; - if (firstHeritageClauses.token !== ts.SyntaxKind.ExtendsKeyword) { - return false; - } - var expressionWithTypeArguments = firstHeritageClauses.types[0]; - if (!expressionWithTypeArguments) { - return false; - } - // Try type checker and fallback to node text - var type = typeChecker.getTypeAtLocation(expressionWithTypeArguments); - var typeSymbol = type && type.symbol && type.symbol.name; - if (!typeSymbol) { - typeSymbol = expressionWithTypeArguments.expression.getText(); - } - if (!/React\.Component|Component/.test(typeSymbol)) { - return false; - } - return true; -} -exports.isReactComponent = isReactComponent; -/** - * Determine if a ts.HeritageClause is React HeritageClause - * - * @example `extends React.Component<{}, {}>` is a React HeritageClause - * - * @todo: this is lazy. Use the typeChecker instead - * @param clause - */ -function isReactHeritageClause(clause) { - return ( - clause.token === ts.SyntaxKind.ExtendsKeyword && - clause.types.length === 1 && - ts.isExpressionWithTypeArguments(clause.types[0]) && - /Component/.test(clause.types[0].expression.getText()) - ); -} -exports.isReactHeritageClause = isReactHeritageClause; -/** - * Return true if a statement is a React propType assignment statement - * @example - * SomeComponent.propTypes = { foo: React.PropTypes.string }; - * @param statement - */ -function isReactPropTypeAssignmentStatement(statement) { - return ( - ts.isExpressionStatement(statement) && - ts.isBinaryExpression(statement.expression) && - statement.expression.operatorToken.kind === ts.SyntaxKind.FirstAssignment && - ts.isPropertyAccessExpression(statement.expression.left) && - /\.propTypes$|\.propTypes\..+$/.test(statement.expression.left.getText()) - ); -} -exports.isReactPropTypeAssignmentStatement = isReactPropTypeAssignmentStatement; -/** - * Does class member have a "static" member? - * @param classMember - */ -function hasStaticModifier(classMember) { - if (!classMember.modifiers) { - return false; - } - var staticModifier = _.find(classMember.modifiers, function(modifier) { - return modifier.kind == ts.SyntaxKind.StaticKeyword; - }); - return staticModifier !== undefined; -} -exports.hasStaticModifier = hasStaticModifier; -/** - * Is class member a React "propTypes" member? - * @param classMember - * @param sourceFile - */ -function isPropTypesMember(classMember, sourceFile) { - try { - var name_1 = - classMember.name !== undefined && ts.isIdentifier(classMember.name) ? classMember.name.escapedText : null; - return name_1 === 'propTypes'; - } catch (e) { - return false; - } -} -exports.isPropTypesMember = isPropTypesMember; -/** - * Get component name off of a propType assignment statement - * @param propTypeAssignment - * @param sourceFile - */ -function getComponentName(propTypeAssignment, sourceFile) { - var text = propTypeAssignment.getText(sourceFile); - return text.substr(0, text.indexOf('.')); -} -exports.getComponentName = getComponentName; -/** - * Convert react stateless function to arrow function - * @example - * Before: - * function Hello(message) { - * return
{message}
- * } - * - * After: - * const Hello = message => { - * return
{message}
- * } - */ -function convertReactStatelessFunctionToArrowFunction(statelessFunc) { - if (ts.isVariableStatement(statelessFunc)) return statelessFunc; - var funcName = statelessFunc.name || 'Component'; - var funcBody = statelessFunc.body || ts.createBlock([]); - var initializer = ts.createArrowFunction( - undefined, - undefined, - statelessFunc.parameters, - undefined, - undefined, - funcBody, - ); - return ts.createVariableStatement( - statelessFunc.modifiers, - ts.createVariableDeclarationList( - [ts.createVariableDeclaration(funcName, undefined, initializer)], - ts.NodeFlags.Const, - ), - ); -} -exports.convertReactStatelessFunctionToArrowFunction = convertReactStatelessFunctionToArrowFunction; -/** - * Insert an item in middle of an array after a specific item - * @param collection - * @param afterItem - * @param newItem - */ -function insertAfter(collection, afterItem, newItem) { - var index = _.indexOf(collection, afterItem) + 1; - return _.slice(collection, 0, index) - .concat(newItem) - .concat(_.slice(collection, index)); -} -exports.insertAfter = insertAfter; -/** - * Insert an item in middle of an array before a specific item - * @param collection - * @param beforeItem - * @param newItem - */ -function insertBefore(collection, beforeItem, newItems) { - var index = _.indexOf(collection, beforeItem); - return _.slice(collection, 0, index) - .concat(newItems) - .concat(_.slice(collection, index)); -} -exports.insertBefore = insertBefore; -/** - * Replace an item in a collection with another item - * @param collection - * @param item - * @param newItem - */ -function replaceItem(collection, item, newItem) { - var index = _.indexOf(collection, item); - return _.slice(collection, 0, index) - .concat(newItem) - .concat(_.slice(collection, index + 1)); -} -exports.replaceItem = replaceItem; -/** - * Remove an item from a collection - * @param collection - * @param item - * @param newItem - */ -function removeItem(collection, item) { - var index = _.indexOf(collection, item); - return _.slice(collection, 0, index).concat(_.slice(collection, index + 1)); -} -exports.removeItem = removeItem; diff --git a/d/index.js b/d/index.js deleted file mode 100644 index 45c3672..0000000 --- a/d/index.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var compiler_1 = require('./compiler'); -exports.compile = compiler_1.compile; -var react_js_make_props_and_state_transform_1 = require('./transforms/react-js-make-props-and-state-transform'); -exports.reactJSMakePropsAndStateInterfaceTransformFactoryFactory = - react_js_make_props_and_state_transform_1.reactJSMakePropsAndStateInterfaceTransformFactoryFactory; -var react_remove_prop_types_assignment_transform_1 = require('./transforms/react-remove-prop-types-assignment-transform'); -exports.reactRemovePropTypesAssignmentTransformFactoryFactory = - react_remove_prop_types_assignment_transform_1.reactRemovePropTypesAssignmentTransformFactoryFactory; -var react_move_prop_types_to_class_transform_1 = require('./transforms/react-move-prop-types-to-class-transform'); -exports.reactMovePropTypesToClassTransformFactoryFactory = - react_move_prop_types_to_class_transform_1.reactMovePropTypesToClassTransformFactoryFactory; -var collapse_intersection_interfaces_transform_1 = require('./transforms/collapse-intersection-interfaces-transform'); -exports.collapseIntersectionInterfacesTransformFactoryFactory = - collapse_intersection_interfaces_transform_1.collapseIntersectionInterfacesTransformFactoryFactory; -var react_remove_static_prop_types_member_transform_1 = require('./transforms/react-remove-static-prop-types-member-transform'); -exports.reactRemoveStaticPropTypesMemberTransformFactoryFactory = - react_remove_static_prop_types_member_transform_1.reactRemoveStaticPropTypesMemberTransformFactoryFactory; -var react_stateless_function_make_props_transform_1 = require('./transforms/react-stateless-function-make-props-transform'); -exports.reactStatelessFunctionMakePropsTransformFactoryFactory = - react_stateless_function_make_props_transform_1.reactStatelessFunctionMakePropsTransformFactoryFactory; -var react_remove_prop_types_import_1 = require('./transforms/react-remove-prop-types-import'); -exports.reactRemovePropTypesImportTransformFactoryFactory = - react_remove_prop_types_import_1.reactRemovePropTypesImportTransformFactoryFactory; -exports.allTransforms = [ - react_move_prop_types_to_class_transform_1.reactMovePropTypesToClassTransformFactoryFactory, - react_js_make_props_and_state_transform_1.reactJSMakePropsAndStateInterfaceTransformFactoryFactory, - react_stateless_function_make_props_transform_1.reactStatelessFunctionMakePropsTransformFactoryFactory, - collapse_intersection_interfaces_transform_1.collapseIntersectionInterfacesTransformFactoryFactory, - react_remove_prop_types_assignment_transform_1.reactRemovePropTypesAssignmentTransformFactoryFactory, - react_remove_static_prop_types_member_transform_1.reactRemoveStaticPropTypesMemberTransformFactoryFactory, - react_remove_prop_types_import_1.reactRemovePropTypesImportTransformFactoryFactory, -]; -/** - * Run React JavaScript to TypeScript transform for file at `filePath` - * @param filePath - */ -function run(filePath, prettierOptions, compilationOptions) { - if (prettierOptions === void 0) { - prettierOptions = {}; - } - if (compilationOptions === void 0) { - compilationOptions = compiler_1.DEFAULT_COMPILATION_OPTIONS; - } - return compiler_1.compile(filePath, exports.allTransforms, prettierOptions, compilationOptions); -} -exports.run = run; diff --git a/d/transforms/collapse-intersection-interfaces-transform.js b/d/transforms/collapse-intersection-interfaces-transform.js deleted file mode 100644 index 90e8df4..0000000 --- a/d/transforms/collapse-intersection-interfaces-transform.js +++ /dev/null @@ -1,187 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -var __read = - (this && this.__read) || - function(o, n) { - var m = typeof Symbol === 'function' && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), - r, - ar = [], - e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } catch (error) { - e = { error: error }; - } finally { - try { - if (r && !r.done && (m = i['return'])) m.call(i); - } finally { - if (e) throw e.error; - } - } - return ar; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -/** - * Collapse unnecessary intersections between type literals - * - * @example - * Before: - * type Foo = {foo: string;} & {bar: number;} - * - * After - * type Foo = {foo: string; bar: number;} - */ -function collapseIntersectionInterfacesTransformFactoryFactory(typeChecker) { - return function collapseIntersectionInterfacesTransformFactory(context) { - return function collapseIntersectionInterfacesTransform(sourceFile) { - var visited = ts.visitEachChild(sourceFile, visitor, context); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - function visitor(node) { - if (ts.isTypeAliasDeclaration(node)) { - return visitTypeAliasDeclaration(node); - } - return node; - } - function visitTypeAliasDeclaration(node) { - if (ts.isIntersectionTypeNode(node.type)) { - return ts.createTypeAliasDeclaration( - [], - [], - node.name.text, - [], - visitIntersectionTypeNode(node.type), - ); - } - return node; - } - function visitIntersectionTypeNode(node) { - var e_1, _a; - // Only intersection of type literals can be colapsed. - // We are currently ignoring intersections such as `{foo: string} & {bar: string} & TypeRef` - // TODO: handle mix of type references and multiple literal types - if ( - !node.types.every(function(typeNode) { - return ts.isTypeLiteralNode(typeNode); - }) - ) { - return node; - } - // We need cast `node.type.types` to `ts.NodeArray` - // because TypeScript can't figure out `node.type.types.every(ts.isTypeLiteralNode)` - var types = node.types; - // Build a map of member names to all of types found in intersectioning type literals - // For instance {foo: string, bar: number} & { foo: number } will result in a map like this: - // Map { - // 'foo' => Set { 'string', 'number' }, - // 'bar' => Set { 'number' } - // } - var membersMap = new Map(); - // A sepecial member of type literal nodes is index signitures which don't have a name - // We use this symbol to track it in our members map - var INDEX_SIGNITUTRE_MEMBER = Symbol('Index signiture member'); - // Keep a reference of first index signiture member parameters. (ignore rest) - var indexMemberParameter = null; - // Iterate through all of type literal nodes members and add them to the members map - types.forEach(function(typeNode) { - typeNode.members.forEach(function(member) { - if (ts.isIndexSignatureDeclaration(member)) { - if (member.type !== undefined) { - if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) { - membersMap.get(INDEX_SIGNITUTRE_MEMBER).add(member.type); - } else { - indexMemberParameter = member.parameters; - membersMap.set(INDEX_SIGNITUTRE_MEMBER, new Set([member.type])); - } - } - } else if (ts.isPropertySignature(member)) { - if (member.type !== undefined) { - var memberName = member.name.getText(sourceFile); - // For unknown reasons, member.name.getText() is returning nothing in some cases - // This is probably because previous transformers did something with the AST that - // index of text string of member identifier is lost - // TODO: investigate - if (!memberName) { - memberName = member.name.escapedText; - } - if (membersMap.has(memberName)) { - membersMap.get(memberName).add(member.type); - } else { - membersMap.set(memberName, new Set([member.type])); - } - } - } - }); - }); - // Result type literal members list - var finalMembers = []; - try { - // Put together the map into a type literal that has member per each map entery and type of that - // member is a union of all types in vlues for that member name in members map - // if a member has only one type, create a simple type literal for it - for (var _b = __values(membersMap.entries()), _c = _b.next(); !_c.done; _c = _b.next()) { - var _d = __read(_c.value, 2), - name_1 = _d[0], - types_1 = _d[1]; - if (typeof name_1 === 'symbol') { - continue; - } - // if for this name there is only one type found use the first type, otherwise make a union of all types - var resultType = - types_1.size === 1 ? Array.from(types_1)[0] : createUnionType(Array.from(types_1)); - finalMembers.push(ts.createPropertySignature([], name_1, undefined, resultType, undefined)); - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_1) throw e_1.error; - } - } - // Handle index signiture member - if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) { - var indexTypes = Array.from(membersMap.get(INDEX_SIGNITUTRE_MEMBER)); - var indexType = indexTypes[0]; - if (indexTypes.length > 1) { - indexType = createUnionType(indexTypes); - } - var indexSigniture = ts.createIndexSignature([], [], indexMemberParameter, indexType); - finalMembers.push(indexSigniture); - } - // Generate one single type literal node - return ts.createTypeLiteralNode(finalMembers); - } - /** - * Create a union type from multiple type nodes - * @param types - */ - function createUnionType(types) { - // first dedupe literal types - // TODO: this only works if all types are primitive types like string or number - var uniqueTypes = _.uniqBy(types, function(type) { - return type.kind; - }); - return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.UnionType, uniqueTypes); - } - }; - }; -} -exports.collapseIntersectionInterfacesTransformFactoryFactory = collapseIntersectionInterfacesTransformFactoryFactory; diff --git a/d/transforms/react-js-make-props-and-state-transform.js b/d/transforms/react-js-make-props-and-state-transform.js deleted file mode 100644 index 5d6d935..0000000 --- a/d/transforms/react-js-make-props-and-state-transform.js +++ /dev/null @@ -1,258 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -var helpers = require('../helpers'); -/** - * Get transform for transforming React code originally written in JS which does not have - * props and state generic types - * This transform will remove React component static "propTypes" member during transform - */ -function reactJSMakePropsAndStateInterfaceTransformFactoryFactory(typeChecker) { - return function reactJSMakePropsAndStateInterfaceTransformFactory(context) { - return function reactJSMakePropsAndStateInterfaceTransform(sourceFile) { - var visited = visitSourceFile(sourceFile, typeChecker); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactJSMakePropsAndStateInterfaceTransformFactoryFactory = reactJSMakePropsAndStateInterfaceTransformFactoryFactory; -function visitSourceFile(sourceFile, typeChecker) { - var e_1, _a; - var newSourceFile = sourceFile; - try { - for (var _b = __values(sourceFile.statements), _c = _b.next(); !_c.done; _c = _b.next()) { - var statement = _c.value; - if (ts.isClassDeclaration(statement) && helpers.isReactComponent(statement, typeChecker)) { - newSourceFile = visitReactClassDeclaration(statement, newSourceFile, typeChecker); - } - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_1) throw e_1.error; - } - } - return newSourceFile; -} -function visitReactClassDeclaration(classDeclaration, sourceFile, typeChecker) { - if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { - return sourceFile; - } - var className = classDeclaration && classDeclaration.name && classDeclaration.name.getText(sourceFile); - var propType = getPropsTypeOfReactComponentClass(classDeclaration, sourceFile); - var stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); - var shouldMakePropTypeDeclaration = propType.members.length > 0; - var shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); - var propTypeName = className + 'Props'; - var stateTypeName = className + 'State'; - var propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); - var stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType); - var propTypeRef = ts.createTypeReferenceNode(propTypeName, []); - var stateTypeRef = ts.createTypeReferenceNode(stateTypeName, []); - var newClassDeclaration = getNewReactClassDeclaration( - classDeclaration, - shouldMakePropTypeDeclaration ? propTypeRef : propType, - shouldMakeStateTypeDeclaration ? stateTypeRef : stateType, - ); - var allTypeDeclarations = []; - if (shouldMakePropTypeDeclaration) allTypeDeclarations.push(propTypeDeclaration); - if (shouldMakeStateTypeDeclaration) allTypeDeclarations.push(stateTypeDeclaration); - var statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); - statements = helpers.replaceItem(statements, classDeclaration, newClassDeclaration); - return ts.updateSourceFileNode(sourceFile, statements); -} -function getNewReactClassDeclaration(classDeclaration, propTypeRef, stateTypeRef) { - if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { - return classDeclaration; - } - var firstHeritageClause = classDeclaration.heritageClauses[0]; - var newFirstHeritageClauseTypes = helpers.replaceItem( - firstHeritageClause.types, - firstHeritageClause.types[0], - ts.updateExpressionWithTypeArguments( - firstHeritageClause.types[0], - [propTypeRef, stateTypeRef], - firstHeritageClause.types[0].expression, - ), - ); - var newHeritageClauses = helpers.replaceItem( - classDeclaration.heritageClauses, - firstHeritageClause, - ts.updateHeritageClause(firstHeritageClause, newFirstHeritageClauseTypes), - ); - return ts.updateClassDeclaration( - classDeclaration, - classDeclaration.decorators, - classDeclaration.modifiers, - classDeclaration.name, - classDeclaration.typeParameters, - newHeritageClauses, - classDeclaration.members, - ); -} -function getPropsTypeOfReactComponentClass(classDeclaration, sourceFile) { - var staticPropTypesMember = _.find(classDeclaration.members, function(member) { - return ( - ts.isPropertyDeclaration(member) && - helpers.hasStaticModifier(member) && - helpers.isPropTypesMember(member, sourceFile) - ); - }); - if ( - staticPropTypesMember !== undefined && - ts.isPropertyDeclaration(staticPropTypesMember) && // check to satisfy type checker - staticPropTypesMember.initializer && - ts.isObjectLiteralExpression(staticPropTypesMember.initializer) - ) { - return helpers.buildInterfaceFromPropTypeObjectLiteral(staticPropTypesMember.initializer); - } - var staticPropTypesGetterMember = _.find(classDeclaration.members, function(member) { - return ( - ts.isGetAccessorDeclaration(member) && - helpers.hasStaticModifier(member) && - helpers.isPropTypesMember(member, sourceFile) - ); - }); - if ( - staticPropTypesGetterMember !== undefined && - ts.isGetAccessorDeclaration(staticPropTypesGetterMember) // check to satisfy typechecker - ) { - var returnStatement = _.find(staticPropTypesGetterMember.body.statements, function(statement) { - return ts.isReturnStatement(statement); - }); - if ( - returnStatement !== undefined && - ts.isReturnStatement(returnStatement) && // check to satisfy typechecker - returnStatement.expression && - ts.isObjectLiteralExpression(returnStatement.expression) - ) { - return helpers.buildInterfaceFromPropTypeObjectLiteral(returnStatement.expression); - } - } - return ts.createTypeLiteralNode([]); -} -function getStateTypeOfReactComponentClass(classDeclaration, typeChecker) { - var initialState = getInitialStateFromClassDeclaration(classDeclaration, typeChecker); - var initialStateIsVoid = initialState.kind === ts.SyntaxKind.VoidKeyword; - var collectedStateTypes = getStateLookingForSetStateCalls(classDeclaration, typeChecker); - if (!collectedStateTypes.length && initialStateIsVoid) { - return ts.createTypeLiteralNode([]); - } - if (!initialStateIsVoid) { - collectedStateTypes.push(initialState); - } - return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.IntersectionType, collectedStateTypes); -} -/** - * Get initial state of a React component looking for state value initially set - * @param classDeclaration - * @param typeChecker - */ -function getInitialStateFromClassDeclaration(classDeclaration, typeChecker) { - // initial state class member - var e_2, _a; - var initialStateMember = _.find(classDeclaration.members, function(member) { - try { - return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'state'; - } catch (e) { - return false; - } - }); - if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { - var type = typeChecker.getTypeAtLocation(initialStateMember.initializer); - return typeChecker.typeToTypeNode(type); - } - // Initial state in constructor - var constructor = _.find(classDeclaration.members, function(member) { - return member.kind === ts.SyntaxKind.Constructor; - }); - if (constructor && constructor.body) { - try { - for (var _b = __values(constructor.body.statements), _c = _b.next(); !_c.done; _c = _b.next()) { - var statement = _c.value; - if ( - ts.isExpressionStatement(statement) && - ts.isBinaryExpression(statement.expression) && - statement.expression.left.getText() === 'this.state' - ) { - return typeChecker.typeToTypeNode(typeChecker.getTypeAtLocation(statement.expression.right)); - } - } - } catch (e_2_1) { - e_2 = { error: e_2_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_2) throw e_2.error; - } - } - } - // No initial state, fall back to void - return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); -} -/** - * Look for setState() function calls to collect the state interface in a React class component - * @param classDeclaration - * @param typeChecker - */ -function getStateLookingForSetStateCalls(classDeclaration, typeChecker) { - var e_3, _a; - var typeNodes = []; - try { - for (var _b = __values(classDeclaration.members), _c = _b.next(); !_c.done; _c = _b.next()) { - var member = _c.value; - if (member && ts.isMethodDeclaration(member) && member.body) { - lookForSetState(member.body); - } - } - } catch (e_3_1) { - e_3 = { error: e_3_1 }; - } finally { - try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); - } finally { - if (e_3) throw e_3.error; - } - } - return typeNodes; - function lookForSetState(node) { - ts.forEachChild(node, lookForSetState); - if ( - ts.isExpressionStatement(node) && - ts.isCallExpression(node.expression) && - node.expression.expression.getText().match(/setState/) - ) { - var type = typeChecker.getTypeAtLocation(node.expression.arguments[0]); - typeNodes.push(typeChecker.typeToTypeNode(type)); - } - } -} -function isStateTypeMemberEmpty(stateType) { - // Only need to handle TypeLiteralNode & IntersectionTypeNode - if (ts.isTypeLiteralNode(stateType)) { - return stateType.members.length === 0; - } - if (!ts.isIntersectionTypeNode(stateType)) { - return true; - } - return stateType.types.every(isStateTypeMemberEmpty); -} diff --git a/d/transforms/react-move-prop-types-to-class-transform.js b/d/transforms/react-move-prop-types-to-class-transform.js deleted file mode 100644 index 9a88384..0000000 --- a/d/transforms/react-move-prop-types-to-class-transform.js +++ /dev/null @@ -1,154 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -var __read = - (this && this.__read) || - function(o, n) { - var m = typeof Symbol === 'function' && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), - r, - ar = [], - e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } catch (error) { - e = { error: error }; - } finally { - try { - if (r && !r.done && (m = i['return'])) m.call(i); - } finally { - if (e) throw e.error; - } - } - return ar; - }; -var __spread = - (this && this.__spread) || - function() { - for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); - return ar; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -var helpers = require('../helpers'); -/** - * Move Component.propTypes statements into class as a static member of the class - * if React component is defined using a class - * - * Note: This transform assumes React component declaration and propTypes assignment statement - * are both on root of the source file - * - * @example - * Before: - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - * SomeComponent.propTypes = { foo: React.PropTypes.string } - * - * After - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> { - * static propTypes = { foo: React.PropTypes.string } - * } - * - * @todo - * This is not supporting multiple statements for a single class yet - * ``` - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - * SomeComponent.propTypes = { foo: React.PropTypes.string } - * SomeComponent.propTypes.bar = React.PropTypes.number; - * ``` - */ -function reactMovePropTypesToClassTransformFactoryFactory(typeChecker) { - return function reactMovePropTypesToClassTransformFactory(context) { - return function reactMovePropTypesToClassTransform(sourceFile) { - var visited = visitSourceFile(sourceFile, typeChecker); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactMovePropTypesToClassTransformFactoryFactory = reactMovePropTypesToClassTransformFactoryFactory; -/** - * Make the move from propType statement to static member - * @param sourceFile - * @param typeChecker - */ -function visitSourceFile(sourceFile, typeChecker) { - var e_1, _a; - var statements = sourceFile.statements; - // Look for propType assignment statements - var propTypeAssignments = statements.filter(function(statement) { - return helpers.isReactPropTypeAssignmentStatement(statement); - }); - var _loop_1 = function(propTypeAssignment) { - // Look for the class declarations with the same name - var componentName = helpers.getComponentName(propTypeAssignment, sourceFile); - var classStatement = _.find(statements, function(statement) { - return ( - ts.isClassDeclaration(statement) && - statement.name !== undefined && - statement.name.getText(sourceFile) === componentName - ); - }); // Type weirdness - // && helpers.isBinaryExpression(propTypeAssignment.expression) is redundant to satisfy the type checker - if (classStatement && ts.isBinaryExpression(propTypeAssignment.expression)) { - var newClassStatement = addStaticMemberToClass( - classStatement, - 'propTypes', - propTypeAssignment.expression.right, - ); - statements = ts.createNodeArray(helpers.replaceItem(statements, classStatement, newClassStatement)); - } - }; - try { - for ( - var propTypeAssignments_1 = __values(propTypeAssignments), - propTypeAssignments_1_1 = propTypeAssignments_1.next(); - !propTypeAssignments_1_1.done; - propTypeAssignments_1_1 = propTypeAssignments_1.next() - ) { - var propTypeAssignment = propTypeAssignments_1_1.value; - _loop_1(propTypeAssignment); - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (propTypeAssignments_1_1 && !propTypeAssignments_1_1.done && (_a = propTypeAssignments_1.return)) - _a.call(propTypeAssignments_1); - } finally { - if (e_1) throw e_1.error; - } - } - return ts.updateSourceFileNode(sourceFile, statements); -} -/** - * Insert a new static member into a class - * @param classDeclaration - * @param name - * @param value - */ -function addStaticMemberToClass(classDeclaration, name, value) { - var staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - var propertyDeclaration = ts.createProperty([], [staticModifier], name, undefined, undefined, value); - return ts.updateClassDeclaration( - classDeclaration, - classDeclaration.decorators, - classDeclaration.modifiers, - classDeclaration.name, - classDeclaration.typeParameters, - ts.createNodeArray(classDeclaration.heritageClauses), - ts.createNodeArray(__spread([propertyDeclaration], classDeclaration.members)), - ); -} diff --git a/d/transforms/react-remove-prop-types-assignment-transform.js b/d/transforms/react-remove-prop-types-assignment-transform.js deleted file mode 100644 index b56e158..0000000 --- a/d/transforms/react-remove-prop-types-assignment-transform.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var helpers = require('../helpers'); -/** - * Remove Component.propTypes statements - * - * @example - * Before: - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - * SomeComponent.propTypes = { foo: React.PropTypes.string } - * - * After - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - */ -function reactRemovePropTypesAssignmentTransformFactoryFactory(typeChecker) { - return function reactRemovePropTypesAssignmentTransformFactory(context) { - return function reactRemovePropTypesAssignmentTransform(sourceFile) { - var visited = ts.updateSourceFileNode( - sourceFile, - sourceFile.statements.filter(function(s) { - return !helpers.isReactPropTypeAssignmentStatement(s); - }), - ); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactRemovePropTypesAssignmentTransformFactoryFactory = reactRemovePropTypesAssignmentTransformFactoryFactory; diff --git a/d/transforms/react-remove-prop-types-import.js b/d/transforms/react-remove-prop-types-import.js deleted file mode 100644 index 5b3a9d2..0000000 --- a/d/transforms/react-remove-prop-types-import.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -/** - * Remove `import PropTypes from 'prop-types'` or - * `import { PropTypes } from 'react'` - * - * @example - * Before: - * import PropTypes from 'prop-types' - * import React, { PropTypes } from 'react' - * - * After: - * import React from 'react' - */ -function reactRemovePropTypesImportTransformFactoryFactory(typeChecker) { - return function reactRemovePropTypesImportTransformFactory(context) { - return function reactRemovePropTypesImportTransform(sourceFile) { - var visited = ts.updateSourceFileNode( - sourceFile, - sourceFile.statements - .filter(function(s) { - return !( - ts.isImportDeclaration(s) && - ts.isStringLiteral(s.moduleSpecifier) && - s.moduleSpecifier.text === 'prop-types' - ); - }) - .map(updateReactImportIfNeeded), - ); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactRemovePropTypesImportTransformFactoryFactory = reactRemovePropTypesImportTransformFactoryFactory; -function updateReactImportIfNeeded(statement) { - if ( - !ts.isImportDeclaration(statement) || - !ts.isStringLiteral(statement.moduleSpecifier) || - statement.moduleSpecifier.text !== 'react' || - !statement.importClause || - !statement.importClause.namedBindings || - !ts.isNamedImports(statement.importClause.namedBindings) - ) { - return statement; - } - var namedBindings = statement.importClause.namedBindings; - var newNamedBindingElements = namedBindings.elements.filter(function(elm) { - return elm.name.text !== 'PropTypes'; - }); - if (newNamedBindingElements.length === namedBindings.elements.length) { - // Means it has no 'PropTypes' named import - return statement; - } - var newImportClause = ts.updateImportClause( - statement.importClause, - statement.importClause.name, - newNamedBindingElements.length === 0 - ? undefined - : ts.updateNamedImports(namedBindings, newNamedBindingElements), - ); - return ts.updateImportDeclaration( - statement, - statement.decorators, - statement.modifiers, - newImportClause, - statement.moduleSpecifier, - ); -} diff --git a/d/transforms/react-remove-static-prop-types-member-transform.js b/d/transforms/react-remove-static-prop-types-member-transform.js deleted file mode 100644 index 064c63a..0000000 --- a/d/transforms/react-remove-static-prop-types-member-transform.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var helpers = require('../helpers'); -/** - * Remove static propTypes - * - * @example - * Before: - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> { - * static propTypes = { - * foo: React.PropTypes.number.isRequired, - * } - * } - * - * After: - * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} - */ -function reactRemoveStaticPropTypesMemberTransformFactoryFactory(typeChecker) { - return function reactRemoveStaticPropTypesMemberTransformFactory(context) { - return function reactRemoveStaticPropTypesMemberTransform(sourceFile) { - var visited = ts.visitEachChild(sourceFile, visitor, context); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - function visitor(node) { - if (ts.isClassDeclaration(node) && helpers.isReactComponent(node, typeChecker)) { - return ts.updateClassDeclaration( - node, - node.decorators, - node.modifiers, - node.name, - node.typeParameters, - ts.createNodeArray(node.heritageClauses), - node.members.filter(function(member) { - if ( - ts.isPropertyDeclaration(member) && - helpers.hasStaticModifier(member) && - helpers.isPropTypesMember(member, sourceFile) - ) { - return false; - } - // propTypes getter - if ( - ts.isGetAccessorDeclaration(member) && - helpers.hasStaticModifier(member) && - helpers.isPropTypesMember(member, sourceFile) - ) { - return false; - } - return true; - }), - ); - } - return node; - } - }; - }; -} -exports.reactRemoveStaticPropTypesMemberTransformFactoryFactory = reactRemoveStaticPropTypesMemberTransformFactoryFactory; diff --git a/d/transforms/react-stateless-function-make-props-transform.js b/d/transforms/react-stateless-function-make-props-transform.js deleted file mode 100644 index f3055e5..0000000 --- a/d/transforms/react-stateless-function-make-props-transform.js +++ /dev/null @@ -1,133 +0,0 @@ -'use strict'; -var __values = - (this && this.__values) || - function(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - }; -Object.defineProperty(exports, '__esModule', { value: true }); -var ts = require('typescript'); -var _ = require('lodash'); -var helpers = require('../helpers'); -/** - * Transform react stateless components - * - * @example - * Before: - * const Hello = ({ message }) => { - * return
hello {message}
- * } - * // Or: - * // const Hello = ({ message }) =>
hello {message}
- * - * Hello.propTypes = { - * message: React.PropTypes.string, - * } - * - * After: - * Type HelloProps = { - * message: string; - * } - * - * const Hello: React.SFC = ({ message }) => { - * return
hello {message}
- * } - * - * Hello.propTypes = { - * message: React.PropTypes.string, - * } - */ -function reactStatelessFunctionMakePropsTransformFactoryFactory(typeChecker) { - return function reactStatelessFunctionMakePropsTransformFactory(context) { - return function reactStatelessFunctionMakePropsTransform(sourceFile) { - var visited = visitSourceFile(sourceFile, typeChecker); - ts.addEmitHelpers(visited, context.readEmitHelpers()); - return visited; - }; - }; -} -exports.reactStatelessFunctionMakePropsTransformFactoryFactory = reactStatelessFunctionMakePropsTransformFactoryFactory; -function visitSourceFile(sourceFile, typeChecker) { - var e_1, _a; - // Look for propType assignment statements - var propTypeAssignments = sourceFile.statements.filter(function(statement) { - return helpers.isReactPropTypeAssignmentStatement(statement); - }); - var newSourceFile = sourceFile; - var _loop_1 = function(propTypeAssignment) { - var componentName = helpers.getComponentName(propTypeAssignment, newSourceFile); - var funcComponent = _.find(newSourceFile.statements, function(s) { - return ( - (ts.isFunctionDeclaration(s) && s.name !== undefined && s.name.getText() === componentName) || - (ts.isVariableStatement(s) && s.declarationList.declarations[0].name.getText() === componentName) - ); - }); // Type weirdness - if (funcComponent) { - newSourceFile = visitReactStatelessComponent(funcComponent, propTypeAssignment, newSourceFile); - } - }; - try { - for ( - var propTypeAssignments_1 = __values(propTypeAssignments), - propTypeAssignments_1_1 = propTypeAssignments_1.next(); - !propTypeAssignments_1_1.done; - propTypeAssignments_1_1 = propTypeAssignments_1.next() - ) { - var propTypeAssignment = propTypeAssignments_1_1.value; - _loop_1(propTypeAssignment); - } - } catch (e_1_1) { - e_1 = { error: e_1_1 }; - } finally { - try { - if (propTypeAssignments_1_1 && !propTypeAssignments_1_1.done && (_a = propTypeAssignments_1.return)) - _a.call(propTypeAssignments_1); - } finally { - if (e_1) throw e_1.error; - } - } - return newSourceFile; -} -function visitReactStatelessComponent(component, propTypesExpressionStatement, sourceFile) { - var arrowFuncComponent = helpers.convertReactStatelessFunctionToArrowFunction(component); - var componentName = arrowFuncComponent.declarationList.declarations[0].name.getText(); - var componentInitializer = arrowFuncComponent.declarationList.declarations[0].initializer; - var propType = getPropTypesFromTypeAssignment(propTypesExpressionStatement); - var shouldMakePropTypeDeclaration = propType.members.length > 0; - var propTypeName = componentName + 'Props'; - var propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); - var propTypeRef = ts.createTypeReferenceNode(propTypeName, []); - var componentType = ts.createTypeReferenceNode(ts.createQualifiedName(ts.createIdentifier('React'), 'SFC'), [ - shouldMakePropTypeDeclaration ? propTypeRef : propType, - ]); - // replace component with ts stateless component - var typedComponent = ts.createVariableStatement( - arrowFuncComponent.modifiers, - ts.createVariableDeclarationList( - [ts.createVariableDeclaration(componentName, componentType, componentInitializer)], - arrowFuncComponent.declarationList.flags, - ), - ); - var statements = shouldMakePropTypeDeclaration - ? helpers.insertBefore(sourceFile.statements, component, [propTypeDeclaration]) - : sourceFile.statements; - statements = helpers.replaceItem(statements, component, typedComponent); - return ts.updateSourceFileNode(sourceFile, statements); -} -function getPropTypesFromTypeAssignment(propTypesExpressionStatement) { - if ( - propTypesExpressionStatement !== undefined && - ts.isBinaryExpression(propTypesExpressionStatement.expression) && - ts.isObjectLiteralExpression(propTypesExpressionStatement.expression.right) - ) { - return helpers.buildInterfaceFromPropTypeObjectLiteral(propTypesExpressionStatement.expression.right); - } - return ts.createTypeLiteralNode([]); -} From d17791a6881d106d72e3bcaaf457dac93daf5918 Mon Sep 17 00:00:00 2001 From: piscium2010 Date: Thu, 11 Jul 2019 22:40:56 +0800 Subject: [PATCH 07/26] p --- .vscode/launch.json | 2 +- package-lock.json | 7060 +++++++++++++++++++++++++++++++++++++++++++ package.json | 10 +- src/P.js | 42 +- src/cli.ts | 3 +- 5 files changed, 7079 insertions(+), 38 deletions(-) create mode 100644 package-lock.json diff --git a/.vscode/launch.json b/.vscode/launch.json index ff8b896..e4747d6 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,7 +6,7 @@ "request": "launch", "name": "ts", "program": "${workspaceFolder}/src/cli.ts", - "args": ["${workspaceFolder}/P.js", "--keep-original-files"], + "args": ["${workspaceFolder}/src/P.js", "--keep-original-files"], "preLaunchTask": "tsc", "outFiles": ["${workspaceFolder}/dist/**/*.js"] }, diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b4cf61a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7060 @@ +{ + "name": "react-js-to-ts", + "version": "1.4.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@types/chalk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz", + "integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==", + "dev": true, + "requires": { + "chalk": "*" + } + }, + "@types/commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/@types/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==", + "dev": true, + "requires": { + "commander": "*" + } + }, + "@types/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-eOFBOFCqusnH0i1s9XoURksqTZbsv5vbMMgOBKgSt67TsOw6ViaHO0Ii5DMhRoiU5TJ51uf9NsOpnxXsN96ywg==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "5.0.36", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.36.tgz", + "integrity": "sha512-KEzSKuP2+3oOjYYjujue6Z3Yqis5HKA1BsIC+jZ1v3lrRNdsqyNNtX0rQf6LSuI4DJJ2z5UV//zBZCcvM0xikg==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jest": { + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-22.2.3.tgz", + "integrity": "sha512-e74sM9W/4qqWB6D4TWV9FQk0WoHtX1X4FJpbjxucMSVJHtFjbQOH3H6yp+xno4br0AKG0wz/kPtaN599GUOvAg==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.136", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.136.tgz", + "integrity": "sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "10.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.12.tgz", + "integrity": "sha512-QcAKpaO6nhHLlxWBvpc4WeLrTvPqlHOvaj0s5GriKkA1zq+bsFBPpfYCvQhLqLgYlIko8A9YrPdaMHCo5mBcpg==", + "dev": true + }, + "@types/prettier": { + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.16.4.tgz", + "integrity": "sha512-MG7ExKBo7AQ5UrL1awyYLNinNM/kyXgE4iP4Ul9fB+T7n768Z5Xem8IZeP6Bna0xze8gkDly49Rgge2HOEw4xA==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", + "integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg==", + "dev": true + }, + "@types/react": { + "version": "16.8.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.23.tgz", + "integrity": "sha512-abkEOIeljniUN9qB5onp++g0EY38h7atnDHxwKUFz1r3VH1+yG1OKi2sNPTyObL40goBmfKFpdii2lEzwLX1cA==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", + "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "ajv": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz", + "integrity": "sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ==", + "dev": true, + "requires": { + "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-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.4" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^22.4.4", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + } + }, + "bser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "cpx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", + "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", + "dev": true, + "requires": { + "babel-runtime": "^6.9.2", + "chokidar": "^1.6.0", + "duplexer": "^0.1.1", + "glob": "^7.0.5", + "glob2base": "^0.0.12", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "resolve": "^1.1.7", + "safe-buffer": "^5.0.1", + "shell-quote": "^1.6.1", + "subarg": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.3.0.tgz", + "integrity": "sha512-wXsoRfsRfsLVNaVzoKdqvEmK/5PFaEXNspVT22Ots6K/cnJdpoDKuQFw+qlMiXnmaif1OgeC466X1zISgAOcGg==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + } + }, + "csstype": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", + "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expect": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.0.tgz", + "integrity": "sha512-lk2cUCo8QzbiEWEbt7Cw3m27WMiRG321xsssbcIpfMhpRjrlC08WBOVQqj1/nQYYNnPtyIhP1oqLO3QwT2tPCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", + "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "^0.1.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "husky": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", + "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "dev": true, + "requires": { + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", + "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^22.4.4" + }, + "dependencies": { + "jest-cli": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", + "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.14", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-instrument": "^1.8.0", + "istanbul-lib-source-maps": "^1.2.1", + "jest-changed-files": "^22.2.0", + "jest-config": "^22.4.4", + "jest-environment-jsdom": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^22.4.2", + "jest-message-util": "^22.4.0", + "jest-regex-util": "^22.1.0", + "jest-resolve-dependencies": "^22.1.0", + "jest-runner": "^22.4.4", + "jest-runtime": "^22.4.4", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "jest-worker": "^22.2.2", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^10.0.3" + } + } + } + }, + "jest-changed-files": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", + "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^22.4.1", + "jest-environment-node": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^22.4.4", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "pretty-format": "^22.4.0" + } + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + } + }, + "jest-docblock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^22.4.3", + "jest-serializer": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-jasmine2": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", + "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^22.4.0", + "graceful-fs": "^4.1.11", + "is-generator-fn": "^1.0.0", + "jest-diff": "^22.4.0", + "jest-matcher-utils": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "source-map-support": "^0.5.0" + } + }, + "jest-leak-detector": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "dev": true, + "requires": { + "pretty-format": "^22.4.3" + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + } + }, + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-regex-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1" + } + }, + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "dev": true, + "requires": { + "jest-regex-util": "^22.4.3" + } + }, + "jest-runner": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", + "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "jest-config": "^22.4.4", + "jest-docblock": "^22.4.0", + "jest-haste-map": "^22.4.2", + "jest-jasmine2": "^22.4.4", + "jest-leak-detector": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-runtime": "^22.4.4", + "jest-util": "^22.4.1", + "jest-worker": "^22.2.2", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", + "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^22.4.4", + "babel-plugin-istanbul": "^4.1.5", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^22.4.4", + "jest-haste-map": "^22.4.2", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^10.0.3" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "jest-serializer": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "dev": true + }, + "jest-snapshot": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^22.4.3" + } + }, + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^22.4.3", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "jest-validate": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", + "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-config": "^22.4.4", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^22.4.0" + } + }, + "jest-worker": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lint-staged": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-7.3.0.tgz", + "integrity": "sha512-AXk40M9DAiPi7f4tdJggwuKIViUplYtVj1os1MVEteW7qOkU50EOehayCfO9TsoGK24o/EsWb41yrEgfJDDjCw==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "commander": "^2.14.1", + "cosmiconfig": "^5.0.2", + "debug": "^3.1.0", + "dedent": "^0.7.0", + "execa": "^0.9.0", + "find-parent-dir": "^0.3.0", + "is-glob": "^4.0.0", + "is-windows": "^1.0.2", + "jest-validate": "^23.5.0", + "listr": "^0.14.1", + "lodash": "^4.17.5", + "log-symbols": "^2.2.0", + "micromatch": "^3.1.8", + "npm-which": "^3.0.1", + "p-map": "^1.1.1", + "path-is-inside": "^1.0.2", + "pify": "^3.0.0", + "please-upgrade-node": "^3.0.2", + "staged-git-files": "1.1.1", + "string-argv": "^0.0.2", + "stringify-object": "^3.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "execa": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.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.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "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": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "dependencies": { + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + } + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "dependencies": { + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "npm-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", + "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", + "dev": true, + "requires": { + "which": "^1.2.10" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", + "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "dev": true, + "requires": { + "commander": "^2.9.0", + "npm-path": "^2.0.2", + "which": "^1.2.10" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "please-upgrade-node": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", + "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "prettier": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==" + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", + "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "staged-git-files": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.1.tgz", + "integrity": "sha512-H89UNKr1rQJvI1c/PIR3kiAMBV23yvR7LItZiV74HWZwzt7f3YHuujJ9nJZlt58WlFox7XQsOahexwk7nTe69A==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "string-argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", + "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-jest": { + "version": "22.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-22.4.6.tgz", + "integrity": "sha512-kYQ6g1G1AU+bOO9rv+SSQXg4WTcni6Wx3AM48iHni0nP1vIuhdNRjKTE9Cxx36Ix/IOV7L85iKu07dgXJzH2pQ==", + "dev": true, + "requires": { + "babel-core": "^6.26.3", + "babel-plugin-istanbul": "^4.1.6", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "babel-preset-jest": "^22.4.3", + "cpx": "^1.5.0", + "fs-extra": "6.0.0", + "jest-config": "^22.4.3", + "lodash": "^4.17.10", + "pkg-dir": "^2.0.0", + "source-map-support": "^0.5.5", + "yargs": "^11.0.0" + }, + "dependencies": { + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "ts-node": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-6.2.0.tgz", + "integrity": "sha512-ZNT+OEGfUNVMGkpIaDJJ44Zq3Yr0bkU/ugN1PHbU+/01Z7UV1fsELRiTx1KuQNvQ1A3pGh3y25iYF6jXgxV21A==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tslint": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz", + "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 8123b95..6a09796 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,16 @@ ".ts": "/node_modules/ts-jest/preprocessor.js" }, "testRegex": "(/tests/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - "moduleFileExtensions": ["ts", "js"] + "moduleFileExtensions": [ + "ts", + "js" + ] }, "lint-staged": { - "*.{js,json,css,md,ts,tsx}": ["node_modules/.bin/prettier --write", "git add"] + "*.{js,json,css,md,ts,tsx}": [ + "node_modules/.bin/prettier --write", + "git add" + ] }, "bin": "dist/cli.js", "author": "Mohsen Azimi ", diff --git a/src/P.js b/src/P.js index c515572..7215cbf 100644 --- a/src/P.js +++ b/src/P.js @@ -1,38 +1,12 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { Panel as RawPanel } from 'react-bootstrap'; -import TruncText from '../TruncText/TruncText'; - -export default class Panel extends Component { - static propTypes = { - bsClass: PropTypes.string, - activeKey: PropTypes.any, - eventKey: PropTypes.string.isRequired, - header: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired, - id: PropTypes.string, - onSelect: PropTypes.func, - children: PropTypes.any, - }; - - constructor(props) { - super(props); - this.childrenContent = []; - } +import * as React from 'react'; +export default class MyComponent extends React.Component { + state = { foo: 1, bar: 'str' }; render() { - const { activeKey, children, header, eventKey, bsClass, id } = this.props; - if (activeKey && activeKey == eventKey) this.childrenContent = children; - - return ( - - - - {header} - - {/* {header} */} - - {this.childrenContent} - - ); + return
; } } + +MyComponent.propTypes = { + baz: React.PropTypes.string.isRequired, +}; diff --git a/src/cli.ts b/src/cli.ts index 779f0a9..634140a 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -75,7 +75,8 @@ program try { fs.copyFileSync(filePath, temporaryPath); const result = run(temporaryPath, prettierOptions, compilationOptions); - fs.writeFileSync(newPath, result); + console.log('result:\n', result); + // fs.writeFileSync(newPath, result); if (!program.keepOriginalFiles) { fs.unlinkSync(filePath); } From 09573e5161c92a881ff0680e18049b639ba1e494 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Fri, 12 Jul 2019 11:36:38 +0800 Subject: [PATCH 08/26] add clean task --- .vscode/launch.json | 2 +- .vscode/tasks.json | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index e4747d6..dad31a2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,7 @@ "name": "ts", "program": "${workspaceFolder}/src/cli.ts", "args": ["${workspaceFolder}/src/P.js", "--keep-original-files"], - "preLaunchTask": "tsc", + "preLaunchTask": "build", "outFiles": ["${workspaceFolder}/dist/**/*.js"] }, { diff --git a/.vscode/tasks.json b/.vscode/tasks.json index df502dc..9adc796 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,10 +1,19 @@ { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format - "version": "0.1.0", - "command": "tsc", - "isShellCommand": true, - "args": ["--pretty"], - "showOutput": "silent", - "problemMatcher": "$tsc" + "version": "2.0.0", + "tasks": [ + { + "label": "clean", + "type": "shell", + "command": "rm", + "args": ["-rf", "dist"] + }, + { + "label": "build", + "command": "tsc", + "args": ["--pretty"], + "dependsOn": ["clean"] + } + ] } From 2f31e2b6f1c2a4a6c20ca847b2843227b2812a76 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Fri, 12 Jul 2019 13:21:43 +0800 Subject: [PATCH 09/26] p --- src/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/index.ts b/src/index.ts index 5c26c27..366e267 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,13 +22,13 @@ export { }; export const allTransforms = [ - reactMovePropTypesToClassTransformFactoryFactory, + // reactMovePropTypesToClassTransformFactoryFactory, reactJSMakePropsAndStateInterfaceTransformFactoryFactory, - reactStatelessFunctionMakePropsTransformFactoryFactory, - collapseIntersectionInterfacesTransformFactoryFactory, - reactRemovePropTypesAssignmentTransformFactoryFactory, - reactRemoveStaticPropTypesMemberTransformFactoryFactory, - reactRemovePropTypesImportTransformFactoryFactory, + // reactStatelessFunctionMakePropsTransformFactoryFactory, + // collapseIntersectionInterfacesTransformFactoryFactory, + // reactRemovePropTypesAssignmentTransformFactoryFactory, + // reactRemoveStaticPropTypesMemberTransformFactoryFactory, + // reactRemovePropTypesImportTransformFactoryFactory, ]; export type TransformFactoryFactory = (typeChecker: ts.TypeChecker) => ts.TransformerFactory; From e56c3c55252f35da4eb1714306cc6b837cd5b02a Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Tue, 16 Jul 2019 14:27:28 +0800 Subject: [PATCH 10/26] sp --- src/P.js | 4 + ...react-js-make-props-and-state-transform.ts | 76 ++++++++++++++++++- ...eact-move-prop-types-to-class-transform.ts | 2 +- 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/P.js b/src/P.js index 7215cbf..950751e 100644 --- a/src/P.js +++ b/src/P.js @@ -1,6 +1,10 @@ import * as React from 'react'; export default class MyComponent extends React.Component { + constructor(props) { + super(props); + this.name = 1; + } state = { foo: 1, bar: 'str' }; render() { return
; diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index cec52bb..9756e62 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -41,7 +41,11 @@ function visitReactClassDeclaration( } const className = classDeclaration && classDeclaration.name && classDeclaration.name.getText(sourceFile); const propType = getPropsTypeOfReactComponentClass(classDeclaration, sourceFile); + const stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); + + const propertyDeclaration = getInitialPropertyFromClassDeclaration(classDeclaration, typeChecker); + const shouldMakePropTypeDeclaration = propType.members.length > 0; const shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); const propTypeName = `I${className}Props`; @@ -63,7 +67,22 @@ function visitReactClassDeclaration( if (shouldMakeStateTypeDeclaration) allTypeDeclarations.push(stateTypeDeclaration); let statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); - statements = helpers.replaceItem(statements, classDeclaration, newClassDeclaration); + // statements = helpers.replaceItem(statements, classDeclaration, newClassDeclaration); // ? + + if (propertyDeclaration) { + const _newClassStatement = ts.updateClassDeclaration( + classDeclaration, + classDeclaration.decorators, + classDeclaration.modifiers, + classDeclaration.name, + classDeclaration.typeParameters, + ts.createNodeArray(classDeclaration.heritageClauses), + ts.createNodeArray([propertyDeclaration, ...classDeclaration.members]), + ); + const _statements = ts.createNodeArray(helpers.replaceItem(statements, classDeclaration, _newClassStatement)); + return ts.updateSourceFileNode(sourceFile, _statements); // temp + } + return ts.updateSourceFileNode(sourceFile, statements); } @@ -216,6 +235,61 @@ function getInitialStateFromClassDeclaration( // No initial state, fall back to void return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); } +/** + * Get properties within constructor + * @param classDeclaration + * @param typeChecker + */ +function getInitialPropertyFromClassDeclaration( + classDeclaration: ts.ClassDeclaration, + typeChecker: ts.TypeChecker, +): ts.PropertyDeclaration | void { + // initial state class member + + // const initialStateMember = _.find(classDeclaration.members, member => { + // try { + // return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'name'; + // } catch (e) { + // return false; + // } + // }); + + // if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { + // const type = typeChecker.getTypeAtLocation(initialStateMember.initializer)!; + + // return typeChecker.typeToTypeNode(type); + // } + + // Initial state in constructor + const constructor = _.find(classDeclaration.members, member => member.kind === ts.SyntaxKind.Constructor) as + | ts.ConstructorDeclaration + | undefined; + + if (constructor && constructor.body) { + for (const statement of constructor.body.statements) { + if ( + ts.isExpressionStatement(statement) && + ts.isBinaryExpression(statement.expression) && + statement.expression.left.getText() === 'this.name' + ) { + const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); + const propertyDeclaration = ts.createProperty( + [], + [staticModifier], + 'name', + undefined, + undefined, + statement.expression.right, + ); // temp + return propertyDeclaration; + // return typeChecker.typeToTypeNode(typeChecker.getTypeAtLocation(statement.expression.right)); + } + } + } + + // No initial state, fall back to void + // return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); +} /** * Look for setState() function calls to collect the state interface in a React class component diff --git a/src/transforms/react-move-prop-types-to-class-transform.ts b/src/transforms/react-move-prop-types-to-class-transform.ts index d954a11..27a0b2e 100644 --- a/src/transforms/react-move-prop-types-to-class-transform.ts +++ b/src/transforms/react-move-prop-types-to-class-transform.ts @@ -87,7 +87,7 @@ function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) */ function addStaticMemberToClass(classDeclaration: ts.ClassDeclaration, name: string, value: ts.Expression) { const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - const propertyDeclaration = ts.createProperty([], [staticModifier], name, undefined, undefined, value); + const propertyDeclaration = ts.createProperty([], [staticModifier], name, undefined, undefined, value); // temp return ts.updateClassDeclaration( classDeclaration, classDeclaration.decorators, From be15571832a277f5a643c5484880f6469887e563 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Tue, 16 Jul 2019 15:24:30 +0800 Subject: [PATCH 11/26] p --- ...react-js-make-props-and-state-transform.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 9756e62..29f87e0 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -67,20 +67,19 @@ function visitReactClassDeclaration( if (shouldMakeStateTypeDeclaration) allTypeDeclarations.push(stateTypeDeclaration); let statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); - // statements = helpers.replaceItem(statements, classDeclaration, newClassDeclaration); // ? if (propertyDeclaration) { + // change modifier const _newClassStatement = ts.updateClassDeclaration( - classDeclaration, - classDeclaration.decorators, - classDeclaration.modifiers, - classDeclaration.name, - classDeclaration.typeParameters, - ts.createNodeArray(classDeclaration.heritageClauses), - ts.createNodeArray([propertyDeclaration, ...classDeclaration.members]), + newClassDeclaration, + newClassDeclaration.decorators, + newClassDeclaration.modifiers, + newClassDeclaration.name, + newClassDeclaration.typeParameters, + ts.createNodeArray(newClassDeclaration.heritageClauses), + ts.createNodeArray([propertyDeclaration, ...newClassDeclaration.members]), ); - const _statements = ts.createNodeArray(helpers.replaceItem(statements, classDeclaration, _newClassStatement)); - return ts.updateSourceFileNode(sourceFile, _statements); // temp + statements = helpers.replaceItem(statements, classDeclaration, _newClassStatement); } return ts.updateSourceFileNode(sourceFile, statements); From 272d4038eaacf685d5154bd67dd5861a1490f0c6 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Thu, 18 Jul 2019 10:45:31 +0800 Subject: [PATCH 12/26] p --- src/P.js | 10 +- src/helpers/build-prop-type-interface.ts | 102 +++++++++++++++++- ...react-js-make-props-and-state-transform.ts | 28 +++-- src/untyped-modules.d.ts | 1 - 4 files changed, 124 insertions(+), 17 deletions(-) delete mode 100644 src/untyped-modules.d.ts diff --git a/src/P.js b/src/P.js index 950751e..98a9e51 100644 --- a/src/P.js +++ b/src/P.js @@ -1,16 +1,14 @@ import * as React from 'react'; export default class MyComponent extends React.Component { + static propTypes = { + array: React.PropTypes.array, + }; constructor(props) { super(props); - this.name = 1; + this.name = []; } - state = { foo: 1, bar: 'str' }; render() { return
; } } - -MyComponent.propTypes = { - baz: React.PropTypes.string.isRequired, -}; diff --git a/src/helpers/build-prop-type-interface.ts b/src/helpers/build-prop-type-interface.ts index df0730a..d46f8e5 100644 --- a/src/helpers/build-prop-type-interface.ts +++ b/src/helpers/build-prop-type-interface.ts @@ -57,7 +57,7 @@ export function buildInterfaceFromPropTypeObjectLiteral(objectLiteral: ts.Object * * @param node React propTypes value */ -function getTypeFromReactPropTypeExpression(node: ts.Expression): ts.TypeNode { +export function getTypeFromReactPropTypeExpression(node: ts.Expression): ts.TypeNode { let result = null; if (ts.isPropertyAccessExpression(node)) { /** @@ -176,6 +176,106 @@ function getTypeFromReactPropTypeExpression(node: ts.Expression): ts.TypeNode { return result; } +// temp +export function getTypeFromPropTypeExpression(node: ts.Expression): ts.TypeNode { + let result = null; // temp + const text = node.getText(); + + if (/^\[\]$/.test(text)) { + } + + // if (/string/.test(text)) { + // result = ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + // } else if (/any/.test(text)) { + // result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + // } else if (/array/.test(text)) { + // result = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + // } else if (/bool/.test(text)) { + // result = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); + // } else if (/number/.test(text)) { + // result = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); + // } else if (/object/.test(text)) { + // result = ts.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword); + // } else if (/node/.test(text)) { + // result = ts.createTypeReferenceNode('React.ReactNode', []); + // } else if (/element/.test(text)) { + // result = ts.createTypeReferenceNode('JSX.Element', []); + // } else if (/func/.test(text)) { + // const arrayOfAny = ts.createParameter( + // [], + // [], + // ts.createToken(ts.SyntaxKind.DotDotDotToken), + // 'args', + // undefined, + // ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)), + // undefined, + // ); + // result = ts.createFunctionTypeNode([], [arrayOfAny], ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + // } + + // if (/oneOf$/.test(text)) { + // const argument = node.arguments[0]; + // if (ts.isArrayLiteralExpression(argument)) { + // if (argument.elements.every(elm => ts.isStringLiteral(elm) || ts.isNumericLiteral(elm))) { + // result = ts.createUnionTypeNode( + // (argument.elements as ts.NodeArray).map(elm => + // ts.createLiteralTypeNode(elm), + // ), + // ); + // } + // } + // } else if (/oneOfType$/.test(text)) { + // const argument = node.arguments[0]; + // if (ts.isArrayLiteralExpression(argument)) { + // result = ts.createUnionOrIntersectionTypeNode( + // ts.SyntaxKind.UnionType, + // argument.elements.map(elm => getTypeFromReactPropTypeExpression(elm)), + // ); + // } + // } else if (/arrayOf$/.test(text)) { + // const argument = node.arguments[0]; + // if (argument) { + // result = ts.createArrayTypeNode(getTypeFromReactPropTypeExpression(argument)); + // } + // } else if (/objectOf$/.test(text)) { + // const argument = node.arguments[0]; + // if (argument) { + // result = ts.createTypeLiteralNode([ + // ts.createIndexSignature( + // undefined, + // undefined, + // [ + // ts.createParameter( + // undefined, + // undefined, + // undefined, + // 'key', + // undefined, + // ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + // ), + // ], + // getTypeFromReactPropTypeExpression(argument), + // ), + // ]); + // } + // } else if (/shape$/.test(text)) { + // const argument = node.arguments[0]; + // if (ts.isObjectLiteralExpression(argument)) { + // return buildInterfaceFromPropTypeObjectLiteral(argument); + // } + // } + + /** + * customProp, + * anything others + */ + if (result === null) { + result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + } + + return result; +} + /** * Decide if node is required * @param node React propTypes member node diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 29f87e0..c9d6897 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -69,7 +69,6 @@ function visitReactClassDeclaration( let statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); if (propertyDeclaration) { - // change modifier const _newClassStatement = ts.updateClassDeclaration( newClassDeclaration, newClassDeclaration.decorators, @@ -259,7 +258,7 @@ function getInitialPropertyFromClassDeclaration( // return typeChecker.typeToTypeNode(type); // } - // Initial state in constructor + // properties in constructor const constructor = _.find(classDeclaration.members, member => member.kind === ts.SyntaxKind.Constructor) as | ts.ConstructorDeclaration | undefined; @@ -269,19 +268,30 @@ function getInitialPropertyFromClassDeclaration( if ( ts.isExpressionStatement(statement) && ts.isBinaryExpression(statement.expression) && - statement.expression.left.getText() === 'this.name' + statement.expression.left.getText().indexOf('this.') === 0 && + statement.expression.left.getText().indexOf('this.state') < 0 ) { - const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); + // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); + const match = statement.expression.left.getText().match(/[^this\.]\w+/); + const propertyName = match ? match[0] : 'something goes wrong if u see this'; + const type = typeChecker.getTypeAtLocation(statement.expression.right); + let typeNode; + + if (typeChecker.typeToString(type) === 'undefined[]') { + typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + } else { + typeNode = typeChecker.typeToTypeNode(type); + } + const propertyDeclaration = ts.createProperty( - [], - [staticModifier], - 'name', + [], // decorator + [], // modifiter + propertyName, undefined, + typeNode, undefined, - statement.expression.right, ); // temp return propertyDeclaration; - // return typeChecker.typeToTypeNode(typeChecker.getTypeAtLocation(statement.expression.right)); } } } diff --git a/src/untyped-modules.d.ts b/src/untyped-modules.d.ts deleted file mode 100644 index f187021..0000000 --- a/src/untyped-modules.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'dedent'; From a3717aa41fddcfceb5368930c93d6cee6dfa1094 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Thu, 18 Jul 2019 14:07:15 +0800 Subject: [PATCH 13/26] sp --- src/P.js | 19 +- src/index.ts | 5 +- src/transforms/react-ref-props-transform.ts | 353 ++++++++++++++++++++ 3 files changed, 366 insertions(+), 11 deletions(-) create mode 100644 src/transforms/react-ref-props-transform.ts diff --git a/src/P.js b/src/P.js index 98a9e51..39accb0 100644 --- a/src/P.js +++ b/src/P.js @@ -1,14 +1,13 @@ -import * as React from 'react'; +import React from 'react'; + +export default class RecentHistory extends React.Component { + contentRef = React.createRef(); -export default class MyComponent extends React.Component { - static propTypes = { - array: React.PropTypes.array, - }; - constructor(props) { - super(props); - this.name = []; - } render() { - return
; + return ( + +
+ + ); } } diff --git a/src/index.ts b/src/index.ts index 366e267..5dae693 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,6 +9,7 @@ import { collapseIntersectionInterfacesTransformFactoryFactory } from './transfo import { reactRemoveStaticPropTypesMemberTransformFactoryFactory } from './transforms/react-remove-static-prop-types-member-transform'; import { reactStatelessFunctionMakePropsTransformFactoryFactory } from './transforms/react-stateless-function-make-props-transform'; import { reactRemovePropTypesImportTransformFactoryFactory } from './transforms/react-remove-prop-types-import'; +import { reactRefPropsTransformFactoryFactory } from './transforms/react-ref-props-transform'; export { reactMovePropTypesToClassTransformFactoryFactory, @@ -18,17 +19,19 @@ export { reactRemovePropTypesAssignmentTransformFactoryFactory, reactRemoveStaticPropTypesMemberTransformFactoryFactory, reactRemovePropTypesImportTransformFactoryFactory, + reactRefPropsTransformFactoryFactory, compile, }; export const allTransforms = [ // reactMovePropTypesToClassTransformFactoryFactory, - reactJSMakePropsAndStateInterfaceTransformFactoryFactory, + // reactJSMakePropsAndStateInterfaceTransformFactoryFactory, // reactStatelessFunctionMakePropsTransformFactoryFactory, // collapseIntersectionInterfacesTransformFactoryFactory, // reactRemovePropTypesAssignmentTransformFactoryFactory, // reactRemoveStaticPropTypesMemberTransformFactoryFactory, // reactRemovePropTypesImportTransformFactoryFactory, + reactRefPropsTransformFactoryFactory, ]; export type TransformFactoryFactory = (typeChecker: ts.TypeChecker) => ts.TransformerFactory; diff --git a/src/transforms/react-ref-props-transform.ts b/src/transforms/react-ref-props-transform.ts new file mode 100644 index 0000000..8834987 --- /dev/null +++ b/src/transforms/react-ref-props-transform.ts @@ -0,0 +1,353 @@ +import * as ts from 'typescript'; +import * as _ from 'lodash'; +import * as helpers from '../helpers'; + +export type Factory = ts.TransformerFactory; + +/** + * @example + * Before: + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {} + * ref = React.createRef() + * + * After + * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> { + * ref = React.createRef() + * } + * + */ +export function reactRefPropsTransformFactoryFactory(typeChecker: ts.TypeChecker): Factory { + return function reactRefPropsTransformFactory(context: ts.TransformationContext) { + return function reactRefPropsTransform(sourceFile: ts.SourceFile) { + const visited = visitSourceFile(sourceFile, typeChecker); + ts.addEmitHelpers(visited, context.readEmitHelpers()); + + return visited; + }; + }; +} + +function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) { + let newSourceFile = sourceFile; + for (const statement of sourceFile.statements) { + if (ts.isClassDeclaration(statement) && helpers.isReactComponent(statement, typeChecker)) { + newSourceFile = visitReactClassDeclaration(statement, newSourceFile, typeChecker); + } + } + + return newSourceFile; +} + +function visitReactClassDeclaration( + classDeclaration: ts.ClassDeclaration, + sourceFile: ts.SourceFile, + typeChecker: ts.TypeChecker, +) { + if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { + return sourceFile; + } + + const propertyDeclaration = getRefPropertyFromClassDeclaration(classDeclaration, typeChecker); + + // const allTypeDeclarations = []; + + // let statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); + + // return ts.updateSourceFileNode(sourceFile, statements); + return sourceFile; +} + +function getNewReactClassDeclaration( + classDeclaration: ts.ClassDeclaration, + propTypeRef: ts.TypeNode, + stateTypeRef: ts.TypeNode, +) { + if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) { + return classDeclaration; + } + + const firstHeritageClause = classDeclaration.heritageClauses[0]; + + const newFirstHeritageClauseTypes = helpers.replaceItem( + firstHeritageClause.types, + firstHeritageClause.types[0], + ts.updateExpressionWithTypeArguments( + firstHeritageClause.types[0], + [propTypeRef, stateTypeRef], + firstHeritageClause.types[0].expression, + ), + ); + + const newHeritageClauses = helpers.replaceItem( + classDeclaration.heritageClauses, + firstHeritageClause, + ts.updateHeritageClause(firstHeritageClause, newFirstHeritageClauseTypes), + ); + + return ts.updateClassDeclaration( + classDeclaration, + classDeclaration.decorators, + classDeclaration.modifiers, + classDeclaration.name, + classDeclaration.typeParameters, + newHeritageClauses, + classDeclaration.members, + ); +} + +function getPropsTypeOfReactComponentClass( + classDeclaration: ts.ClassDeclaration, + sourceFile: ts.SourceFile, +): ts.TypeLiteralNode { + const staticPropTypesMember = _.find(classDeclaration.members, member => { + return ( + ts.isPropertyDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ); + }); + + if ( + staticPropTypesMember !== undefined && + ts.isPropertyDeclaration(staticPropTypesMember) && // check to satisfy type checker + staticPropTypesMember.initializer && + ts.isObjectLiteralExpression(staticPropTypesMember.initializer) + ) { + return helpers.buildInterfaceFromPropTypeObjectLiteral(staticPropTypesMember.initializer); + } + + const staticPropTypesGetterMember = _.find(classDeclaration.members, member => { + return ( + ts.isGetAccessorDeclaration(member) && + helpers.hasStaticModifier(member) && + helpers.isPropTypesMember(member, sourceFile) + ); + }); + + if ( + staticPropTypesGetterMember !== undefined && + ts.isGetAccessorDeclaration(staticPropTypesGetterMember) // check to satisfy typechecker + ) { + const returnStatement = _.find(staticPropTypesGetterMember.body!.statements, statement => + ts.isReturnStatement(statement), + ); + if ( + returnStatement !== undefined && + ts.isReturnStatement(returnStatement) && // check to satisfy typechecker + returnStatement.expression && + ts.isObjectLiteralExpression(returnStatement.expression) + ) { + return helpers.buildInterfaceFromPropTypeObjectLiteral(returnStatement.expression); + } + } + + return ts.createTypeLiteralNode([]); +} + +function getStateTypeOfReactComponentClass( + classDeclaration: ts.ClassDeclaration, + typeChecker: ts.TypeChecker, +): ts.TypeNode { + const initialState = getInitialStateFromClassDeclaration(classDeclaration, typeChecker); + const initialStateIsVoid = initialState.kind === ts.SyntaxKind.VoidKeyword; + const collectedStateTypes = getStateLookingForSetStateCalls(classDeclaration, typeChecker); + if (!collectedStateTypes.length && initialStateIsVoid) { + return ts.createTypeLiteralNode([]); + } + if (!initialStateIsVoid) { + collectedStateTypes.push(initialState); + } + + return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.IntersectionType, collectedStateTypes); +} + +/** + * Get initial state of a React component looking for state value initially set + * @param classDeclaration + * @param typeChecker + */ +function getInitialStateFromClassDeclaration( + classDeclaration: ts.ClassDeclaration, + typeChecker: ts.TypeChecker, +): ts.TypeNode { + // initial state class member + + const initialStateMember = _.find(classDeclaration.members, member => { + try { + return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'state'; + } catch (e) { + return false; + } + }); + + if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { + const type = typeChecker.getTypeAtLocation(initialStateMember.initializer)!; + + return typeChecker.typeToTypeNode(type); + } + + // Initial state in constructor + const constructor = _.find(classDeclaration.members, member => member.kind === ts.SyntaxKind.Constructor) as + | ts.ConstructorDeclaration + | undefined; + + if (constructor && constructor.body) { + for (const statement of constructor.body.statements) { + if ( + ts.isExpressionStatement(statement) && + ts.isBinaryExpression(statement.expression) && + statement.expression.left.getText() === 'this.state' + ) { + return typeChecker.typeToTypeNode(typeChecker.getTypeAtLocation(statement.expression.right)); + } + } + } + + // No initial state, fall back to void + return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); +} +/** + * Get properties within constructor + * @param classDeclaration + * @param typeChecker + */ +function getRefPropertyFromClassDeclaration( + classDeclaration: ts.ClassDeclaration, + typeChecker: ts.TypeChecker, +): ts.PropertyDeclaration | void { + // initial state class member + + const initialStateMember = _.find(classDeclaration.members, member => { + try { + if (ts.isPropertyDeclaration(member)) { + console.log(`menber`, member.name); + console.log(`menber`, member.initializer && member.initializer.getText()); + const text = member.initializer ? member.initializer.getText() : ''; + if (/React.createRef/.test(text)) { + // createExpressionWithTypeArguments + console.log(`menber`, member.name); + const expression = (member.initializer as ts.PropertyAccessExpression).expression; + expression.forEachChild(exp => { + let a = exp; + if (ts.isIdentifier(exp) && exp.text === 'createRef') { + const newText = 'createRef'; + } + if ((exp as ts.Identifier).text === 'createRef') { + } + }); + const propertyDeclaration = ts.createProperty( + [], + expression.modifiers, + member.name, + undefined, + undefined, + expression, + ); // qwert + } + let ex = member.initializer && (member.initializer as ts.PropertyAccessExpression); + let a; + a = ts.isCallExpression(member); + a = ts.isBinaryExpression(member); + a = ts.isClassElement(member); + a = member.initializer && ts.isObjectLiteralExpression(member.initializer); + a = ts.isGetAccessorDeclaration(member); + a = ts.isPropertyAssignment(member); + a = ts.isPropertyAccessExpression(member); + } + return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'name'; // qwert + } catch (e) { + return false; + } + }); + + // if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { + // const type = typeChecker.getTypeAtLocation(initialStateMember.initializer)!; + + // return typeChecker.typeToTypeNode(type); + // } + + // properties in constructor + const constructor = _.find(classDeclaration.members, member => member.kind === ts.SyntaxKind.Constructor) as + | ts.ConstructorDeclaration + | undefined; + + if (constructor && constructor.body) { + for (const statement of constructor.body.statements) { + if ( + ts.isExpressionStatement(statement) && + ts.isBinaryExpression(statement.expression) && + statement.expression.left.getText().indexOf('this.') === 0 && + statement.expression.left.getText().indexOf('this.state') < 0 + ) { + // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); + const match = statement.expression.left.getText().match(/[^this\.]\w+/); + const propertyName = match ? match[0] : 'something goes wrong if u see this'; + const type = typeChecker.getTypeAtLocation(statement.expression.right); + let typeNode; + + if (typeChecker.typeToString(type) === 'undefined[]') { + typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + } else { + typeNode = typeChecker.typeToTypeNode(type); + } + + const propertyDeclaration = ts.createProperty( + [], // decorator + [], // modifiter + propertyName, + undefined, + typeNode, + undefined, + ); // temp + return propertyDeclaration; + } + } + } + + // No initial state, fall back to void + // return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); +} + +/** + * Look for setState() function calls to collect the state interface in a React class component + * @param classDeclaration + * @param typeChecker + */ +function getStateLookingForSetStateCalls( + classDeclaration: ts.ClassDeclaration, + typeChecker: ts.TypeChecker, +): ts.TypeNode[] { + const typeNodes: ts.TypeNode[] = []; + for (const member of classDeclaration.members) { + if (member && ts.isMethodDeclaration(member) && member.body) { + lookForSetState(member.body); + } + } + + return typeNodes; + + function lookForSetState(node: ts.Node) { + ts.forEachChild(node, lookForSetState); + if ( + ts.isExpressionStatement(node) && + ts.isCallExpression(node.expression) && + node.expression.expression.getText().match(/setState/) + ) { + const type = typeChecker.getTypeAtLocation(node.expression.arguments[0]); + typeNodes.push(typeChecker.typeToTypeNode(type)); + } + } +} + +function isStateTypeMemberEmpty(stateType: ts.TypeNode): boolean { + // Only need to handle TypeLiteralNode & IntersectionTypeNode + if (ts.isTypeLiteralNode(stateType)) { + return stateType.members.length === 0; + } + + if (!ts.isIntersectionTypeNode(stateType)) { + return true; + } + + return stateType.types.every(isStateTypeMemberEmpty); +} From 0fec99af2edecb3bfb434c79387f8f9ca017a8d5 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Tue, 23 Jul 2019 15:45:27 +0800 Subject: [PATCH 14/26] p --- .vscode/launch.json | 11 +- src/P.js | 45 ++++- src/cli.ts | 8 +- src/helpers/index.ts | 7 + src/index.ts | 16 +- ...react-js-make-props-and-state-transform.ts | 3 +- src/transforms/react-ref-props-transform.ts | 182 ++++++++++-------- ...stateless-function-make-props-transform.ts | 6 +- ssc-cdt4 | 1 + 9 files changed, 177 insertions(+), 102 deletions(-) create mode 160000 ssc-cdt4 diff --git a/.vscode/launch.json b/.vscode/launch.json index dad31a2..4365788 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,7 +6,16 @@ "request": "launch", "name": "ts", "program": "${workspaceFolder}/src/cli.ts", - "args": ["${workspaceFolder}/src/P.js", "--keep-original-files"], + "args": ["${workspaceFolder}/../ssc-cdt4/**/*.js", "--keep-original-files"], + "preLaunchTask": "build", + "outFiles": ["${workspaceFolder}/dist/**/*.js"] + }, + { + "type": "node", + "request": "launch", + "name": "ts-one", + "program": "${workspaceFolder}/src/cli.ts", + "args": ["${workspaceFolder}/../p.js", "--keep-original-files", "--print"], "preLaunchTask": "build", "outFiles": ["${workspaceFolder}/dist/**/*.js"] }, diff --git a/src/P.js b/src/P.js index 39accb0..315e744 100644 --- a/src/P.js +++ b/src/P.js @@ -1,13 +1,38 @@ -import React from 'react'; +import { CDTConsoleLogHandler, CDTELKLogHandler, eventLogHandler, appConfig } from 'cdt-core'; -export default class RecentHistory extends React.Component { - contentRef = React.createRef(); +/** + * Custom Error handler by the consumer app + * @return Object of handler functions + */ +export const consoleLogHandler = { + logError: function(message, errorCode) { + console.error(message); + }, + logWarning: function(message) { + console.warning(message); + }, + logInformation: function(message) { + console.info(message); + }, + logDebug: function(message) { + console.debug(message); + }, +}; - render() { - return ( - -
- - ); - } +/** + * Export setting variable + */ +function callBack(params) { + console.log('inside call back - app', params); + return params; } +export const cdtSettings = { + // configEndPoints:['http://localhost:8088/api/app-config','http://localhost:8088/api/rai-config'], + logHandlers: [consoleLogHandler /*, CDTELKLogHandler */], + eventLogHandler: [ + /*eventLogHandler*/ + ], + eventCallBack: '', + errorPage: 'http://localhost:8088/error-page', + logObjCallback: callBack, +}; diff --git a/src/cli.ts b/src/cli.ts index 634140a..385f158 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,5 +1,4 @@ #!/usr/bin/env node - import * as program from 'commander'; import * as glob from 'glob'; import * as fs from 'fs'; @@ -45,6 +44,7 @@ program .option('--ignore-prettier-errors', 'Ignore (but warn about) errors in Prettier', false) .option('--keep-original-files', 'Keep original files', false) .option('--keep-temporary-files', 'Keep temporary files', false) + .option('--print', 'print output to console', false) .usage('[options] ') .command('* [glob/filename...]') .action((globPatterns: string[]) => { @@ -75,8 +75,10 @@ program try { fs.copyFileSync(filePath, temporaryPath); const result = run(temporaryPath, prettierOptions, compilationOptions); - console.log('result:\n', result); - // fs.writeFileSync(newPath, result); + if (program.print) { + console.log('result:\n', result); + } + fs.writeFileSync(newPath, result); if (!program.keepOriginalFiles) { fs.unlinkSync(filePath); } diff --git a/src/helpers/index.ts b/src/helpers/index.ts index 04a2c29..2d3138a 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -67,6 +67,9 @@ export function isReactHeritageClause(clause: ts.HeritageClause) { * @param statement */ export function isReactPropTypeAssignmentStatement(statement: ts.Statement): statement is ts.ExpressionStatement { + if (ts.isExpressionStatement(statement)) { + let a = ts.isBinaryExpression(statement.expression); // debug + } return ( ts.isExpressionStatement(statement) && ts.isBinaryExpression(statement.expression) && @@ -111,6 +114,10 @@ export function isPropTypesMember(classMember: ts.ClassElement, sourceFile: ts.S * @param sourceFile */ export function getComponentName(propTypeAssignment: ts.Statement, sourceFile: ts.SourceFile) { + if (!sourceFile) { + // debug + console.log(`undefiend`); + } const text = propTypeAssignment.getText(sourceFile); return text.substr(0, text.indexOf('.')); } diff --git a/src/index.ts b/src/index.ts index 5dae693..7d97cb6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,14 +24,14 @@ export { }; export const allTransforms = [ - // reactMovePropTypesToClassTransformFactoryFactory, - // reactJSMakePropsAndStateInterfaceTransformFactoryFactory, - // reactStatelessFunctionMakePropsTransformFactoryFactory, - // collapseIntersectionInterfacesTransformFactoryFactory, - // reactRemovePropTypesAssignmentTransformFactoryFactory, - // reactRemoveStaticPropTypesMemberTransformFactoryFactory, - // reactRemovePropTypesImportTransformFactoryFactory, - reactRefPropsTransformFactoryFactory, + reactMovePropTypesToClassTransformFactoryFactory, + reactJSMakePropsAndStateInterfaceTransformFactoryFactory, + reactStatelessFunctionMakePropsTransformFactoryFactory, + collapseIntersectionInterfacesTransformFactoryFactory, + reactRemovePropTypesAssignmentTransformFactoryFactory, + reactRemoveStaticPropTypesMemberTransformFactoryFactory, + reactRemovePropTypesImportTransformFactoryFactory, + // reactRefPropsTransformFactoryFactory, // to remove ]; export type TransformFactoryFactory = (typeChecker: ts.TypeChecker) => ts.TransformerFactory; diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index c9d6897..2fc6da7 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -272,7 +272,8 @@ function getInitialPropertyFromClassDeclaration( statement.expression.left.getText().indexOf('this.state') < 0 ) { // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - const match = statement.expression.left.getText().match(/[^this\.]\w+/); + const a = statement.expression.left.getText(); + const match = statement.expression.left.getText().match(/(?!this\.)\w+$/); const propertyName = match ? match[0] : 'something goes wrong if u see this'; const type = typeChecker.getTypeAtLocation(statement.expression.right); let typeNode; diff --git a/src/transforms/react-ref-props-transform.ts b/src/transforms/react-ref-props-transform.ts index 8834987..3cb6104 100644 --- a/src/transforms/react-ref-props-transform.ts +++ b/src/transforms/react-ref-props-transform.ts @@ -48,13 +48,23 @@ function visitReactClassDeclaration( } const propertyDeclaration = getRefPropertyFromClassDeclaration(classDeclaration, typeChecker); - + const _newClassStatement = ts.updateClassDeclaration( + classDeclaration, + classDeclaration.decorators, + classDeclaration.modifiers, + classDeclaration.name, + classDeclaration.typeParameters, + ts.createNodeArray(classDeclaration.heritageClauses), + ts.createNodeArray(propertyDeclaration), + ); + let statements = helpers.replaceItem(sourceFile.statements, classDeclaration, _newClassStatement); // const allTypeDeclarations = []; // let statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); // return ts.updateSourceFileNode(sourceFile, statements); - return sourceFile; + // return sourceFile; + return ts.updateSourceFileNode(sourceFile, statements); } function getNewReactClassDeclaration( @@ -214,50 +224,66 @@ function getInitialStateFromClassDeclaration( function getRefPropertyFromClassDeclaration( classDeclaration: ts.ClassDeclaration, typeChecker: ts.TypeChecker, -): ts.PropertyDeclaration | void { +): ts.ClassElement[] { // initial state class member - - const initialStateMember = _.find(classDeclaration.members, member => { - try { - if (ts.isPropertyDeclaration(member)) { + return classDeclaration.members.map(member => { + if (ts.isPropertyDeclaration(member)) { + // console.log(`menber`, member.name); + // console.log(`menber`, member.initializer && member.initializer.getText()); + const text = member.initializer ? member.initializer.getText() : ''; + if (/React.createRef/.test(text) && member.initializer) { + // createExpressionWithTypeArguments console.log(`menber`, member.name); - console.log(`menber`, member.initializer && member.initializer.getText()); - const text = member.initializer ? member.initializer.getText() : ''; - if (/React.createRef/.test(text)) { - // createExpressionWithTypeArguments - console.log(`menber`, member.name); - const expression = (member.initializer as ts.PropertyAccessExpression).expression; - expression.forEachChild(exp => { - let a = exp; - if (ts.isIdentifier(exp) && exp.text === 'createRef') { - const newText = 'createRef'; - } - if ((exp as ts.Identifier).text === 'createRef') { - } - }); - const propertyDeclaration = ts.createProperty( - [], - expression.modifiers, - member.name, - undefined, - undefined, - expression, - ); // qwert - } - let ex = member.initializer && (member.initializer as ts.PropertyAccessExpression); - let a; - a = ts.isCallExpression(member); - a = ts.isBinaryExpression(member); - a = ts.isClassElement(member); - a = member.initializer && ts.isObjectLiteralExpression(member.initializer); - a = ts.isGetAccessorDeclaration(member); - a = ts.isPropertyAssignment(member); - a = ts.isPropertyAccessExpression(member); + const init = member.initializer; + const expression = member.initializer as ts.PropertyAccessExpression; + expression.forEachChild(exp => { + let a = exp; + if (ts.isIdentifier(exp) && exp.text === 'createRef') { + let b = exp.text; + const newText = 'createRef'; + } + if ((exp as ts.Identifier).text === 'createRef') { + } + }); + const typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); + // const expressionWidthType = ts.createExpressionWithTypeArguments([typeNode], expression) + const expressionWidthType = ts.createExpressionWithTypeArguments([typeNode], member.initializer) as any; + // const newExpression = ts.createNew(expression, undefined, undefined) + // const newExpression = ts.createNew(expression, [typeNode], [expression, expression]) + const newExpression = ts.createCall(member.initializer, [typeNode], [ts.createIdentifier('a')]); + const propertyDeclaration = ts.createProperty( + [], + member.modifiers, + member.name, + undefined, + undefined, + newExpression, + ); + // const node = ts.createSynthesizedNode(); + // const node = ts.createNode(ts.SyntaxKind.ExpressionStatement, -1, -1); + // node.flags |= ts.NodeFlags.Synthesized; + // node.expression = ts.parenthesizeExpressionForExpressionStatement(expression); + // ts.createExpressionStatement( + // ts.createCall( + // createSuper(), + // /*typeArguments*/ undefined, + // [createSpread(createIdentifier("arguments"))] + // ) + // ) + + return propertyDeclaration; } - return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'name'; // qwert - } catch (e) { - return false; + // let ex = member.initializer && (member.initializer as ts.PropertyAccessExpression); + // let a; + // a = ts.isCallExpression(member); + // a = ts.isBinaryExpression(member); + // a = ts.isClassElement(member); + // a = member.initializer && ts.isObjectLiteralExpression(member.initializer); + // a = ts.isGetAccessorDeclaration(member); + // a = ts.isPropertyAssignment(member); + // a = ts.isPropertyAccessExpression(member); } + return member; }); // if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { @@ -267,42 +293,42 @@ function getRefPropertyFromClassDeclaration( // } // properties in constructor - const constructor = _.find(classDeclaration.members, member => member.kind === ts.SyntaxKind.Constructor) as - | ts.ConstructorDeclaration - | undefined; - - if (constructor && constructor.body) { - for (const statement of constructor.body.statements) { - if ( - ts.isExpressionStatement(statement) && - ts.isBinaryExpression(statement.expression) && - statement.expression.left.getText().indexOf('this.') === 0 && - statement.expression.left.getText().indexOf('this.state') < 0 - ) { - // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - const match = statement.expression.left.getText().match(/[^this\.]\w+/); - const propertyName = match ? match[0] : 'something goes wrong if u see this'; - const type = typeChecker.getTypeAtLocation(statement.expression.right); - let typeNode; - - if (typeChecker.typeToString(type) === 'undefined[]') { - typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - } else { - typeNode = typeChecker.typeToTypeNode(type); - } - - const propertyDeclaration = ts.createProperty( - [], // decorator - [], // modifiter - propertyName, - undefined, - typeNode, - undefined, - ); // temp - return propertyDeclaration; - } - } - } + // const constructor = _.find(classDeclaration.members, member => member.kind === ts.SyntaxKind.Constructor) as + // | ts.ConstructorDeclaration + // | undefined; + + // if (constructor && constructor.body) { + // for (const statement of constructor.body.statements) { + // if ( + // ts.isExpressionStatement(statement) && + // ts.isBinaryExpression(statement.expression) && + // statement.expression.left.getText().indexOf('this.') === 0 && + // statement.expression.left.getText().indexOf('this.state') < 0 + // ) { + // // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); + // const match = statement.expression.left.getText().match(/[^this\.]\w+/); + // const propertyName = match ? match[0] : 'something goes wrong if u see this'; + // const type = typeChecker.getTypeAtLocation(statement.expression.right); + // let typeNode; + + // if (typeChecker.typeToString(type) === 'undefined[]') { + // typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + // } else { + // typeNode = typeChecker.typeToTypeNode(type); + // } + + // const propertyDeclaration = ts.createProperty( + // [], // decorator + // [], // modifiter + // propertyName, + // undefined, + // typeNode, + // undefined, + // ); // temp + // return propertyDeclaration; + // } + // } + // } // No initial state, fall back to void // return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); diff --git a/src/transforms/react-stateless-function-make-props-transform.ts b/src/transforms/react-stateless-function-make-props-transform.ts index 0222cec..af513db 100644 --- a/src/transforms/react-stateless-function-make-props-transform.ts +++ b/src/transforms/react-stateless-function-make-props-transform.ts @@ -54,9 +54,13 @@ function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) const componentName = helpers.getComponentName(propTypeAssignment, newSourceFile); const funcComponent = (_.find(newSourceFile.statements, s => { + const getText = () => { + const name = ts.isVariableStatement(s) && s.declarationList.declarations[0].name; + return (name as ts.Identifier).text || (name as ts.BindingName).getText(); + }; return ( (ts.isFunctionDeclaration(s) && s.name !== undefined && s.name.getText() === componentName) || - (ts.isVariableStatement(s) && s.declarationList.declarations[0].name.getText() === componentName) + (ts.isVariableStatement(s) && getText() === componentName) ); }) as {}) as ts.FunctionDeclaration | ts.VariableStatement; // Type weirdness diff --git a/ssc-cdt4 b/ssc-cdt4 new file mode 160000 index 0000000..9f2e1d5 --- /dev/null +++ b/ssc-cdt4 @@ -0,0 +1 @@ +Subproject commit 9f2e1d571a73bad617ff6403abcd92c72bdb9015 From b7b54895f7e275547c359aabbca1c97db4b5db84 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Wed, 24 Jul 2019 11:14:29 +0800 Subject: [PATCH 15/26] p --- src/P.js | 38 -------------------------------------- src/helpers/index.ts | 3 --- ssc-cdt4 | 1 - 3 files changed, 42 deletions(-) delete mode 100644 src/P.js delete mode 160000 ssc-cdt4 diff --git a/src/P.js b/src/P.js deleted file mode 100644 index 315e744..0000000 --- a/src/P.js +++ /dev/null @@ -1,38 +0,0 @@ -import { CDTConsoleLogHandler, CDTELKLogHandler, eventLogHandler, appConfig } from 'cdt-core'; - -/** - * Custom Error handler by the consumer app - * @return Object of handler functions - */ -export const consoleLogHandler = { - logError: function(message, errorCode) { - console.error(message); - }, - logWarning: function(message) { - console.warning(message); - }, - logInformation: function(message) { - console.info(message); - }, - logDebug: function(message) { - console.debug(message); - }, -}; - -/** - * Export setting variable - */ -function callBack(params) { - console.log('inside call back - app', params); - return params; -} -export const cdtSettings = { - // configEndPoints:['http://localhost:8088/api/app-config','http://localhost:8088/api/rai-config'], - logHandlers: [consoleLogHandler /*, CDTELKLogHandler */], - eventLogHandler: [ - /*eventLogHandler*/ - ], - eventCallBack: '', - errorPage: 'http://localhost:8088/error-page', - logObjCallback: callBack, -}; diff --git a/src/helpers/index.ts b/src/helpers/index.ts index 2d3138a..bd4f1b2 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -67,9 +67,6 @@ export function isReactHeritageClause(clause: ts.HeritageClause) { * @param statement */ export function isReactPropTypeAssignmentStatement(statement: ts.Statement): statement is ts.ExpressionStatement { - if (ts.isExpressionStatement(statement)) { - let a = ts.isBinaryExpression(statement.expression); // debug - } return ( ts.isExpressionStatement(statement) && ts.isBinaryExpression(statement.expression) && diff --git a/ssc-cdt4 b/ssc-cdt4 deleted file mode 160000 index 9f2e1d5..0000000 --- a/ssc-cdt4 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9f2e1d571a73bad617ff6403abcd92c72bdb9015 From c6a4f81697bff933a216ae938039d48ffcd1eaf4 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Wed, 24 Jul 2019 15:00:37 +0800 Subject: [PATCH 16/26] p --- .vscode/launch.json | 9 +++ ...react-js-make-props-and-state-transform.ts | 60 ++++++++++++------- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 4365788..7d5de0a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,6 +10,15 @@ "preLaunchTask": "build", "outFiles": ["${workspaceFolder}/dist/**/*.js"] }, + { + "type": "node", + "request": "launch", + "name": "ts-cdt", + "program": "${workspaceFolder}/src/cli.ts", + "args": ["${workspaceFolder}/../euf/ssc-cdt4/src/**/*.js", "--keep-original-files"], + "preLaunchTask": "build", + "outFiles": ["${workspaceFolder}/dist/**/*.js"] + }, { "type": "node", "request": "launch", diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 2fc6da7..4aa0638 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -44,7 +44,7 @@ function visitReactClassDeclaration( const stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); - const propertyDeclaration = getInitialPropertyFromClassDeclaration(classDeclaration, typeChecker); + const propertyDeclaration = getPropertiesFromClassDeclaration(classDeclaration, typeChecker); const shouldMakePropTypeDeclaration = propType.members.length > 0; const shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); @@ -56,7 +56,7 @@ function visitReactClassDeclaration( const propTypeRef = ts.createTypeReferenceNode(propTypeName, []); const stateTypeRef = ts.createTypeReferenceNode(stateTypeName, []); - const newClassDeclaration = getNewReactClassDeclaration( + let newClassDeclaration = getNewReactClassDeclaration( classDeclaration, shouldMakePropTypeDeclaration ? propTypeRef : propType, shouldMakeStateTypeDeclaration ? stateTypeRef : stateType, @@ -69,18 +69,18 @@ function visitReactClassDeclaration( let statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); if (propertyDeclaration) { - const _newClassStatement = ts.updateClassDeclaration( + newClassDeclaration = ts.updateClassDeclaration( newClassDeclaration, newClassDeclaration.decorators, newClassDeclaration.modifiers, newClassDeclaration.name, newClassDeclaration.typeParameters, ts.createNodeArray(newClassDeclaration.heritageClauses), - ts.createNodeArray([propertyDeclaration, ...newClassDeclaration.members]), + ts.createNodeArray([...propertyDeclaration, ...newClassDeclaration.members]), ); - statements = helpers.replaceItem(statements, classDeclaration, _newClassStatement); } + statements = helpers.replaceItem(statements, classDeclaration, newClassDeclaration); return ts.updateSourceFileNode(sourceFile, statements); } @@ -238,10 +238,10 @@ function getInitialStateFromClassDeclaration( * @param classDeclaration * @param typeChecker */ -function getInitialPropertyFromClassDeclaration( +function getPropertiesFromClassDeclaration( classDeclaration: ts.ClassDeclaration, typeChecker: ts.TypeChecker, -): ts.PropertyDeclaration | void { +): Array { // initial state class member // const initialStateMember = _.find(classDeclaration.members, member => { @@ -259,20 +259,31 @@ function getInitialPropertyFromClassDeclaration( // } // properties in constructor - const constructor = _.find(classDeclaration.members, member => member.kind === ts.SyntaxKind.Constructor) as - | ts.ConstructorDeclaration - | undefined; - - if (constructor && constructor.body) { - for (const statement of constructor.body.statements) { - if ( + // const functions = _.find(classDeclaration.members, member => { + // console.log(`member.kind`,member.kind, member.name) + // return member.kind === ts.SyntaxKind.Constructor || member.kind === ts.SyntaxKind.FunctionDeclaration + // }) as + // | ts.ConstructorDeclaration | ts.FunctionDeclaration | undefined; + const propertyDeclarations: Array = []; + const methods = classDeclaration.members.filter(member => { + return member.kind === ts.SyntaxKind.Constructor || member.kind === ts.SyntaxKind.MethodDeclaration; + }) as Array; + + const findThisProperties = (statements: ts.NodeArray) => { + for (const statement of statements) { + if (ts.isIfStatement(statement)) { + const thenStatementBlock = statement.thenStatement as ts.BlockLike; + const elseStatementBlock = (statement.elseStatement as ts.BlockLike) || { statements: [] }; + findThisProperties(thenStatementBlock.statements); + findThisProperties(elseStatementBlock.statements); + } else if ( ts.isExpressionStatement(statement) && ts.isBinaryExpression(statement.expression) && statement.expression.left.getText().indexOf('this.') === 0 && statement.expression.left.getText().indexOf('this.state') < 0 ) { // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - const a = statement.expression.left.getText(); + const match = statement.expression.left.getText().match(/(?!this\.)\w+$/); const propertyName = match ? match[0] : 'something goes wrong if u see this'; const type = typeChecker.getTypeAtLocation(statement.expression.right); @@ -280,6 +291,8 @@ function getInitialPropertyFromClassDeclaration( if (typeChecker.typeToString(type) === 'undefined[]') { typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + } else if (typeChecker.typeToString(type) === 'Timer') { + typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); } else { typeNode = typeChecker.typeToTypeNode(type); } @@ -291,14 +304,21 @@ function getInitialPropertyFromClassDeclaration( undefined, typeNode, undefined, - ); // temp - return propertyDeclaration; + ); + if (!propertyDeclarations.find(p => (p.name as ts.Identifier).text === propertyName)) { + propertyDeclarations.push(propertyDeclaration); + } } } - } + }; - // No initial state, fall back to void - // return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword); + methods.forEach(method => { + if (method && method.body) { + findThisProperties(method.body.statements); + } + }); + + return propertyDeclarations; } /** From d3bcc9ee44427b0fdb5650bb81ea323d2cb5ba3c Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Thu, 25 Jul 2019 14:05:51 +0800 Subject: [PATCH 17/26] sp --- .../react-js-make-props-and-state-transform.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 4aa0638..a81a6f9 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -50,8 +50,19 @@ function visitReactClassDeclaration( const shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); const propTypeName = `I${className}Props`; const stateTypeName = `${className}State`; + + // qwert + // const elementTypeNode = ts.createNode(ts.SyntaxKind.ExpressionWithTypeArguments) + const typeExpression = ts.createPropertyAccess(ts.createIdentifier('React'), 'HTMLAttributes'); + // elementTypeNode.expression = ts.createPropertyAccess(ts.createIdentifier("React"), "HTMLAttributes") + const elementTypeReference = ts.createTypeReferenceNode('Element', []) as ts.TypeNode; + // const elementTypeNode = typeChecker.typeToTypeNode(elementTypeReference) + const html = ts.createExpressionWithTypeArguments([elementTypeReference], typeExpression); + const herit = ts.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [html]); + // const propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); - const propTypeDeclaration = ts.createInterfaceDeclaration([], [], propTypeName, [], [], propType.members); + const propInterfaceDeclaration = ts.createInterfaceDeclaration([], [], propTypeName, [], [herit], propType.members); + const stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType); const propTypeRef = ts.createTypeReferenceNode(propTypeName, []); const stateTypeRef = ts.createTypeReferenceNode(stateTypeName, []); @@ -63,7 +74,7 @@ function visitReactClassDeclaration( ); const allTypeDeclarations = []; - if (shouldMakePropTypeDeclaration) allTypeDeclarations.push(propTypeDeclaration); + if (shouldMakePropTypeDeclaration) allTypeDeclarations.push(propInterfaceDeclaration); if (shouldMakeStateTypeDeclaration) allTypeDeclarations.push(stateTypeDeclaration); let statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); From 386bb9ee6666942ee4e2f1c3879b2b323bd1222e Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Fri, 26 Jul 2019 13:17:58 +0800 Subject: [PATCH 18/26] p --- ...react-js-make-props-and-state-transform.ts | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index a81a6f9..6a299c3 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -50,18 +50,15 @@ function visitReactClassDeclaration( const shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); const propTypeName = `I${className}Props`; const stateTypeName = `${className}State`; - - // qwert - // const elementTypeNode = ts.createNode(ts.SyntaxKind.ExpressionWithTypeArguments) - const typeExpression = ts.createPropertyAccess(ts.createIdentifier('React'), 'HTMLAttributes'); - // elementTypeNode.expression = ts.createPropertyAccess(ts.createIdentifier("React"), "HTMLAttributes") - const elementTypeReference = ts.createTypeReferenceNode('Element', []) as ts.TypeNode; - // const elementTypeNode = typeChecker.typeToTypeNode(elementTypeReference) - const html = ts.createExpressionWithTypeArguments([elementTypeReference], typeExpression); - const herit = ts.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [html]); - - // const propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType); - const propInterfaceDeclaration = ts.createInterfaceDeclaration([], [], propTypeName, [], [herit], propType.members); + const interfaceHeritageClause = createInterfaceHeritageClause(); + const propInterfaceDeclaration = ts.createInterfaceDeclaration( + [], + [], + propTypeName, + [], + [interfaceHeritageClause], + propType.members, + ); const stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType); const propTypeRef = ts.createTypeReferenceNode(propTypeName, []); @@ -279,12 +276,15 @@ function getPropertiesFromClassDeclaration( const methods = classDeclaration.members.filter(member => { return member.kind === ts.SyntaxKind.Constructor || member.kind === ts.SyntaxKind.MethodDeclaration; }) as Array; + const memberNames = classDeclaration.members.map(member => { + return member.name ? member.name.getText() : ''; + }); - const findThisProperties = (statements: ts.NodeArray) => { + const findThisProperties = (statements: ts.NodeArray = [] as any) => { for (const statement of statements) { if (ts.isIfStatement(statement)) { - const thenStatementBlock = statement.thenStatement as ts.BlockLike; - const elseStatementBlock = (statement.elseStatement as ts.BlockLike) || { statements: [] }; + const thenStatementBlock = (statement.thenStatement as ts.BlockLike) || {}; + const elseStatementBlock = (statement.elseStatement as ts.BlockLike) || {}; findThisProperties(thenStatementBlock.statements); findThisProperties(elseStatementBlock.statements); } else if ( @@ -295,12 +295,15 @@ function getPropertiesFromClassDeclaration( ) { // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - const match = statement.expression.left.getText().match(/(?!this\.)\w+$/); + const text = statement.expression.left.getText(); + const match = text.replace(/\[.+\]/, '').match(/(?!this\.)\w+$/); const propertyName = match ? match[0] : 'something goes wrong if u see this'; const type = typeChecker.getTypeAtLocation(statement.expression.right); let typeNode; - if (typeChecker.typeToString(type) === 'undefined[]') { + if (text.indexOf('[') >= 0) { + typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + } else if (typeChecker.typeToString(type) === 'undefined[]') { typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); } else if (typeChecker.typeToString(type) === 'Timer') { typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); @@ -316,7 +319,10 @@ function getPropertiesFromClassDeclaration( typeNode, undefined, ); - if (!propertyDeclarations.find(p => (p.name as ts.Identifier).text === propertyName)) { + if ( + !memberNames.find(name => name === propertyName) && + !propertyDeclarations.find(p => (p.name as ts.Identifier).text === propertyName) + ) { propertyDeclarations.push(propertyDeclaration); } } @@ -375,3 +381,13 @@ function isStateTypeMemberEmpty(stateType: ts.TypeNode): boolean { return stateType.types.every(isStateTypeMemberEmpty); } + +/** + * interface extends React.HTMLAttributes + */ +function createInterfaceHeritageClause() { + const expression = ts.createPropertyAccess(ts.createIdentifier('React'), 'HTMLAttributes'); + const typeReference = ts.createTypeReferenceNode('Element', []); + const expressionWithTypeArguments = ts.createExpressionWithTypeArguments([typeReference], expression); + return ts.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [expressionWithTypeArguments]); +} From 57c327021751f362314846229a34671c262e62e6 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Sat, 27 Jul 2019 12:27:31 +0800 Subject: [PATCH 19/26] p --- ...react-js-make-props-and-state-transform.ts | 43 ++++++++++--------- ...eact-move-prop-types-to-class-transform.ts | 2 +- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 6a299c3..a613716 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -277,7 +277,7 @@ function getPropertiesFromClassDeclaration( return member.kind === ts.SyntaxKind.Constructor || member.kind === ts.SyntaxKind.MethodDeclaration; }) as Array; const memberNames = classDeclaration.members.map(member => { - return member.name ? member.name.getText() : ''; + return member.name ? (member.name as ts.Identifier).text : ''; }); const findThisProperties = (statements: ts.NodeArray = [] as any) => { @@ -298,31 +298,32 @@ function getPropertiesFromClassDeclaration( const text = statement.expression.left.getText(); const match = text.replace(/\[.+\]/, '').match(/(?!this\.)\w+$/); const propertyName = match ? match[0] : 'something goes wrong if u see this'; - const type = typeChecker.getTypeAtLocation(statement.expression.right); - let typeNode; - - if (text.indexOf('[') >= 0) { - typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); - } else if (typeChecker.typeToString(type) === 'undefined[]') { - typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - } else if (typeChecker.typeToString(type) === 'Timer') { - typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); - } else { - typeNode = typeChecker.typeToTypeNode(type); - } - const propertyDeclaration = ts.createProperty( - [], // decorator - [], // modifiter - propertyName, - undefined, - typeNode, - undefined, - ); if ( !memberNames.find(name => name === propertyName) && !propertyDeclarations.find(p => (p.name as ts.Identifier).text === propertyName) ) { + const type = typeChecker.getTypeAtLocation(statement.expression.right); + let typeNode; + + if (text.indexOf('[') >= 0) { + typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + } else if (typeChecker.typeToString(type) === 'undefined[]') { + typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + } else if (typeChecker.typeToString(type) === 'Timer') { + typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); + } else { + typeNode = typeChecker.typeToTypeNode(type); + } + + const propertyDeclaration = ts.createProperty( + [], // decorator + [], // modifiter + propertyName, + undefined, + typeNode, + undefined, + ); propertyDeclarations.push(propertyDeclaration); } } diff --git a/src/transforms/react-move-prop-types-to-class-transform.ts b/src/transforms/react-move-prop-types-to-class-transform.ts index 27a0b2e..d954a11 100644 --- a/src/transforms/react-move-prop-types-to-class-transform.ts +++ b/src/transforms/react-move-prop-types-to-class-transform.ts @@ -87,7 +87,7 @@ function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) */ function addStaticMemberToClass(classDeclaration: ts.ClassDeclaration, name: string, value: ts.Expression) { const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - const propertyDeclaration = ts.createProperty([], [staticModifier], name, undefined, undefined, value); // temp + const propertyDeclaration = ts.createProperty([], [staticModifier], name, undefined, undefined, value); return ts.updateClassDeclaration( classDeclaration, classDeclaration.decorators, From 44fccd3728c4e552734c07ff9404b8668847fcdb Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Sat, 27 Jul 2019 13:17:32 +0800 Subject: [PATCH 20/26] p --- ...react-js-make-props-and-state-transform.ts | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index a613716..4b6e7a8 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -274,8 +274,13 @@ function getPropertiesFromClassDeclaration( // | ts.ConstructorDeclaration | ts.FunctionDeclaration | undefined; const propertyDeclarations: Array = []; const methods = classDeclaration.members.filter(member => { - return member.kind === ts.SyntaxKind.Constructor || member.kind === ts.SyntaxKind.MethodDeclaration; - }) as Array; + if (ts.isPropertyDeclaration(member) && member.initializer && ts.isArrowFunction(member.initializer)) { + return true; + } else if (member.kind === ts.SyntaxKind.Constructor || member.kind === ts.SyntaxKind.MethodDeclaration) { + return true; + } + return false; + }) as Array; const memberNames = classDeclaration.members.map(member => { return member.name ? (member.name as ts.Identifier).text : ''; }); @@ -330,11 +335,13 @@ function getPropertiesFromClassDeclaration( } }; - methods.forEach(method => { - if (method && method.body) { - findThisProperties(method.body.statements); - } - }); + methods + .map((method: any) => { + return method.initializer ? method.initializer.body : method.body; + }) + .forEach((body = {}) => { + findThisProperties(body.statements); + }); return propertyDeclarations; } From d216305fa5be3f79ad77c5a7dc520829ac4ff9b9 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Mon, 29 Jul 2019 15:21:34 +0800 Subject: [PATCH 21/26] sp --- ...react-js-make-props-and-state-transform.ts | 96 +++++++++++++++++-- 1 file changed, 89 insertions(+), 7 deletions(-) diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 4b6e7a8..90f8870 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -292,12 +292,7 @@ function getPropertiesFromClassDeclaration( const elseStatementBlock = (statement.elseStatement as ts.BlockLike) || {}; findThisProperties(thenStatementBlock.statements); findThisProperties(elseStatementBlock.statements); - } else if ( - ts.isExpressionStatement(statement) && - ts.isBinaryExpression(statement.expression) && - statement.expression.left.getText().indexOf('this.') === 0 && - statement.expression.left.getText().indexOf('this.state') < 0 - ) { + } else if (ts.isExpressionStatement(statement) && ts.isBinaryExpression(statement.expression)) { // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); const text = statement.expression.left.getText(); @@ -331,18 +326,65 @@ function getPropertiesFromClassDeclaration( ); propertyDeclarations.push(propertyDeclaration); } + } else if ((statement as any).expression) { + let expression = (statement as any).expression as any; + while (expression.expression) { + expression = expression.expression; + } + console.log(``); } } }; + const binaryExpression: ts.BinaryExpression[] = []; + methods .map((method: any) => { return method.initializer ? method.initializer.body : method.body; }) .forEach((body = {}) => { - findThisProperties(body.statements); + // findThisProperties(body.statements); + findBinaryExpressionStatement(body.statements, binaryExpression); }); + binaryExpression.forEach(expression => { + if (expression.left.getText().indexOf('this.') === 0 && expression.left.getText().indexOf('this.state') < 0) { + // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); + + const text = expression.left.getText(); + const match = text.replace(/\[.+\]/, '').match(/(?!this\.)\w+$/); + const propertyName = match ? match[0] : 'something goes wrong if u see this'; + + if ( + !memberNames.find(name => name === propertyName) && + !propertyDeclarations.find(p => (p.name as ts.Identifier).text === propertyName) + ) { + const type = typeChecker.getTypeAtLocation(expression.right); + let typeNode; + + if (text.indexOf('[') >= 0) { + typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + } else if (typeChecker.typeToString(type) === 'undefined[]') { + typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); + } else if (typeChecker.typeToString(type) === 'Timer') { + typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); + } else { + typeNode = typeChecker.typeToTypeNode(type); + } + + const propertyDeclaration = ts.createProperty( + [], // decorator + [], // modifiter + propertyName, + undefined, + typeNode, + undefined, + ); + propertyDeclarations.push(propertyDeclaration); + } + } + }); + return propertyDeclarations; } @@ -399,3 +441,43 @@ function createInterfaceHeritageClause() { const expressionWithTypeArguments = ts.createExpressionWithTypeArguments([typeReference], expression); return ts.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [expressionWithTypeArguments]); } + +function findBinaryExpressionStatement( + statements: ts.NodeArray = [] as any, + result: ts.BinaryExpression[], +) { + for (const statement of statements) { + if ( + ts.isExpressionStatement(statement) && + ts.isBinaryExpression(statement.expression) && + statement.expression.left.getText().indexOf('this.') === 0 && + statement.expression.left.getText().indexOf('this.state') < 0 + ) { + result.push(statement.expression); + } else if (ts.isIfStatement(statement)) { + const thenStatementBlock = (statement.thenStatement as ts.BlockLike) || {}; + const elseStatementBlock = (statement.elseStatement as ts.BlockLike) || {}; + findBinaryExpressionStatement(thenStatementBlock.statements, result); + findBinaryExpressionStatement(elseStatementBlock.statements, result); + } else if ((statement as any).expression) { + let expression = (statement as any).expression as any; + while (expression.expression) { + expression = expression.expression; + } + if (ts.isJsxElement(expression)) { + expression.openingElement.attributes.forEachChild(node => { + const initializer = (node as ts.JsxAttribute).initializer; + if ( + initializer && + ts.isJsxExpression(initializer) && + initializer.expression && + ts.isArrowFunction(initializer.expression) && + ts.isBinaryExpression(initializer.expression.body) + ) { + result.push(initializer.expression.body); + } + }); + } + } + } +} From 5dadbb1ffdb869eb72f33759d88005b18eb06e0d Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Tue, 30 Jul 2019 14:12:12 +0800 Subject: [PATCH 22/26] p --- ...react-js-make-props-and-state-transform.ts | 189 ++++++------------ 1 file changed, 62 insertions(+), 127 deletions(-) diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 90f8870..9cd93be 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -40,7 +40,7 @@ function visitReactClassDeclaration( return sourceFile; } const className = classDeclaration && classDeclaration.name && classDeclaration.name.getText(sourceFile); - const propType = getPropsTypeOfReactComponentClass(classDeclaration, sourceFile); + const propType = getPropsTypeOfReactComponentClass(classDeclaration, sourceFile); // qwert const stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); @@ -250,110 +250,29 @@ function getPropertiesFromClassDeclaration( classDeclaration: ts.ClassDeclaration, typeChecker: ts.TypeChecker, ): Array { - // initial state class member - - // const initialStateMember = _.find(classDeclaration.members, member => { - // try { - // return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'name'; - // } catch (e) { - // return false; - // } - // }); - // if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { // const type = typeChecker.getTypeAtLocation(initialStateMember.initializer)!; // return typeChecker.typeToTypeNode(type); // } - // properties in constructor - // const functions = _.find(classDeclaration.members, member => { - // console.log(`member.kind`,member.kind, member.name) - // return member.kind === ts.SyntaxKind.Constructor || member.kind === ts.SyntaxKind.FunctionDeclaration - // }) as - // | ts.ConstructorDeclaration | ts.FunctionDeclaration | undefined; const propertyDeclarations: Array = []; - const methods = classDeclaration.members.filter(member => { - if (ts.isPropertyDeclaration(member) && member.initializer && ts.isArrowFunction(member.initializer)) { - return true; - } else if (member.kind === ts.SyntaxKind.Constructor || member.kind === ts.SyntaxKind.MethodDeclaration) { - return true; - } - return false; - }) as Array; const memberNames = classDeclaration.members.map(member => { return member.name ? (member.name as ts.Identifier).text : ''; }); - const findThisProperties = (statements: ts.NodeArray = [] as any) => { - for (const statement of statements) { - if (ts.isIfStatement(statement)) { - const thenStatementBlock = (statement.thenStatement as ts.BlockLike) || {}; - const elseStatementBlock = (statement.elseStatement as ts.BlockLike) || {}; - findThisProperties(thenStatementBlock.statements); - findThisProperties(elseStatementBlock.statements); - } else if (ts.isExpressionStatement(statement) && ts.isBinaryExpression(statement.expression)) { - // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - - const text = statement.expression.left.getText(); - const match = text.replace(/\[.+\]/, '').match(/(?!this\.)\w+$/); - const propertyName = match ? match[0] : 'something goes wrong if u see this'; - - if ( - !memberNames.find(name => name === propertyName) && - !propertyDeclarations.find(p => (p.name as ts.Identifier).text === propertyName) - ) { - const type = typeChecker.getTypeAtLocation(statement.expression.right); - let typeNode; - - if (text.indexOf('[') >= 0) { - typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); - } else if (typeChecker.typeToString(type) === 'undefined[]') { - typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - } else if (typeChecker.typeToString(type) === 'Timer') { - typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); - } else { - typeNode = typeChecker.typeToTypeNode(type); - } - - const propertyDeclaration = ts.createProperty( - [], // decorator - [], // modifiter - propertyName, - undefined, - typeNode, - undefined, - ); - propertyDeclarations.push(propertyDeclaration); - } - } else if ((statement as any).expression) { - let expression = (statement as any).expression as any; - while (expression.expression) { - expression = expression.expression; - } - console.log(``); - } - } - }; - - const binaryExpression: ts.BinaryExpression[] = []; - - methods - .map((method: any) => { - return method.initializer ? method.initializer.body : method.body; - }) - .forEach((body = {}) => { - // findThisProperties(body.statements); - findBinaryExpressionStatement(body.statements, binaryExpression); - }); + const binaryExpression = filter(classDeclaration.members, node => { + return ts.isBinaryExpression(node); + }); binaryExpression.forEach(expression => { - if (expression.left.getText().indexOf('this.') === 0 && expression.left.getText().indexOf('this.state') < 0) { - // const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword); - - const text = expression.left.getText(); + const text = expression.left.getText(); + if (text.indexOf('this.') === 0 && text.indexOf('this.state') < 0 && text.indexOf('(') < 0) { const match = text.replace(/\[.+\]/, '').match(/(?!this\.)\w+$/); - const propertyName = match ? match[0] : 'something goes wrong if u see this'; + if (!match) { + throw 'fail to analyze propertyName: ' + text; + } + const propertyName = match[0]; if ( !memberNames.find(name => name === propertyName) && @@ -364,6 +283,8 @@ function getPropertiesFromClassDeclaration( if (text.indexOf('[') >= 0) { typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); + } else if (typeChecker.typeToString(type) === 'ReactNode') { + typeNode = ts.createTypeReferenceNode('React.ReactNode', []); } else if (typeChecker.typeToString(type) === 'undefined[]') { typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); } else if (typeChecker.typeToString(type) === 'Timer') { @@ -442,42 +363,56 @@ function createInterfaceHeritageClause() { return ts.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [expressionWithTypeArguments]); } -function findBinaryExpressionStatement( - statements: ts.NodeArray = [] as any, - result: ts.BinaryExpression[], -) { - for (const statement of statements) { - if ( - ts.isExpressionStatement(statement) && - ts.isBinaryExpression(statement.expression) && - statement.expression.left.getText().indexOf('this.') === 0 && - statement.expression.left.getText().indexOf('this.state') < 0 - ) { - result.push(statement.expression); - } else if (ts.isIfStatement(statement)) { - const thenStatementBlock = (statement.thenStatement as ts.BlockLike) || {}; - const elseStatementBlock = (statement.elseStatement as ts.BlockLike) || {}; - findBinaryExpressionStatement(thenStatementBlock.statements, result); - findBinaryExpressionStatement(elseStatementBlock.statements, result); - } else if ((statement as any).expression) { - let expression = (statement as any).expression as any; - while (expression.expression) { - expression = expression.expression; - } - if (ts.isJsxElement(expression)) { - expression.openingElement.attributes.forEachChild(node => { - const initializer = (node as ts.JsxAttribute).initializer; - if ( - initializer && - ts.isJsxExpression(initializer) && - initializer.expression && - ts.isArrowFunction(initializer.expression) && - ts.isBinaryExpression(initializer.expression.body) - ) { - result.push(initializer.expression.body); - } - }); - } +function filter(statements: ts.Node[] | ts.NodeArray = [], callback: (node: ts.Node) => boolean) { + const result: T[] = []; + const queue: Array = _.toArray(statements); + let node: ts.Node | undefined; + + while ((node = queue.pop())) { + if (callback(node)) { + result.push(node as any); + } + + if (ts.isJsxElement(node)) { + node.openingElement.attributes.forEachChild(node => { + queue.push(node); + }); + queue.push(...node.children); + continue; + } + + if (ts.isBlock(node)) { + queue.push(...node.statements); + continue; + } + + if ((node as any).thenStatement) { + queue.push((node as any).thenStatement); + } + + if ((node as any).elseStatement) { + queue.push((node as any).elseStatement); + } + + if ((node as any).initializer) { + queue.push((node as any).initializer); + } + + if ((node as any).expression) { + queue.push((node as any).expression); + } + + if ((node as any).declarationList) { + queue.push(...(node as any).declarationList.declarations); + } + + if (ts.isCallExpression(node)) { + queue.push(...node.arguments); + } + + if ((node as any).body) { + queue.push((node as any).body); } } + return result; } From 2cdb2b22823bd875ed4023e6c0bdcbe059dad6fd Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Thu, 1 Aug 2019 14:00:45 +0800 Subject: [PATCH 23/26] p --- src/helpers/build-prop-type-interface.ts | 102 +---------------- src/helpers/index.ts | 74 ++++++++++++ ...react-js-make-props-and-state-transform.ts | 108 ++++++++---------- 3 files changed, 121 insertions(+), 163 deletions(-) diff --git a/src/helpers/build-prop-type-interface.ts b/src/helpers/build-prop-type-interface.ts index d46f8e5..0929369 100644 --- a/src/helpers/build-prop-type-interface.ts +++ b/src/helpers/build-prop-type-interface.ts @@ -85,7 +85,7 @@ export function getTypeFromReactPropTypeExpression(node: ts.Expression): ts.Type } else if (/number/.test(text)) { result = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); } else if (/object/.test(text)) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword); + result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); } else if (/node/.test(text)) { result = ts.createTypeReferenceNode('React.ReactNode', []); } else if (/element/.test(text)) { @@ -176,106 +176,6 @@ export function getTypeFromReactPropTypeExpression(node: ts.Expression): ts.Type return result; } -// temp -export function getTypeFromPropTypeExpression(node: ts.Expression): ts.TypeNode { - let result = null; // temp - const text = node.getText(); - - if (/^\[\]$/.test(text)) { - } - - // if (/string/.test(text)) { - // result = ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); - // } else if (/any/.test(text)) { - // result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); - // } else if (/array/.test(text)) { - // result = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - // } else if (/bool/.test(text)) { - // result = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); - // } else if (/number/.test(text)) { - // result = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); - // } else if (/object/.test(text)) { - // result = ts.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword); - // } else if (/node/.test(text)) { - // result = ts.createTypeReferenceNode('React.ReactNode', []); - // } else if (/element/.test(text)) { - // result = ts.createTypeReferenceNode('JSX.Element', []); - // } else if (/func/.test(text)) { - // const arrayOfAny = ts.createParameter( - // [], - // [], - // ts.createToken(ts.SyntaxKind.DotDotDotToken), - // 'args', - // undefined, - // ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)), - // undefined, - // ); - // result = ts.createFunctionTypeNode([], [arrayOfAny], ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - // } - - // if (/oneOf$/.test(text)) { - // const argument = node.arguments[0]; - // if (ts.isArrayLiteralExpression(argument)) { - // if (argument.elements.every(elm => ts.isStringLiteral(elm) || ts.isNumericLiteral(elm))) { - // result = ts.createUnionTypeNode( - // (argument.elements as ts.NodeArray).map(elm => - // ts.createLiteralTypeNode(elm), - // ), - // ); - // } - // } - // } else if (/oneOfType$/.test(text)) { - // const argument = node.arguments[0]; - // if (ts.isArrayLiteralExpression(argument)) { - // result = ts.createUnionOrIntersectionTypeNode( - // ts.SyntaxKind.UnionType, - // argument.elements.map(elm => getTypeFromReactPropTypeExpression(elm)), - // ); - // } - // } else if (/arrayOf$/.test(text)) { - // const argument = node.arguments[0]; - // if (argument) { - // result = ts.createArrayTypeNode(getTypeFromReactPropTypeExpression(argument)); - // } - // } else if (/objectOf$/.test(text)) { - // const argument = node.arguments[0]; - // if (argument) { - // result = ts.createTypeLiteralNode([ - // ts.createIndexSignature( - // undefined, - // undefined, - // [ - // ts.createParameter( - // undefined, - // undefined, - // undefined, - // 'key', - // undefined, - // ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), - // ), - // ], - // getTypeFromReactPropTypeExpression(argument), - // ), - // ]); - // } - // } else if (/shape$/.test(text)) { - // const argument = node.arguments[0]; - // if (ts.isObjectLiteralExpression(argument)) { - // return buildInterfaceFromPropTypeObjectLiteral(argument); - // } - // } - - /** - * customProp, - * anything others - */ - if (result === null) { - result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); - } - - return result; -} - /** * Decide if node is required * @param node React propTypes member node diff --git a/src/helpers/index.ts b/src/helpers/index.ts index bd4f1b2..8e45460 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -209,3 +209,77 @@ export function removeItem(collection: ArrayLike, item: T) { const index = _.indexOf(collection, item); return _.slice(collection, 0, index).concat(_.slice(collection, index + 1)); } + +/** + * + * @param statements todo + * @param callback + */ +export function filter(statements: ts.Node[] | ts.NodeArray = [], callback: (node: ts.Node) => boolean) { + const result: T[] = []; + const queue: Array = _.toArray(statements); + let node: ts.Node | undefined; + + while ((node = queue.pop())) { + if (callback(node)) { + result.push(node as any); + } + + if (ts.isJsxElement(node)) { + node.openingElement.attributes.forEachChild(child => { + queue.push(child); + }); + queue.push(...node.children); + continue; + } + + if (ts.isJsxSelfClosingElement(node)) { + node.attributes.forEachChild(child => { + queue.push(child); + }); + continue; + } + + if (ts.isBlock(node)) { + queue.push(...node.statements); + continue; + } + + if ((node as any).thenStatement) { + queue.push((node as any).thenStatement); + } + + if ((node as any).elseStatement) { + queue.push((node as any).elseStatement); + } + + if ((node as any).initializer) { + queue.push((node as any).initializer); + } + + if ((node as any).expression) { + queue.push((node as any).expression); + } + + if ((node as any).declarationList) { + queue.push(...(node as any).declarationList.declarations); + } + + if (ts.isCallExpression(node)) { + queue.push(...node.arguments); + } + + if ((node as any).body) { + queue.push((node as any).body); + } + + if ((node as any).whenTrue) { + queue.push((node as any).whenTrue); + } + + if ((node as any).whenFlase) { + queue.push((node as any).whenFlase); + } + } + return result; +} diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 9cd93be..aeecf41 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -41,23 +41,26 @@ function visitReactClassDeclaration( } const className = classDeclaration && classDeclaration.name && classDeclaration.name.getText(sourceFile); const propType = getPropsTypeOfReactComponentClass(classDeclaration, sourceFile); // qwert - + const props = getPropsOfReactComponentClass(classDeclaration, sourceFile); + const interfaceMembers = _.unionBy( + [...propType.members, ...props], + p => (p.name ? (p.name as ts.Identifier).text : ''), + ); const stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); - const propertyDeclaration = getPropertiesFromClassDeclaration(classDeclaration, typeChecker); - - const shouldMakePropTypeDeclaration = propType.members.length > 0; + const propertyDeclaration = getThisPropertiesFromClassDeclaration(classDeclaration, typeChecker); + const shouldMakePropTypeDeclaration = interfaceMembers.length > 0; const shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); const propTypeName = `I${className}Props`; const stateTypeName = `${className}State`; const interfaceHeritageClause = createInterfaceHeritageClause(); - const propInterfaceDeclaration = ts.createInterfaceDeclaration( + const propsInterfaceDeclaration = ts.createInterfaceDeclaration( [], [], propTypeName, [], [interfaceHeritageClause], - propType.members, + interfaceMembers, ); const stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType); @@ -66,12 +69,12 @@ function visitReactClassDeclaration( let newClassDeclaration = getNewReactClassDeclaration( classDeclaration, - shouldMakePropTypeDeclaration ? propTypeRef : propType, - shouldMakeStateTypeDeclaration ? stateTypeRef : stateType, + shouldMakePropTypeDeclaration ? propTypeRef : ts.createTypeLiteralNode([]), + shouldMakeStateTypeDeclaration ? stateTypeRef : ts.createTypeLiteralNode([]), ); const allTypeDeclarations = []; - if (shouldMakePropTypeDeclaration) allTypeDeclarations.push(propInterfaceDeclaration); + if (shouldMakePropTypeDeclaration) allTypeDeclarations.push(propsInterfaceDeclaration); if (shouldMakeStateTypeDeclaration) allTypeDeclarations.push(stateTypeDeclaration); let statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations); @@ -246,7 +249,7 @@ function getInitialStateFromClassDeclaration( * @param classDeclaration * @param typeChecker */ -function getPropertiesFromClassDeclaration( +function getThisPropertiesFromClassDeclaration( classDeclaration: ts.ClassDeclaration, typeChecker: ts.TypeChecker, ): Array { @@ -261,7 +264,7 @@ function getPropertiesFromClassDeclaration( return member.name ? (member.name as ts.Identifier).text : ''; }); - const binaryExpression = filter(classDeclaration.members, node => { + const binaryExpression = helpers.filter(classDeclaration.members, node => { return ts.isBinaryExpression(node); }); @@ -279,15 +282,18 @@ function getPropertiesFromClassDeclaration( !propertyDeclarations.find(p => (p.name as ts.Identifier).text === propertyName) ) { const type = typeChecker.getTypeAtLocation(expression.right); + const typeString = typeChecker.typeToString(type); let typeNode; if (text.indexOf('[') >= 0) { typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); - } else if (typeChecker.typeToString(type) === 'ReactNode') { + } else if (typeString === 'ReactNode') { typeNode = ts.createTypeReferenceNode('React.ReactNode', []); - } else if (typeChecker.typeToString(type) === 'undefined[]') { + } else if (typeString === 'undefined[]') { typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); - } else if (typeChecker.typeToString(type) === 'Timer') { + } else if (typeString === 'false' || typeString === 'true') { + typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); + } else if (typeString === 'Timer' || type.flags === ts.TypeFlags.NumberLiteral) { typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); } else { typeNode = typeChecker.typeToTypeNode(type); @@ -363,56 +369,34 @@ function createInterfaceHeritageClause() { return ts.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [expressionWithTypeArguments]); } -function filter(statements: ts.Node[] | ts.NodeArray = [], callback: (node: ts.Node) => boolean) { - const result: T[] = []; - const queue: Array = _.toArray(statements); - let node: ts.Node | undefined; - - while ((node = queue.pop())) { - if (callback(node)) { - result.push(node as any); - } +function getPropsOfReactComponentClass( // qwert + classDeclaration: ts.ClassDeclaration, + sourceFile: ts.SourceFile, +): ts.PropertySignature[] { + const variableDeclarations = helpers.filter(classDeclaration.members, node => { + return ts.isVariableDeclaration(node) && node.initializer && node.initializer.getText() === 'this.props' + ? true + : false; + }); - if (ts.isJsxElement(node)) { - node.openingElement.attributes.forEachChild(node => { - queue.push(node); + const names: string[] = []; + variableDeclarations.forEach(node => { + if ((node.name as any).elements) { + (node.name as any).elements.forEach((el: ts.BindingElement) => { + const name = (el.propertyName || el.name) as ts.Identifier; + names.push(name.text); }); - queue.push(...node.children); - continue; - } - - if (ts.isBlock(node)) { - queue.push(...node.statements); - continue; - } - - if ((node as any).thenStatement) { - queue.push((node as any).thenStatement); - } - - if ((node as any).elseStatement) { - queue.push((node as any).elseStatement); - } - - if ((node as any).initializer) { - queue.push((node as any).initializer); - } - - if ((node as any).expression) { - queue.push((node as any).expression); - } - - if ((node as any).declarationList) { - queue.push(...(node as any).declarationList.declarations); - } - - if (ts.isCallExpression(node)) { - queue.push(...node.arguments); } + }); - if ((node as any).body) { - queue.push((node as any).body); - } - } - return result; + const propsSignatures = names.map(name => { + return ts.createPropertySignature( + [], + name, + ts.createToken(ts.SyntaxKind.QuestionToken), + ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), + undefined, + ); + }); + return propsSignatures; } From 04d87502b4d78bb6b643f524a699110ea88a7a6c Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Fri, 2 Aug 2019 11:29:24 +0800 Subject: [PATCH 24/26] extract statetype --- ...react-js-make-props-and-state-transform.ts | 108 ++++++++++-------- 1 file changed, 61 insertions(+), 47 deletions(-) diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index aeecf41..157d627 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -186,17 +186,68 @@ function getStateTypeOfReactComponentClass( classDeclaration: ts.ClassDeclaration, typeChecker: ts.TypeChecker, ): ts.TypeNode { - const initialState = getInitialStateFromClassDeclaration(classDeclaration, typeChecker); - const initialStateIsVoid = initialState.kind === ts.SyntaxKind.VoidKeyword; - const collectedStateTypes = getStateLookingForSetStateCalls(classDeclaration, typeChecker); - if (!collectedStateTypes.length && initialStateIsVoid) { - return ts.createTypeLiteralNode([]); - } - if (!initialStateIsVoid) { - collectedStateTypes.push(initialState); + const members: ts.PropertySignature[] = []; + + for (const member of classDeclaration.members) { + if (member && ts.isMethodDeclaration(member) && member.body) { + const node = member.body; + const setStateArguments = helpers + .filter([node], n => { + return ts.isCallExpression(n) && + n.expression.getText().match(/\.setState/) && + n.arguments[0] && + ts.isObjectLiteralExpression(n.arguments[0]) + ? true + : false; + }) + .map(n => n.arguments[0] as ts.ObjectLiteralExpression); + + setStateArguments.forEach(arg => { + arg.properties.forEach(p => { + const name = p.name ? (p.name as ts.Identifier).text : ''; + if (name && !members.find(m => (m.name as ts.Identifier).text === name)) { + const type = typeChecker.getTypeAtLocation(p); + const member = ts.createPropertySignature( + [], + name, + ts.createToken(ts.SyntaxKind.QuestionToken), + typeChecker.typeToTypeNode(type), + undefined, + ); + members.push(member); + } + }); + }); + + const variableDeclarations = helpers.filter([node], n => { + return ts.isVariableDeclaration(n) && + n.initializer && + n.initializer.getText().match(/this\.state/) && + n.name && + (n.name as any).elements + ? true + : false; + }); + + variableDeclarations.forEach(v => { + (v.name as any).elements.forEach((el: any) => { + const name = el.name ? (el.name as ts.Identifier).text : ''; + if (name && !members.find(m => (m.name as ts.Identifier).text === name)) { + const member = ts.createPropertySignature( + [], + name, + ts.createToken(ts.SyntaxKind.QuestionToken), + ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), + undefined, + ); + members.push(member); + } + }); + }); + } } - return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.IntersectionType, collectedStateTypes); + return ts.createTypeLiteralNode(members); } /** @@ -253,12 +304,6 @@ function getThisPropertiesFromClassDeclaration( classDeclaration: ts.ClassDeclaration, typeChecker: ts.TypeChecker, ): Array { - // if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) { - // const type = typeChecker.getTypeAtLocation(initialStateMember.initializer)!; - - // return typeChecker.typeToTypeNode(type); - // } - const propertyDeclarations: Array = []; const memberNames = classDeclaration.members.map(member => { return member.name ? (member.name as ts.Identifier).text : ''; @@ -293,7 +338,7 @@ function getThisPropertiesFromClassDeclaration( typeNode = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)); } else if (typeString === 'false' || typeString === 'true') { typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); - } else if (typeString === 'Timer' || type.flags === ts.TypeFlags.NumberLiteral) { + } else if (typeString === 'Timer' || (type && type.flags === ts.TypeFlags.NumberLiteral)) { typeNode = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); } else { typeNode = typeChecker.typeToTypeNode(type); @@ -315,37 +360,6 @@ function getThisPropertiesFromClassDeclaration( return propertyDeclarations; } -/** - * Look for setState() function calls to collect the state interface in a React class component - * @param classDeclaration - * @param typeChecker - */ -function getStateLookingForSetStateCalls( - classDeclaration: ts.ClassDeclaration, - typeChecker: ts.TypeChecker, -): ts.TypeNode[] { - const typeNodes: ts.TypeNode[] = []; - for (const member of classDeclaration.members) { - if (member && ts.isMethodDeclaration(member) && member.body) { - lookForSetState(member.body); - } - } - - return typeNodes; - - function lookForSetState(node: ts.Node) { - ts.forEachChild(node, lookForSetState); - if ( - ts.isExpressionStatement(node) && - ts.isCallExpression(node.expression) && - node.expression.expression.getText().match(/setState/) - ) { - const type = typeChecker.getTypeAtLocation(node.expression.arguments[0]); - typeNodes.push(typeChecker.typeToTypeNode(type)); - } - } -} - function isStateTypeMemberEmpty(stateType: ts.TypeNode): boolean { // Only need to handle TypeLiteralNode & IntersectionTypeNode if (ts.isTypeLiteralNode(stateType)) { From c542ddd8f0cced7929579274202703d2a45b5692 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Mon, 5 Aug 2019 20:57:51 +0800 Subject: [PATCH 25/26] getInstancePropertiesFromClassDeclaration --- ...react-js-make-props-and-state-transform.ts | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 157d627..857afd5 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -48,7 +48,7 @@ function visitReactClassDeclaration( ); const stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); - const propertyDeclaration = getThisPropertiesFromClassDeclaration(classDeclaration, typeChecker); + const propertyDeclaration = getInstancePropertiesFromClassDeclaration(classDeclaration, typeChecker); const shouldMakePropTypeDeclaration = interfaceMembers.length > 0; const shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType); const propTypeName = `I${className}Props`; @@ -300,7 +300,7 @@ function getInitialStateFromClassDeclaration( * @param classDeclaration * @param typeChecker */ -function getThisPropertiesFromClassDeclaration( +function getInstancePropertiesFromClassDeclaration( classDeclaration: ts.ClassDeclaration, typeChecker: ts.TypeChecker, ): Array { @@ -308,14 +308,27 @@ function getThisPropertiesFromClassDeclaration( const memberNames = classDeclaration.members.map(member => { return member.name ? (member.name as ts.Identifier).text : ''; }); - - const binaryExpression = helpers.filter(classDeclaration.members, node => { - return ts.isBinaryExpression(node); + const expressions = helpers.filter(classDeclaration.members, node => { + return ts.isBinaryExpression(node) || ts.isPropertyAccessExpression(node); }); - binaryExpression.forEach(expression => { - const text = expression.left.getText(); - if (text.indexOf('this.') === 0 && text.indexOf('this.state') < 0 && text.indexOf('(') < 0) { + expressions.forEach((expression: ts.Expression) => { + let text = '', + type; + if (ts.isBinaryExpression(expression)) { + text = expression.left.getText(); + type = typeChecker.getTypeAtLocation(expression.right); + } else { + text = expression.getText(); + type = typeChecker.getTypeAtLocation(expression); + } + + if ( + text.indexOf('this.') === 0 && + text.indexOf('this.state') < 0 && + text.indexOf('this.props') < 0 && + text.indexOf('(') < 0 + ) { const match = text.replace(/\[.+\]/, '').match(/(?!this\.)\w+$/); if (!match) { throw 'fail to analyze propertyName: ' + text; @@ -326,7 +339,6 @@ function getThisPropertiesFromClassDeclaration( !memberNames.find(name => name === propertyName) && !propertyDeclarations.find(p => (p.name as ts.Identifier).text === propertyName) ) { - const type = typeChecker.getTypeAtLocation(expression.right); const typeString = typeChecker.typeToString(type); let typeNode; @@ -387,13 +399,14 @@ function getPropsOfReactComponentClass( // qwert classDeclaration: ts.ClassDeclaration, sourceFile: ts.SourceFile, ): ts.PropertySignature[] { + const names: string[] = []; + const variableDeclarations = helpers.filter(classDeclaration.members, node => { return ts.isVariableDeclaration(node) && node.initializer && node.initializer.getText() === 'this.props' ? true : false; }); - const names: string[] = []; variableDeclarations.forEach(node => { if ((node.name as any).elements) { (node.name as any).elements.forEach((el: ts.BindingElement) => { From 23298f896a43fc6ac90909eac430c328f01e70b0 Mon Sep 17 00:00:00 2001 From: Xiaobin Date: Tue, 6 Aug 2019 16:06:12 +0800 Subject: [PATCH 26/26] p --- src/compiler.ts | 1 + ...react-js-make-props-and-state-transform.ts | 78 +++++++++++-------- 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 4953a7c..8a7a0ea 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -72,6 +72,7 @@ export function compile( } catch (prettierError) { if (compilationOptions.ignorePrettierErrors) { console.warn(`Prettier failed for ${filePath} (ignorePrettierErrors is on):`); + console.warn(printed); console.warn(prettierError); return printed; } diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 857afd5..8488356 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -46,7 +46,7 @@ function visitReactClassDeclaration( [...propType.members, ...props], p => (p.name ? (p.name as ts.Identifier).text : ''), ); - const stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker); + const stateType = getStatesOfReactComponentClass(classDeclaration, typeChecker); const propertyDeclaration = getInstancePropertiesFromClassDeclaration(classDeclaration, typeChecker); const shouldMakePropTypeDeclaration = interfaceMembers.length > 0; @@ -182,17 +182,32 @@ function getPropsTypeOfReactComponentClass( return ts.createTypeLiteralNode([]); } -function getStateTypeOfReactComponentClass( +function getStatesOfReactComponentClass( classDeclaration: ts.ClassDeclaration, typeChecker: ts.TypeChecker, ): ts.TypeNode { const members: ts.PropertySignature[] = []; + const addMember = (name: ts.Identifier) => { + const text = name ? name.text : ''; + if (text && !members.find(m => (m.name as ts.Identifier).text === text)) { + const member = ts.createPropertySignature( + [], + text, + ts.createToken(ts.SyntaxKind.QuestionToken), + ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), + undefined, + ); + members.push(member); + } + }; for (const member of classDeclaration.members) { - if (member && ts.isMethodDeclaration(member) && member.body) { - const node = member.body; + if (member && (member as any).body) { + const node = (member as any).body; + + // argument of setState const setStateArguments = helpers - .filter([node], n => { + .filter(node, n => { return ts.isCallExpression(n) && n.expression.getText().match(/\.setState/) && n.arguments[0] && @@ -203,23 +218,13 @@ function getStateTypeOfReactComponentClass( .map(n => n.arguments[0] as ts.ObjectLiteralExpression); setStateArguments.forEach(arg => { - arg.properties.forEach(p => { - const name = p.name ? (p.name as ts.Identifier).text : ''; - if (name && !members.find(m => (m.name as ts.Identifier).text === name)) { - const type = typeChecker.getTypeAtLocation(p); - const member = ts.createPropertySignature( - [], - name, - ts.createToken(ts.SyntaxKind.QuestionToken), - typeChecker.typeToTypeNode(type), - undefined, - ); - members.push(member); - } + arg.properties.forEach((p: any) => { + addMember(p.name); }); }); - const variableDeclarations = helpers.filter([node], n => { + // varaible declaration like const { a } = this.state + const variableDeclarations = helpers.filter(node, n => { return ts.isVariableDeclaration(n) && n.initializer && n.initializer.getText().match(/this\.state/) && @@ -231,19 +236,18 @@ function getStateTypeOfReactComponentClass( variableDeclarations.forEach(v => { (v.name as any).elements.forEach((el: any) => { - const name = el.name ? (el.name as ts.Identifier).text : ''; - if (name && !members.find(m => (m.name as ts.Identifier).text === name)) { - const member = ts.createPropertySignature( - [], - name, - ts.createToken(ts.SyntaxKind.QuestionToken), - ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), - undefined, - ); - members.push(member); - } + addMember(el.name); }); }); + + // property access expresion like this.state.a + const propertyAccessExpressions = helpers.filter(node, n => { + return ts.isPropertyAccessExpression(n) && n.getText().match(/this\.state\./) ? true : false; + }); + + propertyAccessExpressions.forEach(p => { + addMember(p.name); + }); } } @@ -327,9 +331,13 @@ function getInstancePropertiesFromClassDeclaration( text.indexOf('this.') === 0 && text.indexOf('this.state') < 0 && text.indexOf('this.props') < 0 && + text.indexOf('this.setState') < 0 && text.indexOf('(') < 0 ) { - const match = text.replace(/\[.+\]/, '').match(/(?!this\.)\w+$/); + const match = text + .replace(/\[.+\]/, '') + .replace(/^this\./, '') + .match(/\w+/); if (!match) { throw 'fail to analyze propertyName: ' + text; } @@ -416,6 +424,14 @@ function getPropsOfReactComponentClass( // qwert } }); + const propertyAccessExpressions = helpers.filter(classDeclaration.members, node => { + return ts.isPropertyAccessExpression(node) && node.getText().indexOf('this.props.') === 0; + }); + + propertyAccessExpressions.forEach(node => { + names.push(node.name.text); + }); + const propsSignatures = names.map(name => { return ts.createPropertySignature( [],