├── .gitignore ├── doc ├── logo.png └── commands.png ├── spec ├── property-spec-data.ts ├── split-variable-declaration-spec-data.ts ├── stringg-spec-data.ts ├── support │ └── jasmine.json ├── access-spec-data.ts ├── support.ts ├── access-spec.ts ├── semicolon-spec.ts ├── property-spec.ts ├── stringg-spec.ts ├── split-variable-declaration-spec.ts ├── semicolon-spec-data.ts ├── language-service-spec.ts ├── arrow-function-spec-data.ts └── arrow-function-spec.ts ├── spec-env ├── property-spec-data.ts ├── package.json ├── tsconfig.json ├── stringg-spec-data.ts ├── access-spec-data.ts ├── .vscode │ └── settings.json ├── semicolon-spec-data.ts ├── arrow-function-spec-data.ts └── tslint.json ├── .vscodeignore ├── src ├── core │ ├── index.ts │ ├── stringg.ts │ ├── refactor.ts │ ├── semicolon.ts │ ├── arrow-function.ts │ ├── property.ts │ ├── access.ts │ └── split-variable-declaration.ts ├── access.ts ├── semicolon.ts ├── property.ts ├── stringg.ts ├── extract-variable.ts ├── refactor.ts ├── split-variable-declaration.ts ├── extension.ts ├── arrow-function.ts └── clever-sel.ts ├── tsconfig.json ├── .vscode ├── settings.json ├── tasks.json └── launch.json ├── tslint.json ├── README.md ├── package.json ├── LICENSE └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | ./out 2 | out/spec 3 | out/src 4 | node_modules 5 | **/*.js.map 6 | **/debug.log -------------------------------------------------------------------------------- /doc/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krizzdewizz/vscode-refactorix/HEAD/doc/logo.png -------------------------------------------------------------------------------- /doc/commands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krizzdewizz/vscode-refactorix/HEAD/doc/commands.png -------------------------------------------------------------------------------- /spec/property-spec-data.ts: -------------------------------------------------------------------------------- 1 | namespace property { 2 | class Color { 3 | rgb: string; 4 | } 5 | } -------------------------------------------------------------------------------- /spec/split-variable-declaration-spec-data.ts: -------------------------------------------------------------------------------- 1 | const a = ''; 2 | let b = () => 0; 3 | let c = true; 4 | 5 | 6 | let x = '' + a; 7 | -------------------------------------------------------------------------------- /spec-env/property-spec-data.ts: -------------------------------------------------------------------------------- 1 | namespace property { 2 | class Color { 3 | rgb: string 4 | 5 | xx = () => { 6 | // 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | typings/** 3 | out/spec/** 4 | spec/** 5 | spec-env/** 6 | src/** 7 | dist/** 8 | **/*.map 9 | .gitignore 10 | tsconfig.json 11 | tslint.json 12 | yarn.lock 13 | -------------------------------------------------------------------------------- /spec/stringg-spec-data.ts: -------------------------------------------------------------------------------- 1 | namespace stringg { 2 | const s = `my name is peace this is my hour.`; 3 | const s2 = 'my name is peace this is my hour.'; 4 | const s3 = "my name is peace this is my hour."; 5 | } -------------------------------------------------------------------------------- /spec-env/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "spec-env", 3 | "version": "1.0.0", 4 | "description": "", 5 | "author": "", 6 | "license": "ISC", 7 | "dependencies": { 8 | "tslint": "*" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /spec/support/jasmine.json: -------------------------------------------------------------------------------- 1 | { 2 | "spec_dir": "out", 3 | "spec_files": [ 4 | "**/*[sS]pec.js" 5 | ], 6 | "helpers": [ 7 | "helpers/**/*.js" 8 | ], 9 | "stopSpecOnExpectationFailure": false, 10 | "random": false 11 | } 12 | -------------------------------------------------------------------------------- /spec/access-spec-data.ts: -------------------------------------------------------------------------------- 1 | namespace access { 2 | class Color { 3 | public rgb: string; 4 | constructor(x: string) { 5 | /* */ 6 | } 7 | 8 | foo() { 9 | /* */ 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/core/index.ts: -------------------------------------------------------------------------------- 1 | export * from './arrow-function'; 2 | export * from './property'; 3 | export * from './refactor'; 4 | export * from './semicolon'; 5 | export * from './stringg'; 6 | export * from './access'; 7 | export * from './split-variable-declaration'; -------------------------------------------------------------------------------- /spec-env/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "ES5", 5 | "outDir": "out", 6 | "noLib": true, 7 | "sourceMap": true 8 | }, 9 | "exclude": [ 10 | "node_modules", 11 | "spec-env" 12 | ] 13 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": [ 7 | "es6" 8 | ], 9 | "sourceMap": true, 10 | "rootDir": "." 11 | }, 12 | "exclude": [ 13 | "node_modules", 14 | "spec-env" 15 | ] 16 | } -------------------------------------------------------------------------------- /spec-env/stringg-spec-data.ts: -------------------------------------------------------------------------------- 1 | namespace stringg { 2 | const s = `my name is peace this is my hour.`; 3 | const s2 = 'my name is peace this is my hour.'; 4 | const s3 = 'my name is peace this is my hour.'; 5 | } 6 | 7 | let s = { x: 45}; 8 | const z = 899; 9 | const b = true; 10 | const u = undefined; -------------------------------------------------------------------------------- /spec-env/access-spec-data.ts: -------------------------------------------------------------------------------- 1 | namespace access { 2 | class Color { 3 | _rgb: string; 4 | get rgb(): string { return 'this._rgb'; } 5 | set rgb(value: string) { this._rgb = value; } 6 | constructor(private x: string, y: number) { 7 | /* */ 8 | } 9 | 10 | public foo() { 11 | 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /spec/support.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | 3 | export function dump(sourceFile: ts.SourceFile) { 4 | let depth = 0; 5 | visitor(sourceFile); 6 | 7 | function visitor(node: ts.Node) { 8 | console.log(`${' '.repeat(depth)}${ts.SyntaxKind[node.kind]}`); 9 | depth++; 10 | ts.forEachChild(node, visitor); 11 | depth--; 12 | } 13 | } -------------------------------------------------------------------------------- /spec-env/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "extension.refactorix.Property.ToGetterSetter": { 4 | "singleLine": false, 5 | "prefix": "_", 6 | "explicitPublicAccess": false 7 | }, 8 | "extension.refactorix.Access.toggle": { 9 | "preferPublic": false 10 | }, 11 | "extension.refactorix.ExtractVariable": { 12 | "noSemicolon": false 13 | } 14 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | "tslint.alwaysShowRuleFailuresAsWarnings": true, 10 | "typescript.tsdk": "./node_modules/typescript/lib" // we want to use the TS server from our node_modules folder to control its version 11 | } -------------------------------------------------------------------------------- /spec/access-spec.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as ts from 'typescript'; 3 | 4 | import { toggle } from '../src/core'; 5 | 6 | describe('access-spec-data.ts', () => { 7 | 8 | const fileName = './spec/access-spec-data.ts'; 9 | const content = fs.readFileSync(fileName).toString(); 10 | const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, true); 11 | 12 | describe('toggle', () => { 13 | 14 | const changes = toggle(sourceFile, 50); // rgb member 15 | 16 | it('should find change', () => { 17 | expect(changes).toBeDefined(); 18 | }); 19 | }); 20 | }); 21 | 22 | -------------------------------------------------------------------------------- /spec/semicolon-spec.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as ts from 'typescript'; 3 | 4 | import {semicolons} from '../src/core'; 5 | 6 | describe('semicolon-spec-data.ts', () => { 7 | 8 | const fileName = './spec/semicolon-spec-data.ts'; 9 | const content = fs.readFileSync(fileName).toString(); 10 | const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, true); 11 | 12 | describe('semicolon', () => { 13 | 14 | const changes = semicolons(sourceFile, true); 15 | 16 | it('should find changes', () => { 17 | expect(changes.length).toBe(15); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /spec/property-spec.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as ts from 'typescript'; 3 | 4 | import {toGetterSetter} from '../src/core'; 5 | 6 | describe('property-spec-data.ts', () => { 7 | 8 | const fileName = './spec/property-spec-data.ts'; 9 | const content = fs.readFileSync(fileName).toString(); 10 | const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, true); 11 | 12 | describe('toGetterSetter', () => { 13 | 14 | const changes = toGetterSetter(sourceFile, 49, '', ''); 15 | 16 | it('should find change', () => { 17 | expect(changes).toBeDefined(); 18 | }); 19 | }); 20 | }); 21 | 22 | -------------------------------------------------------------------------------- /spec-env/semicolon-spec-data.ts: -------------------------------------------------------------------------------- 1 | function missingSemicolons() { 2 | 3 | interface Color { 4 | rgb: string 5 | foo() 6 | } 7 | 8 | class X { 9 | foo 10 | } 11 | 12 | do { 13 | // something 14 | } while ('') 15 | 16 | let editor: any 17 | let all: any 18 | 19 | editor.edit(builder => { 20 | all.changes.forEach(change => { 21 | change() 22 | }) 23 | }) 24 | 25 | all.changes.forEach(change => { 26 | change() 27 | }) 28 | 29 | debugger 30 | 31 | switch (all) { 32 | case 0: 33 | break 34 | } 35 | 36 | for (let x of all) { 37 | continue 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /spec/stringg-spec.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as ts from 'typescript'; 3 | 4 | import {interpolate} from '../src/core'; 5 | 6 | describe('stringg-spec-data.ts', () => { 7 | 8 | const fileName = './spec/stringg-spec-data.ts'; 9 | const content = fs.readFileSync(fileName).toString(); 10 | const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, true); 11 | 12 | describe('interpolate', () => { 13 | 14 | const changes = interpolate(sourceFile, { start: 39, length: 4 }); // name 15 | 16 | it('should find change', () => { 17 | expect(changes).toBeDefined(); 18 | expect(changes.length).toBe(1); 19 | expect(changes[0].newText).toBe('${name}'); 20 | }); 21 | }); 22 | }); 23 | 24 | -------------------------------------------------------------------------------- /spec/split-variable-declaration-spec.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as ts from 'typescript'; 3 | import { semicolons } from '../src/core'; 4 | import { splitVariableDeclaration } from '../src/core/split-variable-declaration'; 5 | 6 | 7 | describe('split-variable-declaration-spec-data.ts', () => { 8 | 9 | const fileName = './spec/split-variable-declaration-spec-data.ts'; 10 | const content = fs.readFileSync(fileName).toString(); 11 | const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, true); 12 | 13 | describe('split-variable-declaration', () => { 14 | it('should find changes', () => { 15 | expect(splitVariableDeclaration(sourceFile, undefined, { start: 7, length: 0 }, '')).not.toBeUndefined(); 16 | }); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /spec/semicolon-spec-data.ts: -------------------------------------------------------------------------------- 1 | function missingSemicolons() { 2 | 3 | interface Color { 4 | rgb: string 5 | foo() 6 | } 7 | 8 | class X { 9 | foo 10 | 11 | xxxx = () => 0 12 | 13 | arrowWithBlock = () => { 14 | // 15 | } 16 | } 17 | 18 | do { 19 | // something 20 | } while ('') 21 | 22 | let editor: any 23 | let all: any 24 | 25 | editor.edit(builder => { 26 | all.changes.forEach(change => { 27 | change() 28 | }) 29 | }) 30 | 31 | all.changes.forEach(change => { 32 | change() 33 | }) 34 | 35 | debugger 36 | 37 | switch (all) { 38 | case 0: 39 | break 40 | } 41 | 42 | for (let x of all) { 43 | continue 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/access.ts: -------------------------------------------------------------------------------- 1 | import * as vs from 'vscode'; 2 | 3 | import { toggle as coreToggle, AccessOptions } from './core'; 4 | import { changeToRange, createSourceFileFromActiveEditor } from './refactor'; 5 | 6 | export function toggle() { 7 | const source = createSourceFileFromActiveEditor(); 8 | if (!source) { 9 | return; 10 | } 11 | const editor = source.editor; 12 | const { document, selection } = editor; 13 | 14 | const options = vs.workspace.getConfiguration('extension.refactorix.Access.toggle') as AccessOptions; 15 | 16 | const changes = coreToggle(source.sourceFile, document.offsetAt(selection.start), options); 17 | if (!changes) { 18 | return; 19 | } 20 | 21 | editor.edit(builder => 22 | changes.forEach(change => builder.replace(changeToRange(document, change), change.newText))) 23 | .then(ok => { 24 | if (ok) { 25 | editor.selection = selection; 26 | } 27 | }); 28 | } 29 | -------------------------------------------------------------------------------- /src/semicolon.ts: -------------------------------------------------------------------------------- 1 | import * as vs from 'vscode'; 2 | 3 | import { semicolons as coreSemicolons } from './core'; 4 | import { createSourceFileFromActiveEditor } from './refactor'; 5 | 6 | export function semicolons(add: boolean) { 7 | const source = createSourceFileFromActiveEditor(); 8 | if (!source) { 9 | return; 10 | } 11 | 12 | const editor = source.editor; 13 | const { document, selection } = editor; 14 | 15 | const changes = coreSemicolons(source.sourceFile, add); 16 | if (changes.length === 0) { 17 | return; 18 | } 19 | 20 | editor.edit(builder => { 21 | const doIt = add 22 | ? change => builder.insert(document.positionAt(change), ';') 23 | : change => builder.replace(new vs.Range(document.positionAt(change - 1), document.positionAt(change)), ''); 24 | changes.forEach(doIt); 25 | }).then(ok => { 26 | if (ok) { 27 | editor.selection = selection; 28 | } 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /src/property.ts: -------------------------------------------------------------------------------- 1 | import * as vs from 'vscode'; 2 | 3 | import { toGetterSetter as coreToGetterSetter, GetterSetterOptions } from './core'; 4 | import { getIndentAtLine, getTabs, changeToRange, createSourceFileFromActiveEditor } from './refactor'; 5 | 6 | export function toGetterSetter() { 7 | const source = createSourceFileFromActiveEditor(); 8 | if (!source) { 9 | return; 10 | } 11 | const editor = source.editor; 12 | const { document, selection } = editor; 13 | 14 | const options = vs.workspace.getConfiguration('extension.refactorix.Property.ToGetterSetter') as GetterSetterOptions; 15 | 16 | const change = coreToGetterSetter(source.sourceFile, document.offsetAt(selection.start), getIndentAtLine(document, selection.start.line), getTabs(editor, 1), options); 17 | if (!change) { 18 | return; 19 | } 20 | 21 | editor.edit(builder => 22 | builder.replace(changeToRange(document, change), change.newText)) 23 | .then(ok => { 24 | if (ok) { 25 | editor.selection = selection; 26 | } 27 | }); 28 | } 29 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // Available variables which can be used inside of strings. 2 | // ${workspaceRoot}: the root folder of the team 3 | // ${file}: the current opened file 4 | // ${fileBasename}: the current opened file's basename 5 | // ${fileDirname}: the current opened file's dirname 6 | // ${fileExtname}: the current opened file's extension 7 | // ${cwd}: the current working directory of the spawned process 8 | 9 | // A task runner that calls a custom npm script that compiles the extension. 10 | { 11 | "version": "0.1.0", 12 | 13 | // we want to run npm 14 | "command": "npm", 15 | 16 | // the command is a shell script 17 | "isShellCommand": true, 18 | 19 | // show the output window only if unrecognized errors occur. 20 | "showOutput": "silent", 21 | 22 | // we run the custom script "compile" as defined in package.json 23 | "args": ["run", "compile", "--loglevel", "silent"], 24 | 25 | // The tsc compiler is started in watching mode 26 | "isWatching": true, 27 | 28 | // use the standard tsc in watch mode problem matcher to find compile problems in the output. 29 | "problemMatcher": "$tsc-watch" 30 | } -------------------------------------------------------------------------------- /src/stringg.ts: -------------------------------------------------------------------------------- 1 | import * as vs from 'vscode'; 2 | 3 | import { INTERPOLATE_PREFIX_LEN, interpolate as coreInterpolate } from './core'; 4 | import { changeToRange, selectionToSpan, createSourceFileFromActiveEditor } from './refactor'; 5 | 6 | export function interpolate() { 7 | const source = createSourceFileFromActiveEditor(); 8 | if (!source) { 9 | return; 10 | } 11 | const editor = source.editor; 12 | const { document, selection } = editor; 13 | 14 | const changes = coreInterpolate(source.sourceFile, selectionToSpan(document, selection)); 15 | if (!changes) { 16 | return; 17 | } 18 | 19 | editor.edit(builder => 20 | changes.forEach(change => builder.replace(changeToRange(document, change), change.newText))) 21 | .then(ok => { 22 | if (ok) { 23 | editor.selection = new vs.Selection( 24 | new vs.Position(selection.start.line, selection.start.character + INTERPOLATE_PREFIX_LEN), 25 | new vs.Position(selection.start.line, selection.end.character + INTERPOLATE_PREFIX_LEN)); 26 | } 27 | }); 28 | } 29 | -------------------------------------------------------------------------------- /spec/language-service-spec.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as ts from 'typescript'; 3 | 4 | describe('language service', () => { 5 | 6 | const fileName = 'test.ts'; 7 | 8 | const servicesHost: ts.LanguageServiceHost = { 9 | getScriptFileNames: () => [fileName], 10 | getScriptVersion: (fileName) => '1', 11 | getScriptSnapshot: (fileName) => { 12 | return ts.ScriptSnapshot.fromString(`'x'`); 13 | }, 14 | getCurrentDirectory: () => process.cwd(), 15 | getCompilationSettings: () => ({ module: ts.ModuleKind.CommonJS }), 16 | getDefaultLibFileName: (options) => ts.getDefaultLibFilePath(options), 17 | }; 18 | 19 | const services = ts.createLanguageService(servicesHost, ts.createDocumentRegistry()); 20 | 21 | xit('should find changes', () => { 22 | const def = services.getDefinitionAtPosition(fileName, 8); 23 | 24 | const td = services.getTypeDefinitionAtPosition(fileName, 8); 25 | const tc = services.getProgram().getTypeChecker(); 26 | // ts.forEachChild(services.getProgram()) 27 | 28 | console.log(JSON.stringify(td[0])); 29 | 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /spec/arrow-function-spec-data.ts: -------------------------------------------------------------------------------- 1 | function singleStatementBlockToExpression() { 2 | 3 | function nok() { 4 | 5 | let editor: any; 6 | let all: any; 7 | 8 | editor.edit(builder => { 9 | all.changes.forEach(change => { 10 | change(); 11 | }); 12 | }); 13 | 14 | all.changes.forEach(change => { 15 | change(); 16 | }); 17 | 18 | () => { 19 | return 0; 20 | }; 21 | 22 | () => { 23 | return 0 ? 1 : 0; 24 | }; 25 | 26 | function q() { 27 | () => { 28 | 0; 29 | }; 30 | } 31 | } 32 | 33 | function ok() { 34 | () => 0; 35 | 36 | () => { 37 | if (0) { 38 | // doit 39 | } 40 | }; 41 | 42 | () => { 43 | while (0) { 44 | ; 45 | } 46 | }; 47 | 48 | () => { 49 | for (; ;) { 50 | ; 51 | } 52 | }; 53 | 54 | () => { 55 | do { 56 | ; 57 | } while (0); 58 | }; 59 | } 60 | } -------------------------------------------------------------------------------- /spec-env/arrow-function-spec-data.ts: -------------------------------------------------------------------------------- 1 | function singleStatementBlockToExpression() { 2 | 3 | function nok() { 4 | 5 | let editor: any; 6 | let all: any; 7 | 8 | editor.edit(builder => { 9 | all.changes.forEach(change => { 10 | change(); 11 | }); 12 | }); 13 | 14 | all.changes.forEach(change => { 15 | change(); 16 | }); 17 | 18 | () => { 19 | return 0; 20 | }; 21 | 22 | () => { 23 | return 0 ? 1 : 0; 24 | }; 25 | 26 | function q() { 27 | () => { 28 | 0; 29 | }; 30 | } 31 | } 32 | 33 | function ok() { 34 | () => 0; 35 | 36 | () => { 37 | if (0) { 38 | // doit 39 | } 40 | }; 41 | 42 | () => { 43 | while (0) { 44 | ; 45 | } 46 | }; 47 | 48 | () => { 49 | for (; ;) { 50 | ; 51 | } 52 | }; 53 | 54 | () => { 55 | do { 56 | ; 57 | } while (0); 58 | }; 59 | } 60 | } -------------------------------------------------------------------------------- /src/extract-variable.ts: -------------------------------------------------------------------------------- 1 | import * as vs from 'vscode'; 2 | 3 | import { getIndentAtLine } from './refactor'; 4 | 5 | export interface ExtractVariableOptions { 6 | noSemicolon?: boolean; 7 | } 8 | 9 | export function extractVariable(): void { 10 | const editor = vs.window.activeTextEditor; 11 | if (!editor || editor.selection.isEmpty) { 12 | return; 13 | } 14 | 15 | const options = vs.workspace.getConfiguration('extension.refactorix.ExtractVariable') as ExtractVariableOptions; 16 | const semi = options.noSemicolon ? '' : ';'; 17 | const doc = editor.document; 18 | const sel = editor.selection; 19 | const text = doc.getText(sel); 20 | const indent = getIndentAtLine(doc, sel.start.line); 21 | const line = doc.lineAt(sel.start).lineNumber; 22 | const theVar = 'xxx'; 23 | const prefix = `${indent}const `; 24 | const allText = `${prefix}${theVar} = ${text}${semi}\n`; 25 | 26 | editor.edit(builder => { 27 | builder.insert(new vs.Position(line, 0), allText); 28 | builder.replace(sel, theVar); 29 | }).then(ok => { 30 | if (ok) { 31 | editor.selections = [ 32 | new vs.Selection(line, prefix.length, line, prefix.length + theVar.length), 33 | new vs.Selection(line + 1, sel.start.character, line + 1, sel.start.character + theVar.length)]; 34 | } 35 | }); 36 | } 37 | -------------------------------------------------------------------------------- /src/refactor.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | import * as vs from 'vscode'; 3 | 4 | import { getIndent } from './core'; 5 | 6 | export function getTabs(editor: vs.TextEditor, nTabs: number): string { 7 | return (editor.options.insertSpaces ? ' ' : '\t').repeat(Number(editor.options.tabSize) * nTabs); 8 | } 9 | 10 | export function getIndentAtLine(doc: vs.TextDocument, line: number): string { 11 | const lineText = doc.getText(new vs.Range(new vs.Position(line, 0), new vs.Position(line, 30))); 12 | return getIndent(lineText); 13 | } 14 | 15 | export function selectionToSpan(doc: vs.TextDocument, sel: vs.Selection): ts.TextSpan { 16 | return { start: doc.offsetAt(sel.start), length: doc.offsetAt(sel.end) - doc.offsetAt(sel.start) }; 17 | } 18 | 19 | export function changeToRange(doc: vs.TextDocument, change: ts.TextChange): vs.Range { 20 | return new vs.Range(doc.positionAt(change.span.start), doc.positionAt(change.span.start + change.span.length)); 21 | } 22 | 23 | export function createSourceFileFromActiveEditor(): { editor: vs.TextEditor, sourceFile: ts.SourceFile } { 24 | const editor = vs.window.activeTextEditor; 25 | if (!editor) { 26 | return undefined; 27 | } 28 | const doc = editor.document; 29 | const sourceFile = ts.createSourceFile(doc.fileName, doc.getText(), ts.ScriptTarget.Latest, true); 30 | return { editor, sourceFile }; 31 | } 32 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | { 3 | "version": "0.1.0", 4 | "configurations": [ 5 | { 6 | "name": "jasmine", 7 | "type": "node", 8 | "request": "launch", 9 | "program": "C:/Users/gigi/AppData/Roaming/npm/node_modules/jasmine/bin/jasmine.js", 10 | "stopOnEntry": false, 11 | "args": [], 12 | "cwd": "${workspaceRoot}", 13 | "preLaunchTask": null, 14 | "runtimeExecutable": "", 15 | "runtimeArgs": [ 16 | "--nolazy" 17 | ], 18 | "env": { 19 | "NODE_ENV": "development" 20 | }, 21 | "externalConsole": false, 22 | "sourceMaps": false, 23 | "outDir": null 24 | }, 25 | { 26 | "name": "Launch Extension", 27 | "type": "extensionHost", 28 | "request": "launch", 29 | "runtimeExecutable": "${execPath}", 30 | "args": [ 31 | "--extensionDevelopmentPath=${workspaceRoot}" 32 | ], 33 | "stopOnEntry": false, 34 | "sourceMaps": true, 35 | "outDir": "${workspaceRoot}/out/src", 36 | "preLaunchTask": "npm" 37 | }, 38 | { 39 | "name": "Launch Tests", 40 | "type": "extensionHost", 41 | "request": "launch", 42 | "runtimeExecutable": "${execPath}", 43 | "args": [ 44 | "--extensionDevelopmentPath=${workspaceRoot}", 45 | "--extensionTestsPath=${workspaceRoot}/out/test" 46 | ], 47 | "stopOnEntry": false, 48 | "sourceMaps": true, 49 | "outDir": "${workspaceRoot}/out/test", 50 | "preLaunchTask": "npm" 51 | } 52 | ] 53 | } -------------------------------------------------------------------------------- /src/split-variable-declaration.ts: -------------------------------------------------------------------------------- 1 | import * as vs from 'vscode'; 2 | 3 | import { splitVariableDeclaration as coreSplitVariableDeclaration } from './core'; 4 | import { getIndentAtLine, createSourceFileFromActiveEditor, selectionToSpan, changeToRange } from './refactor'; 5 | 6 | export function splitVariableDeclaration(): void { 7 | const source = createSourceFileFromActiveEditor(); 8 | if (!source) { 9 | return; 10 | } 11 | 12 | const editor = source.editor; 13 | const { document, selection } = editor; 14 | 15 | coreSplitVariableDeclaration(source.sourceFile, document, selectionToSpan(document, selection), getIndentAtLine(document, selection.start.line)).then(change => { 16 | if (!change) { 17 | return; 18 | } 19 | 20 | editor.edit(builder => builder.replace(changeToRange(document, change.change), change.change.newText)) 21 | .then(ok => { 22 | if (ok) { 23 | const sel = change.selection; 24 | if (sel) { 25 | editor.selection = new vs.Selection(document.positionAt(sel.start), document.positionAt(sel.start + sel.length)); 26 | } else { 27 | const nextLine = selection.start.line + 1; 28 | const lastCol = 10000; 29 | editor.selection = new vs.Selection(nextLine, lastCol, nextLine, lastCol); 30 | } 31 | } 32 | }); 33 | }); 34 | } 35 | -------------------------------------------------------------------------------- /src/core/stringg.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | 3 | const PREFIX = '${'; 4 | const SUFFIX = '}'; 5 | const BACKTICK = '`'; 6 | 7 | export const INTERPOLATE_PREFIX_LEN = PREFIX.length; 8 | 9 | export function interpolate(sourceFile: ts.SourceFile, range: ts.TextSpan): ts.TextChange[] { 10 | const text = sourceFile.getFullText(); 11 | let changes: ts.TextChange[]; 12 | visitor(sourceFile); 13 | return changes; 14 | 15 | function visitor(node: ts.Node) { 16 | if (node.kind === ts.SyntaxKind.StringLiteral || node.kind === ts.SyntaxKind.FirstTemplateToken) { 17 | 18 | const span = { start: node.getStart(), length: node.getEnd() - node.getStart() }; 19 | if (ts.textSpanContainsTextSpan(span, range)) { 20 | const rangeText = text.substr(range.start, range.length); 21 | const newText = PREFIX + rangeText + SUFFIX; 22 | 23 | changes = [{ span: range, newText }]; 24 | 25 | if (node.kind === ts.SyntaxKind.StringLiteral) { 26 | changes = [ 27 | ...changes, 28 | { span: { start: node.getStart(), length: BACKTICK.length }, newText: BACKTICK }, 29 | { span: { start: node.getEnd() - BACKTICK.length, length: BACKTICK.length }, newText: BACKTICK } 30 | ]; 31 | } 32 | } 33 | } 34 | 35 | if (!changes) { 36 | ts.forEachChild(node, visitor); 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /src/core/refactor.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | 3 | export interface ParseDiagnostics extends ts.SourceFile { 4 | parseDiagnostics: { 5 | messageText: string; 6 | }[]; 7 | } 8 | 9 | export function getIndent(text: string): string { 10 | let indent = ''; 11 | for (let i = 0, n = text.length; i < n; i++) { 12 | const c = text[i]; 13 | if (c === ' ' || c === '\t') { 14 | indent += c; 15 | } else { 16 | break; 17 | } 18 | } 19 | return indent; 20 | } 21 | 22 | export function findChildOfKind(node: ts.Node, kind: ts.SyntaxKind): ts.Node { 23 | return node.getChildren().find(it => it.kind === kind); 24 | } 25 | 26 | export function childrenOf(node: ts.Node): ts.Node[] { 27 | const all = []; 28 | ts.forEachChild(node, it => { 29 | all.push(it); 30 | }); 31 | return all; 32 | } 33 | 34 | export function contains(span: ts.TextSpan, pos: number): boolean { 35 | return pos >= span.start && pos <= span.start + span.length; 36 | } 37 | 38 | export function hasOverlaps(change: ts.TextChange, all: ts.TextChange[]): boolean { 39 | const start = change.span.start; 40 | const end = start + change.span.length; 41 | return all.map(it => it.span).some(it => contains(it, start) || contains(it, end)); 42 | } 43 | 44 | export function inRange(node: ts.Node, range?: ts.TextSpan): boolean { 45 | if (!range) { 46 | return true; 47 | } 48 | return node.getStart() < range.start && node.getEnd() > range.start + range.length; 49 | } 50 | 51 | export function inRangeInclusive(node: ts.Node, range?: ts.TextSpan): boolean { 52 | if (!range) { 53 | return true; 54 | } 55 | return node.getStart() <= range.start && node.getEnd() >= range.start + range.length; 56 | } 57 | -------------------------------------------------------------------------------- /spec-env/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | 4 | ], 5 | "rules": { 6 | "no-for-in": true, 7 | "no-unnecessary-field-initialization": true, 8 | "prefer-const": true, 9 | "prefer-array-literal": true, 10 | "class-name": true, 11 | "curly": true, 12 | "eofline": false, 13 | "forin": true, 14 | "indent": [ 15 | true, 16 | 4 17 | ], 18 | "label-position": true, 19 | "max-line-length": [ 20 | false, 21 | 140 22 | ], 23 | "no-arg": true, 24 | "no-bitwise": true, 25 | "no-console": [ 26 | true, 27 | "log", 28 | "debug", 29 | "info", 30 | "time", 31 | "timeEnd", 32 | "trace" 33 | ], 34 | "no-var-keyword": true, 35 | "no-construct": true, 36 | "no-debugger": true, 37 | "no-duplicate-variable": true, 38 | "no-empty": true, 39 | "no-eval": true, 40 | "no-string-literal": true, 41 | "no-trailing-whitespace": true, 42 | "no-inferrable-types": [ 43 | true 44 | ], 45 | "no-unused-expression": true, 46 | "no-use-before-declare": true, 47 | "one-line": [ 48 | true, 49 | "check-open-brace", 50 | "check-catch", 51 | "check-else", 52 | "check-whitespace" 53 | ], 54 | "no-null-keyword": true, 55 | "quotemark": [ 56 | true, 57 | "single" 58 | ], 59 | "radix": true, 60 | "semicolon": [ 61 | true 62 | ], 63 | "triple-equals": [ 64 | true, 65 | "allow-null-check" 66 | ], 67 | "variable-name": false, 68 | "whitespace": [ 69 | true, 70 | "check-branch", 71 | "check-decl", 72 | "check-operator", 73 | "check-separator", 74 | "check-type" 75 | ] 76 | } 77 | } -------------------------------------------------------------------------------- /src/core/semicolon.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | 3 | import { findChildOfKind } from './refactor'; 4 | 5 | function isArrowFunctionPropertyWithBlock(node: ts.Node): boolean { 6 | 7 | if (node.kind !== ts.SyntaxKind.PropertyDeclaration) { 8 | return false; 9 | } 10 | 11 | let found: boolean; 12 | ts.forEachChild(node, visitor); 13 | return found; 14 | 15 | function visitor(node: ts.Node) { 16 | if (node.kind === ts.SyntaxKind.ArrowFunction && findChildOfKind(node, ts.SyntaxKind.Block)) { 17 | found = true; 18 | } 19 | 20 | if (!found) { 21 | ts.forEachChild(node, visitor); 22 | } 23 | } 24 | } 25 | 26 | export function semicolons(sourceFile: ts.SourceFile, add: boolean): number[] { 27 | const changes: number[] = []; 28 | const text = sourceFile.getFullText(); 29 | visitor(sourceFile); 30 | return changes; 31 | 32 | function checkSemi(node: ts.Node) { 33 | if (isArrowFunctionPropertyWithBlock(node)) { 34 | return; 35 | } 36 | const last = text.substr(node.getEnd() - 1, 1); 37 | const semi = last === ';'; 38 | if (add && !semi || !add && semi) { 39 | changes.push(node.getEnd()); 40 | } 41 | } 42 | 43 | function visitor(node: ts.Node) { 44 | 45 | switch (node.kind) { 46 | case ts.SyntaxKind.VariableStatement: 47 | case ts.SyntaxKind.ExpressionStatement: 48 | case ts.SyntaxKind.ReturnStatement: 49 | case ts.SyntaxKind.BreakStatement: 50 | case ts.SyntaxKind.ContinueStatement: 51 | case ts.SyntaxKind.ThrowStatement: 52 | case ts.SyntaxKind.ImportDeclaration: 53 | case ts.SyntaxKind.ImportEqualsDeclaration: 54 | case ts.SyntaxKind.DoStatement: 55 | case ts.SyntaxKind.DebuggerStatement: 56 | case ts.SyntaxKind.PropertyDeclaration: 57 | checkSemi(node); 58 | break; 59 | case ts.SyntaxKind.InterfaceDeclaration: 60 | (node as ts.InterfaceDeclaration).members.forEach(checkSemi); 61 | break; 62 | } 63 | 64 | ts.forEachChild(node, visitor); 65 | } 66 | } 67 | 68 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | import { toggleSingleStatementBlockExpression, singleStatementBlockToExpression, expressionToBlock } from './arrow-function'; 4 | import { extractVariable } from './extract-variable'; 5 | import { semicolons } from './semicolon'; 6 | import { toGetterSetter } from './property'; 7 | import { interpolate } from './stringg'; 8 | import { toggle } from './access'; 9 | import { splitVariableDeclaration } from './split-variable-declaration'; 10 | import { growSelection, shrinkSelection, forgetHistory } from './clever-sel'; 11 | 12 | export function activate(context: vscode.ExtensionContext) { 13 | 14 | context.subscriptions.push( 15 | vscode.commands.registerCommand('extension.refactorix.grow-selection', growSelection), 16 | vscode.commands.registerCommand('extension.refactorix.shrink-selection', shrinkSelection), 17 | vscode.commands.registerCommand('extension.refactorix.SplitVariableDeclaration', splitVariableDeclaration), 18 | vscode.commands.registerCommand('extension.refactorix.ExtractVariable', extractVariable), 19 | vscode.commands.registerCommand('extension.refactorix.ArrowFunction.ToggleSingleStatementBlockExpression', toggleSingleStatementBlockExpression), 20 | vscode.commands.registerCommand('extension.refactorix.ArrowFunction.SingleStatementBlockToExpressionAll', () => singleStatementBlockToExpression(true)), 21 | vscode.commands.registerCommand('extension.refactorix.ArrowFunction.ExpressionToBlock', expressionToBlock), 22 | vscode.commands.registerCommand('extension.refactorix.Semicolons.Add', () => semicolons(true)), 23 | vscode.commands.registerCommand('extension.refactorix.Semicolons.Remove', () => semicolons(false)), 24 | vscode.commands.registerCommand('extension.refactorix.Property.ToGetterSetter', toGetterSetter), 25 | vscode.commands.registerCommand('extension.refactorix.String.Interpolate', interpolate), 26 | vscode.commands.registerCommand('extension.refactorix.Access.toggle', toggle), 27 | 28 | vscode.window.onDidChangeTextEditorSelection(e => { 29 | if (e.kind !== vscode.TextEditorSelectionChangeKind.Command) { 30 | forgetHistory(); 31 | } 32 | }) 33 | ); 34 | } 35 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/tslint-microsoft-contrib" 4 | ], 5 | "rules": { 6 | "no-for-in": true, 7 | "no-unnecessary-field-initialization": true, 8 | "prefer-const": true, 9 | "prefer-array-literal": true, 10 | "class-name": true, 11 | "curly": true, 12 | "eofline": false, 13 | "forin": true, 14 | "indent": [ 15 | true, 16 | 4 17 | ], 18 | "label-position": true, 19 | "max-line-length": [ 20 | false, 21 | 140 22 | ], 23 | "no-arg": true, 24 | "no-bitwise": true, 25 | "no-console": [ 26 | true, 27 | "log", 28 | "debug", 29 | "info", 30 | "time", 31 | "timeEnd", 32 | "trace" 33 | ], 34 | "no-var-keyword": true, 35 | "no-construct": true, 36 | "no-debugger": true, 37 | "no-duplicate-variable": true, 38 | "no-empty": true, 39 | "no-eval": true, 40 | "no-string-literal": true, 41 | "no-trailing-whitespace": true, 42 | "no-inferrable-types": [ 43 | true 44 | ], 45 | "no-unused-expression": true, 46 | "no-unused-variable": [ 47 | true, 48 | { 49 | "ignore-pattern": "^_" 50 | }, 51 | "check-parameters" 52 | ], 53 | "no-use-before-declare": true, 54 | "one-line": [ 55 | true, 56 | "check-open-brace", 57 | "check-catch", 58 | "check-else", 59 | "check-whitespace" 60 | ], 61 | "no-null-keyword": true, 62 | "quotemark": [ 63 | true, 64 | "single" 65 | ], 66 | "radix": true, 67 | "semicolon": [ 68 | true 69 | ], 70 | "triple-equals": [ 71 | true, 72 | "allow-null-check" 73 | ], 74 | "variable-name": false, 75 | "whitespace": [ 76 | true, 77 | "check-branch", 78 | "check-decl", 79 | "check-operator", 80 | "check-separator", 81 | "check-type" 82 | ] 83 | } 84 | } -------------------------------------------------------------------------------- /spec/arrow-function-spec.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as ts from 'typescript'; 3 | 4 | import {ParseDiagnostics, singleStatementBlockToExpressions} from '../src/core'; 5 | 6 | export function writeChanges(sourceFile: ts.SourceFile, changes: ts.TextChange[]): string { 7 | let result = sourceFile.getFullText(); 8 | for (let i = changes.length - 1; i >= 0; i--) { 9 | const change = changes[i]; 10 | const head = result.slice(0, change.span.start); 11 | const tail = result.slice(change.span.start + change.span.length); 12 | result = head + change.newText + tail; 13 | } 14 | return result; 15 | } 16 | 17 | describe('parseDiagnostics', () => { 18 | it('should have errors', () => { 19 | const noTs: ParseDiagnostics = ts.createSourceFile('x.ts', 'this is no ts', ts.ScriptTarget.Latest, true); 20 | expect(noTs.parseDiagnostics.length).toBe(3); 21 | }); 22 | }); 23 | 24 | describe('arrow-function-spec-data.ts', () => { 25 | 26 | const fileName = './spec/arrow-function-spec-data.ts'; 27 | const content = fs.readFileSync(fileName).toString(); 28 | const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, true); 29 | 30 | it('content eq', () => { 31 | expect(content).toEqual(sourceFile.getFullText()); 32 | }); 33 | 34 | describe('singleStatementBlockToExpression', () => { 35 | 36 | const changes = singleStatementBlockToExpressions(sourceFile); 37 | 38 | it('should find changes', () => { 39 | expect(changes.changes.length).toBe(5); // -1 for an overlap 40 | expect(changes.overlaps).toBeTruthy(); 41 | }); 42 | 43 | it('should write changes', () => { 44 | const newText = writeChanges(sourceFile, changes.changes); 45 | // fs.writeFileSync('./spec/arrow-function-spec-data.ts-rewritten.ts', newText); 46 | const newSource: ParseDiagnostics = ts.createSourceFile(fileName, newText, ts.ScriptTarget.Latest, true); 47 | if (newSource.parseDiagnostics.length > 0) { 48 | // console.error(`error while reparsing ${newText}`); 49 | newSource.parseDiagnostics.forEach(err => console.error(`parseDiagnostics: ${err.messageText}`)); 50 | } 51 | expect(newSource.parseDiagnostics.length).toBe(0); 52 | }); 53 | }); 54 | }); 55 | 56 | 57 | -------------------------------------------------------------------------------- /src/arrow-function.ts: -------------------------------------------------------------------------------- 1 | import { singleStatementBlockToExpressions, expressionToBlock as coreExpressionToBlock } from './core'; 2 | import { getIndentAtLine, getTabs, changeToRange, selectionToSpan, createSourceFileFromActiveEditor } from './refactor'; 3 | 4 | export function toggleSingleStatementBlockExpression() { 5 | if (!expressionToBlock()) { 6 | singleStatementBlockToExpression(false); 7 | } 8 | } 9 | 10 | export function expressionToBlock(): boolean { 11 | const source = createSourceFileFromActiveEditor(); 12 | if (!source) { 13 | return false; 14 | } 15 | const editor = source.editor; 16 | const { document, selection } = editor; 17 | 18 | const change = coreExpressionToBlock(source.sourceFile, selectionToSpan(document, selection), getIndentAtLine(document, selection.start.line), getTabs(editor, 1)); 19 | if (!change) { 20 | return false; 21 | } 22 | 23 | editor.edit(builder => builder.replace(changeToRange(document, change), change.newText)) 24 | .then(ok => { 25 | if (ok) { 26 | editor.selection = selection; 27 | } 28 | }); 29 | 30 | return true; 31 | } 32 | 33 | export function singleStatementBlockToExpression(replaceAll: boolean) { 34 | let overlapRecursionsLeft = 10; 35 | 36 | (function doIt() { 37 | const source = createSourceFileFromActiveEditor(); 38 | if (!source) { 39 | return; 40 | } 41 | const editor = source.editor; 42 | const { document, selection } = editor; 43 | 44 | const all = singleStatementBlockToExpressions(source.sourceFile, replaceAll ? undefined : selectionToSpan(document, selection)); 45 | if (all.changes.length === 0) { 46 | return; 47 | } 48 | 49 | if (!replaceAll) { 50 | all.changes = [all.changes[0]]; 51 | } 52 | 53 | editor.edit(builder => 54 | all.changes.forEach(change => builder.replace(changeToRange(document, change), change.newText))) 55 | .then(ok => { 56 | if (ok) { 57 | editor.selection = selection; 58 | if (replaceAll && all.changes.length > 1 && all.overlaps && overlapRecursionsLeft > 0) { 59 | doIt(); 60 | overlapRecursionsLeft--; 61 | } 62 | } 63 | }); 64 | })(); 65 | } 66 | -------------------------------------------------------------------------------- /src/clever-sel.ts: -------------------------------------------------------------------------------- 1 | import { createSourceFileFromActiveEditor } from './refactor'; 2 | import * as vscode from 'vscode'; 3 | import * as ts from 'typescript'; 4 | import { inRange, childrenOf } from './core/index'; 5 | import { inRangeInclusive } from './core/refactor'; 6 | 7 | let history: vscode.Selection[] = []; 8 | 9 | const WHITESPACES = { 10 | ' ': true, 11 | '\r': true, 12 | '\n': true, 13 | '\t': true 14 | }; 15 | 16 | export function forgetHistory() { 17 | history = []; 18 | } 19 | 20 | export function shrinkSelection() { 21 | if (history.length === 0) { 22 | return; 23 | } 24 | 25 | vscode.window.activeTextEditor.selection = history.pop(); 26 | } 27 | 28 | function skipWhitespace(doc: vscode.TextDocument, pos: number): vscode.Position { 29 | const text = doc.getText(); 30 | 31 | while (WHITESPACES[text[pos]]) { 32 | pos++; 33 | } 34 | 35 | return doc.positionAt(pos); 36 | } 37 | 38 | interface Elem { 39 | node: ts.Node; 40 | sel: vscode.Selection; 41 | text: string; 42 | } 43 | 44 | function nextSibling(node: ts.Node, next: boolean): ts.Node { 45 | const all = childrenOf(node.parent); 46 | const idx = all.indexOf(node); 47 | return all[idx + (next ? 1 : -1)]; 48 | } 49 | 50 | export function growSelection() { 51 | const source = createSourceFileFromActiveEditor(); 52 | if (!source) { 53 | return; 54 | } 55 | 56 | const { editor, sourceFile } = source; 57 | const doc = editor.document; 58 | const sel = editor.selection; 59 | const selStart = doc.offsetAt(sel.start); 60 | const selEnd = doc.offsetAt(sel.end); 61 | const startRange: ts.TextSpan = { start: selStart, length: 0 }; 62 | const candidates: Elem[] = []; 63 | function visitor(node: ts.Node) { 64 | 65 | if (node.getStart() > selEnd) { 66 | return; 67 | } 68 | 69 | const text = doc.getText().substring(node.getStart(), node.getEnd()); 70 | 71 | if (inRangeInclusive(node, startRange)) { 72 | candidates.push({ node, sel: makeSel(node), text }); 73 | } 74 | 75 | node.forEachChild(visitor); 76 | } 77 | 78 | function makeSel(n: ts.Node) { 79 | return new vscode.Selection(doc.positionAt(n.end), skipWhitespace(doc, n.pos)); 80 | } 81 | 82 | visitor(sourceFile); 83 | 84 | const last = candidates[candidates.length - 1]; 85 | if (!last) { 86 | return; 87 | } 88 | 89 | const editorSel = editor.selection; 90 | let prev; 91 | candidates.find(it => { 92 | if (editorSel.isEqual(it.sel)) { 93 | return true; 94 | } 95 | prev = it; 96 | return false; 97 | }); 98 | 99 | const q: Elem = prev || last; 100 | 101 | history.push(editorSel); 102 | editor.selection = q.sel; 103 | } 104 | 105 | -------------------------------------------------------------------------------- /src/core/arrow-function.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | 3 | import { findChildOfKind, childrenOf, hasOverlaps, inRange } from './refactor'; 4 | 5 | const RETURN = 'return '; 6 | const ARROW = '=>'; 7 | 8 | export function expressionToBlock(sourceFile: ts.SourceFile, range: ts.TextSpan, indent: string, tab: string): ts.TextChange { 9 | const text = sourceFile.getFullText(); 10 | let change: ts.TextChange; 11 | visitor(sourceFile); 12 | return change; 13 | 14 | function visitor(node: ts.Node) { 15 | if (node.kind === ts.SyntaxKind.ArrowFunction) { 16 | if (!findChildOfKind(node, ts.SyntaxKind.Block) && inRange(node, range)) { 17 | const nodeText = text.substring(node.getStart(), node.getEnd()); 18 | const pos = nodeText.indexOf(ARROW); 19 | const expr = nodeText.substring(pos + ARROW.length).trim(); 20 | const newText = nodeText.substring(0, pos) + ARROW + ' {\n' + indent + tab + 'return ' + expr + ';\n' + indent + '}'; 21 | change = { span: { start: node.getStart(), length: node.getEnd() - node.getStart() }, newText }; 22 | } 23 | } 24 | 25 | if (!change) { 26 | ts.forEachChild(node, visitor); 27 | } 28 | } 29 | } 30 | 31 | export function singleStatementBlockToExpressions(sourceFile: ts.SourceFile, range?: ts.TextSpan): { changes: ts.TextChange[], overlaps: boolean } { 32 | const text = sourceFile.getFullText(); 33 | const changes: ts.TextChange[] = []; 34 | let overlaps = false; 35 | visitor(sourceFile); 36 | return { changes, overlaps }; 37 | 38 | function visitor(node: ts.Node) { 39 | if (node.kind === ts.SyntaxKind.ArrowFunction) { 40 | const block = findChildOfKind(node, ts.SyntaxKind.Block); 41 | if (block) { 42 | const children = childrenOf(block); 43 | if (children.length === 1) { 44 | const first = children[0]; 45 | if ((first.kind === ts.SyntaxKind.ReturnStatement || first.kind === ts.SyntaxKind.ExpressionStatement) && inRange(node, range)) { 46 | let newText = text.substring(first.getStart(), first.getEnd()); 47 | if (newText.endsWith(';')) { 48 | newText = newText.substring(0, newText.length - 1); 49 | } 50 | if (newText.startsWith(RETURN)) { 51 | newText = newText.substring(RETURN.length); 52 | } 53 | 54 | const change = { span: { start: block.getStart(), length: block.getEnd() - block.getStart() }, newText }; 55 | if (hasOverlaps(change, changes)) { 56 | overlaps = true; 57 | } else { 58 | changes.push(change); 59 | } 60 | } 61 | } 62 | } 63 | } 64 | 65 | ts.forEachChild(node, visitor); 66 | } 67 | } 68 | 69 | -------------------------------------------------------------------------------- /src/core/property.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | 3 | import { findChildOfKind } from './refactor'; 4 | 5 | function findType(node: ts.Node): ts.Node { 6 | let typeNode; 7 | const children = node.getChildren(); 8 | for (let i = 0, n = children.length; i < n; i++) { 9 | const it = children[i]; 10 | if (it.kind === ts.SyntaxKind.ColonToken && i + 1 < n) { 11 | typeNode = children[i + 1]; 12 | break; 13 | } 14 | } 15 | return typeNode; 16 | } 17 | 18 | export interface GetterSetterOptions { 19 | prefix?: string; // default _ 20 | singleLine?: boolean; 21 | explicitPublicAccess?: boolean; 22 | } 23 | 24 | export function toGetterSetter(sourceFile: ts.SourceFile, pos: number, indent: string, tab: string, options?: GetterSetterOptions): ts.TextChange { 25 | let prefix = '_'; 26 | let newLine = '\n'; 27 | let access = ''; 28 | 29 | if (options && options.prefix) { 30 | prefix = options.prefix; 31 | } 32 | 33 | if (options && options.singleLine) { 34 | newLine = ''; 35 | } 36 | 37 | if (options && options.explicitPublicAccess) { 38 | access = 'public '; 39 | } 40 | 41 | const text = sourceFile.getFullText(); 42 | let change: ts.TextChange; 43 | visitor(sourceFile); 44 | return change; 45 | 46 | function visitor(node: ts.Node) { 47 | if (node.kind === ts.SyntaxKind.PropertyDeclaration) { 48 | const span = { start: node.getStart(), length: node.getEnd() - node.getStart() }; 49 | if (ts.textSpanContainsPosition(span, pos)) { 50 | 51 | const typeNode = findType(node); 52 | const type = typeNode ? (': ' + text.substring(typeNode.getStart(), typeNode.getEnd())) : ''; 53 | // children.forEach(it => console.log('aaaaaa=' + ts.SyntaxKind[it.kind])); 54 | 55 | // const newLine = ''; 56 | const newLineIndentTab = newLine ? newLine + indent + tab : ' '; 57 | const newLineIndent = newLine ? newLine + indent : ' '; 58 | const nameNode = findChildOfKind(node, ts.SyntaxKind.Identifier); 59 | const name = text.substring(nameNode.getStart(), nameNode.getEnd()); 60 | const nodeText = text.substring(node.getStart(), node.getEnd()); 61 | // const getter = indent + 'get ' + name + '()' + type + ' {' + newLineIndentTab + 'return this.' + prefix + name + ';' + newLineIndent + '}'; 62 | // const setter = indent + 'set ' + name + '(value' + type + ') {' + newLineIndentTab + 'this.' + prefix + name + ' = value;' + newLineIndent + '}'; 63 | const getter = `${indent}${access}get ${name}()${type} {${newLineIndentTab}return this.${prefix}${name};${newLineIndent}}`; 64 | const setter = `${indent}${access}set ${name}(value${type}) {${newLineIndentTab}this.${prefix}${name} = value;${newLineIndent}}`; 65 | const newText = 'private ' + prefix + nodeText + '\n' + getter + '\n' + setter; 66 | change = { span, newText }; 67 | } 68 | } 69 | 70 | if (!change) { 71 | ts.forEachChild(node, visitor); 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /src/core/access.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | 3 | const MODS_NO_PUBLIC = ['private ', 'protected ']; 4 | const ALL_MODS = [...MODS_NO_PUBLIC, 'public ']; 5 | 6 | function findOtherAccessor(node: ts.AccessorDeclaration): ts.Node { 7 | const parent = node.parent as ts.ClassDeclaration; 8 | const otherKind = node.kind === ts.SyntaxKind.SetAccessor ? ts.SyntaxKind.GetAccessor : ts.SyntaxKind.SetAccessor; 9 | const propName = node.name.getText(); 10 | return parent.members.find(it => it.kind === otherKind && it.name.getText() === propName); 11 | } 12 | 13 | export interface AccessOptions { 14 | preferPublic?: boolean; 15 | } 16 | 17 | export function toggle(sourceFile: ts.SourceFile, pos: number, options?: AccessOptions): ts.TextChange[] { 18 | const text = sourceFile.getFullText(); 19 | const preferPublic = options && options.preferPublic; 20 | let changes: ts.TextChange[]; 21 | visitor(sourceFile); 22 | return changes; 23 | 24 | function posInside(node: ts.Node): boolean { 25 | return ts.textSpanContainsPosition({ start: node.getStart(), length: node.getEnd() - node.getStart() }, pos); 26 | } 27 | 28 | function findNodes(node: ts.Node): ts.Node[] { 29 | if ( 30 | node.kind === ts.SyntaxKind.PropertyDeclaration || 31 | node.kind === ts.SyntaxKind.MethodDeclaration || 32 | node.kind === ts.SyntaxKind.SetAccessor || node.kind === ts.SyntaxKind.GetAccessor) { 33 | if (posInside(node)) { 34 | const all = [node]; 35 | if (node.kind === ts.SyntaxKind.SetAccessor || node.kind === ts.SyntaxKind.GetAccessor) { 36 | const other = findOtherAccessor(node as ts.AccessorDeclaration); 37 | if (other) { 38 | all.push(other); 39 | } 40 | } 41 | return all; 42 | } 43 | } else if (node.kind === ts.SyntaxKind.Constructor) { 44 | const ctor = node as ts.ConstructorDeclaration; 45 | let param = ctor.parameters.find(it => posInside(it)); 46 | if (!param && posInside(ctor)) { 47 | param = ctor.parameters[0]; 48 | } 49 | if (param) { 50 | return [param]; 51 | } 52 | } 53 | return []; 54 | } 55 | 56 | function anyModLength(text: string) { 57 | for (let i = 0, n = ALL_MODS.length; i < n; i++) { 58 | const mod = ALL_MODS[i]; 59 | if (text.startsWith(mod)) { 60 | return mod.length; 61 | } 62 | } 63 | return 0; 64 | } 65 | 66 | function visitor(node: ts.Node) { 67 | findNodes(node).forEach(found => { 68 | 69 | const isParam = found.kind === ts.SyntaxKind.Parameter; 70 | const nodeText = text.substring(found.getStart(), found.getEnd()); 71 | let modFound = false; 72 | const mods = isParam || preferPublic ? ALL_MODS : MODS_NO_PUBLIC; 73 | const def = preferPublic && !isParam ? ALL_MODS[0] : ''; 74 | for (let i = 0, n = mods.length; i < n; i++) { 75 | const mod = mods[i]; 76 | if (nodeText.startsWith(mod)) { 77 | changes = changes || []; 78 | changes.push({ span: { start: found.getStart(), length: mod.length }, newText: (i + 1 < n) ? mods[i + 1] : def }); 79 | modFound = true; 80 | break; 81 | } 82 | } 83 | if (!modFound) { 84 | changes = changes || []; 85 | changes.push({ span: { start: found.getStart(), length: anyModLength(nodeText) }, newText: mods[0] }); 86 | } 87 | }); 88 | 89 | if (changes) { 90 | return true; 91 | } 92 | 93 | ts.forEachChild(node, visitor); 94 | } 95 | } -------------------------------------------------------------------------------- /src/core/split-variable-declaration.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | import * as vs from 'vscode'; 3 | import { inRange } from './refactor'; 4 | 5 | function narrowType(type: string): string { 6 | if (type.startsWith('"') && type.endsWith('"')) { 7 | return 'string'; 8 | } 9 | 10 | const first = type[0]; 11 | if (first >= '0' && first <= '9') { 12 | return 'number'; 13 | } 14 | 15 | if (type === 'true' || type === 'false') { 16 | return 'boolean'; 17 | } 18 | 19 | return type; 20 | } 21 | 22 | function resolveType(expr: ts.Node, doc: vs.TextDocument): Promise { 23 | return new Promise(resolve => { 24 | 25 | const def = () => resolve(undefined); 26 | 27 | if (expr) { 28 | vs.commands.executeCommand('vscode.executeHoverProvider', doc.uri, doc.positionAt(expr.getStart())).then(val => { 29 | const hovers: vs.Hover[] = Array.isArray(val) ? val : [val]; 30 | let value: string; 31 | hovers.find(hover => { 32 | hover.contents.find(ms => { 33 | if (typeof ms === 'string') { 34 | value = ms; 35 | } else if (ms.language === 'typescript') { 36 | value = ms.value; 37 | } 38 | return Boolean(value); 39 | }); 40 | return Boolean(value); 41 | }); 42 | 43 | if (value) { 44 | const pos = value.indexOf(':'); 45 | if (pos >= 0) { 46 | const type = value.substring(pos + 1).trim(); 47 | resolve(narrowType(type)); 48 | return; 49 | } 50 | } 51 | def(); 52 | }); 53 | } else { 54 | def(); 55 | } 56 | }); 57 | } 58 | 59 | interface Decl { 60 | varStatement: ts.VariableStatement; 61 | declInit: ts.Expression; 62 | declName: ts.BindingName; 63 | declType: ts.TypeNode; 64 | } 65 | 66 | export function splitVariableDeclaration(sourceFile: ts.SourceFile, doc: vs.TextDocument, range: ts.TextSpan, indent: string): Promise<{ change: ts.TextChange, selection?: ts.TextSpan }> { 67 | 68 | const decls: Decl[] = []; 69 | const text = sourceFile.getFullText(); 70 | 71 | visitor(sourceFile); 72 | 73 | return new Promise(resolve => { 74 | 75 | if (decls.length === 0) { 76 | resolve(undefined); 77 | return; 78 | } 79 | 80 | const { varStatement, declName, declInit, declType } = decls[decls.length - 1]; 81 | 82 | function resolveChange(initType: string) { 83 | 84 | const noInitType = !initType; 85 | initType = initType || 'type'; 86 | 87 | const varStatementText = text.substring(varStatement.getStart(), varStatement.getEnd()).trim(); 88 | const declNameText = text.substring(declName.getStart(), declName.getEnd()); 89 | const initText = text.substring(declInit.getStart(), declInit.getEnd()); 90 | const semi = varStatementText.endsWith(';') ? ';' : ''; 91 | 92 | const wasConst = varStatementText.startsWith('const'); 93 | const declTypeText = varStatementText.startsWith('var') ? 'var' : 'let'; 94 | 95 | const selStartMore = wasConst ? 0 : 2; 96 | 97 | const beforeInitType = `${declTypeText} ${declNameText}: `; 98 | const newText = `${beforeInitType}${initType}${semi}\n${indent}${declNameText} = ${initText}${semi}`; 99 | const change = { span: { start: varStatement.getStart(), length: varStatement.getEnd() - varStatement.getStart() }, newText }; 100 | const selection = noInitType ? { start: declName.getEnd() + selStartMore, length: initType.length } : undefined; 101 | resolve({ change, selection }); 102 | } 103 | 104 | if (declType) { 105 | resolveChange(text.substring(declType.getStart(), declType.getEnd())); 106 | } else { 107 | resolveType(declName, doc).then(resolveChange); 108 | } 109 | }); 110 | 111 | function visitor(node: ts.Node) { 112 | if (node.kind === ts.SyntaxKind.VariableStatement && inRange(node, range)) { 113 | const varStatement = node as ts.VariableStatement; 114 | const decl = varStatement.declarationList.declarations[0]; 115 | const declInit = decl.initializer; 116 | if (declInit) { 117 | decls.push({ varStatement, declName: decl.name, declType: decl.type, declInit }); 118 | } 119 | } 120 | 121 | ts.forEachChild(node, visitor); 122 | } 123 | } 124 | 125 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vscode-refactorix 2 | TypeScript refactoring tools for Visual Studio Code. 3 | 4 | After installing, pressing `F1` and entering `x:` you should see the Refactorix commands in the drop down: 5 | 6 | ![Commands](doc/commands.png "Refactorix commands") 7 | 8 | ## Refactorings 9 | 10 | ### Grow Selection / Shrink Selection 11 | 12 | Though not a refactoring, these commands help in doing so. They operate on the TypeScript AST and serve as an alternative to the built in commands 'Expand Select' and 'Shrink Select'. 13 | 14 | Use these keybindings to replace the original ones: 15 | 16 | ``` 17 | { 18 | "key": "shift+alt+up", 19 | "command": "extension.refactorix.grow-selection" 20 | }, 21 | { 22 | "key": "shift+alt+down", 23 | "command": "extension.refactorix.shrink-selection" 24 | } 25 | ``` 26 | 27 | ### Split variable declaration 28 | 29 | Splits the initialization part of a variable declaration. 30 | 31 | Place the cursor inside a variable declaration statement and invoke the command. 32 | 33 | Before: 34 | ``` 35 | const x = false; 36 | ``` 37 | 38 | After: 39 | ``` 40 | let x: boolean; 41 | x = false; 42 | ``` 43 | 44 | ### Toggle access modifier 45 | Toggles between `private`, `protected`, `public` and no access modifier. 46 | 47 | Place the cursor on a class property, method, constructor parameter, set or get accessor and invoke the command. 48 | 49 | When placed on a get or set accessor, the modifier of the other accessor is toggled as well. 50 | 51 | #### Settings 52 | Add this configuration block to the VS Code 'User' or 'Workspace' settings: 53 | ``` 54 | "extension.refactorix.Access.toggle": { 55 | "preferPublic": true 56 | } 57 | ``` 58 | 59 | `preferPublic` - if `true`, the `public` modifier will be used instead of no modifier. Does not affect constructor parameters. 60 | 61 | ### Interpolate string part 62 | 63 | Surrounds the selected part of a string literal with `${}` and converts the literal to backticks as necessary. 64 | 65 | Before - assume you have `refactorix` selected: 66 | ``` 67 | 'my name is refactorix.' 68 | ``` 69 | 70 | After - note the backticks: 71 | ``` 72 | `my name is ${refactorix}.` 73 | ``` 74 | 75 | Select a part of a string literal and invoke the command. The selection may be empty in which case `${}` is inserted. 76 | 77 | ### Property to getter/setter 78 | Converts a property to getter/setter. 79 | 80 | Before: 81 | ``` 82 | class Color { 83 | rgb: string; 84 | } 85 | ``` 86 | 87 | After: 88 | ``` 89 | class Color { 90 | private _rgb: string; 91 | get rgb(): string { 92 | return this._rgb; 93 | } 94 | set rgb(value: string) { 95 | this._rgb = value; 96 | } 97 | } 98 | ``` 99 | 100 | Place the cursor on a property and invoke the command. 101 | 102 | #### Settings 103 | Add this configuration block to the VS Code 'User' or 'Workspace' settings: 104 | ``` 105 | "extension.refactorix.Property.ToGetterSetter": { 106 | "singleLine": false, 107 | "prefix": "_", 108 | "explicitPublicAccess": false 109 | } 110 | ``` 111 | 112 | `singleLine` - if `true`, getter and setter will be written on a single line. 113 | 114 | `prefix` - Prefix for the property. 115 | 116 | `explicitPublicAccess` - Add 'public' to the generated getter/setter. 117 | 118 | ### Add/remove semicolons 119 | Adds or removes semicolons for all statements in the active document. 120 | 121 | ### Arrow function toggle single statement block <-> expression 122 | Toggles between an arrow function's single statement block and expression. 123 | 124 | Toggles between this: 125 | ``` 126 | () => 0; 127 | ``` 128 | 129 | and this: 130 | ``` 131 | () => { 132 | return 0; 133 | }; 134 | ``` 135 | 136 | Place the cursor inside such a function and invoke the command. 137 | 138 | ### Arrow function all single statement blocks to expression 139 | Converts all arrow function single statement blocks to expression. 140 | 141 | ### Extract variable 142 | Replaces the selected text with a `const` variable declaration. This command operates on text rather than AST, so the location of the variable declaration may not be appropriate in all cases. 143 | 144 | #### Settings 145 | Add this configuration block to the VS Code 'User' or 'Workspace' settings: 146 | ``` 147 | "extension.refactorix.ExtractVariable": { 148 | "noSemicolon": true 149 | } 150 | ``` 151 | 152 | `noSemicolon` - Whether to add a semicolon to the extracted expression. Default is false (will add a semicolon). 153 | 154 | ## Release Info 155 | 156 | v0.3.7 157 | - New configurable option 'explicitPublicAccess' for the 'Property to getter/setter' refactoring - Thanks to joseluisb. 158 | - New commands 'Grow Selection' and 'Shrink Selection'. 159 | 160 | v0.3.6 161 | - 'Split variable declaration' - use inner most declaration. 162 | 163 | v0.3.5 164 | - 'Split variable declaration' - resolve variable type. 165 | 166 | v0.3.4 167 | - New refactoring 'Split variable declaration' 168 | 169 | v0.3.3 170 | - Add 'noSemicolon' configuration setting for Extract variable. 171 | - Add configuration schema to extension. 172 | 173 | v0.3.2 174 | - Latest TypeScript. 175 | 176 | v0.3.1 177 | - Do not add semicolon to arrow function property with block as newest tslint reports a problem there. 178 | 179 | v0.3.0 180 | - Add key bindings to extension 181 | - New refactoring 'Toggle access modifier' 182 | 183 | v0.2.0 184 | - Semicolons are now added/removed in all the places where tslint's semicolon rule reports a problem 185 | - New refactoring 'Property to getter/setter' 186 | - New refactoring 'Interpolate string part' 187 | 188 | v0.1.0 189 | - Initial release 190 | 191 | ## Development setup 192 | - run `npm install` inside the project folder 193 | - open VS Code on the project folder 194 | 195 | ## Build 196 | - run `npm run compile` 197 | 198 | ## Package 199 | - run `vsce package` 200 | 201 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "refactorix", 3 | "description": "TypeScript refactoring tools for Visual Studio Code", 4 | "version": "0.3.7", 5 | "publisher": "christianoetterli", 6 | "engines": { 7 | "vscode": "^1.13.0" 8 | }, 9 | "categories": [ 10 | "Other" 11 | ], 12 | "icon": "doc/logo.png", 13 | "bugs": { 14 | "url": "https://github.com/krizzdewizz/vscode-refactorix/issues" 15 | }, 16 | "homepage": "https://github.com/krizzdewizz/vscode-refactorix", 17 | "repository": { 18 | "type": "git", 19 | "url": "https://github.com/krizzdewizz/vscode-refactorix.git" 20 | }, 21 | "activationEvents": [ 22 | "onLanguage:typescript" 23 | ], 24 | "main": "./out/src/extension", 25 | "contributes": { 26 | "configuration": { 27 | "type": "object", 28 | "title": "Refactorix configuration", 29 | "properties": { 30 | "extension.refactorix.Property.ToGetterSetter": { 31 | "type": "object", 32 | "title": "Refactorix property getter/setter configuration", 33 | "properties": { 34 | "prefix": { 35 | "type": "string", 36 | "default": "_", 37 | "description": "Prefix to add to the property." 38 | }, 39 | "singleLine": { 40 | "type": "boolean", 41 | "default": false, 42 | "description": "Whether to put getter/setter on a single line" 43 | }, 44 | "explicitPublicAccess": { 45 | "type": "boolean", 46 | "default": false, 47 | "description": "Whether to add public accessor to getter/setter" 48 | } 49 | } 50 | }, 51 | "extension.refactorix.ExtractVariable": { 52 | "type": "object", 53 | "title": "Refactorix extract variable configuration", 54 | "properties": { 55 | "noSemicolon": { 56 | "type": "boolean", 57 | "default": false, 58 | "description": "Whether to add a semicolon to the extracted expression." 59 | } 60 | } 61 | }, 62 | "extension.refactorix.Access.toggle": { 63 | "type": "object", 64 | "title": "Refactorix access toggle configuration", 65 | "properties": { 66 | "preferPublic": { 67 | "type": "boolean", 68 | "default": false, 69 | "description": "Whether to add or ommit the 'public' keyword." 70 | } 71 | } 72 | } 73 | } 74 | }, 75 | "commands": [ 76 | { 77 | "command": "extension.refactorix.SplitVariableDeclaration", 78 | "title": "x: Split variable declaration" 79 | }, 80 | { 81 | "command": "extension.refactorix.ExtractVariable", 82 | "title": "x: Extract variable" 83 | }, 84 | { 85 | "command": "extension.refactorix.ArrowFunction.ToggleSingleStatementBlockExpression", 86 | "title": "x: Arrow function toggle single statement block <-> expression" 87 | }, 88 | { 89 | "command": "extension.refactorix.ArrowFunction.SingleStatementBlockToExpressionAll", 90 | "title": "x: Arrow function all single statement blocks to expression" 91 | }, 92 | { 93 | "command": "extension.refactorix.Semicolons.Add", 94 | "title": "x: Add semicolons" 95 | }, 96 | { 97 | "command": "extension.refactorix.Semicolons.Remove", 98 | "title": "x: Remove semicolons" 99 | }, 100 | { 101 | "command": "extension.refactorix.Property.ToGetterSetter", 102 | "title": "x: Property to getter/setter" 103 | }, 104 | { 105 | "command": "extension.refactorix.String.Interpolate", 106 | "title": "x: Interpolate string part" 107 | }, 108 | { 109 | "command": "extension.refactorix.Access.toggle", 110 | "title": "x: Toggle access modifier" 111 | }, 112 | { 113 | "command": "extension.refactorix.grow-selection", 114 | "title": "x: Grow Selection" 115 | }, 116 | { 117 | "command": "extension.refactorix.shrink-selection", 118 | "title": "x: Shrink Selection" 119 | } 120 | ], 121 | "keybindings": [ 122 | { 123 | "command": "extension.refactorix.Semicolons.Add", 124 | "key": "ctrl+;", 125 | "when": "editorTextFocus" 126 | }, 127 | { 128 | "command": "extension.refactorix.Semicolons.Remove", 129 | "key": "ctrl+shift+;", 130 | "when": "editorTextFocus" 131 | }, 132 | { 133 | "command": "extension.refactorix.ArrowFunction.ToggleSingleStatementBlockExpression", 134 | "key": "ctrl+]", 135 | "when": "editorTextFocus" 136 | }, 137 | { 138 | "command": "extension.refactorix.ArrowFunction.SingleStatementBlockToExpressionAll", 139 | "key": "ctrl+shift+]", 140 | "when": "editorTextFocus" 141 | }, 142 | { 143 | "command": "extension.refactorix.ExtractVariable", 144 | "key": "alt+shift+l", 145 | "when": "editorTextFocus" 146 | }, 147 | { 148 | "command": "extension.refactorix.String.Interpolate", 149 | "key": "shift+alt+x i", 150 | "when": "editorTextFocus" 151 | }, 152 | { 153 | "command": "extension.refactorix.Property.ToGetterSetter", 154 | "key": "shift+alt+x g", 155 | "when": "editorTextFocus" 156 | }, 157 | { 158 | "key": "alt+shift+q", 159 | "command": "extension.refactorix.Access.toggle", 160 | "when": "editorTextFocus" 161 | }, 162 | { 163 | "key": "shift+alt+x s", 164 | "command": "extension.refactorix.SplitVariableDeclaration", 165 | "when": "editorTextFocus" 166 | } 167 | ] 168 | }, 169 | "scripts": { 170 | "vscode:prepublish": "tsc -p ./", 171 | "compile": "tsc -watch -p ./", 172 | "postinstall": "node ./node_modules/vscode/bin/install" 173 | }, 174 | "dependencies": { 175 | "typescript": "*" 176 | }, 177 | "devDependencies": { 178 | "@types/jasmine": "*", 179 | "@types/node": "^6.0.40", 180 | "jasmine": "*", 181 | "tslint": "*", 182 | "tslint-microsoft-contrib": "*", 183 | "tsutils": "1.6.0", 184 | "vscode": "^1.0.0" 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/jasmine@*": 6 | version "2.5.47" 7 | resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.47.tgz#bbba9bcf0e95e7890c6f4a47394e8bacaa960eb6" 8 | 9 | "@types/node@^6.0.40": 10 | version "6.0.73" 11 | resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.73.tgz#85dc4bb6f125377c75ddd2519a1eeb63f0a4ed70" 12 | 13 | ajv@^4.9.1: 14 | version "4.11.8" 15 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 16 | dependencies: 17 | co "^4.6.0" 18 | json-stable-stringify "^1.0.1" 19 | 20 | ansi-regex@^2.0.0: 21 | version "2.1.1" 22 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 23 | 24 | ansi-styles@^2.2.1: 25 | version "2.2.1" 26 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 27 | 28 | arr-diff@^2.0.0: 29 | version "2.0.0" 30 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 31 | dependencies: 32 | arr-flatten "^1.0.1" 33 | 34 | arr-flatten@^1.0.1: 35 | version "1.0.3" 36 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" 37 | 38 | array-differ@^1.0.0: 39 | version "1.0.0" 40 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 41 | 42 | array-union@^1.0.1: 43 | version "1.0.2" 44 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 45 | dependencies: 46 | array-uniq "^1.0.1" 47 | 48 | array-uniq@^1.0.1, array-uniq@^1.0.2: 49 | version "1.0.3" 50 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 51 | 52 | array-unique@^0.2.1: 53 | version "0.2.1" 54 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 55 | 56 | arrify@^1.0.0: 57 | version "1.0.1" 58 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 59 | 60 | asn1@~0.2.3: 61 | version "0.2.3" 62 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 63 | 64 | assert-plus@1.0.0, assert-plus@^1.0.0: 65 | version "1.0.0" 66 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 67 | 68 | assert-plus@^0.2.0: 69 | version "0.2.0" 70 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 71 | 72 | asynckit@^0.4.0: 73 | version "0.4.0" 74 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 75 | 76 | aws-sign2@~0.6.0: 77 | version "0.6.0" 78 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 79 | 80 | aws4@^1.2.1: 81 | version "1.6.0" 82 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 83 | 84 | babel-code-frame@^6.22.0: 85 | version "6.22.0" 86 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 87 | dependencies: 88 | chalk "^1.1.0" 89 | esutils "^2.0.2" 90 | js-tokens "^3.0.0" 91 | 92 | balanced-match@^0.4.1: 93 | version "0.4.2" 94 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 95 | 96 | bcrypt-pbkdf@^1.0.0: 97 | version "1.0.1" 98 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 99 | dependencies: 100 | tweetnacl "^0.14.3" 101 | 102 | beeper@^1.0.0: 103 | version "1.1.1" 104 | resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" 105 | 106 | block-stream@*: 107 | version "0.0.9" 108 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 109 | dependencies: 110 | inherits "~2.0.0" 111 | 112 | boom@2.x.x: 113 | version "2.10.1" 114 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 115 | dependencies: 116 | hoek "2.x.x" 117 | 118 | brace-expansion@^1.1.7: 119 | version "1.1.7" 120 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" 121 | dependencies: 122 | balanced-match "^0.4.1" 123 | concat-map "0.0.1" 124 | 125 | braces@^1.8.2: 126 | version "1.8.5" 127 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 128 | dependencies: 129 | expand-range "^1.8.1" 130 | preserve "^0.2.0" 131 | repeat-element "^1.1.2" 132 | 133 | browser-stdout@1.3.0: 134 | version "1.3.0" 135 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 136 | 137 | buffer-crc32@~0.2.3: 138 | version "0.2.13" 139 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 140 | 141 | buffer-shims@~1.0.0: 142 | version "1.0.0" 143 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 144 | 145 | caseless@~0.11.0: 146 | version "0.11.0" 147 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 148 | 149 | caseless@~0.12.0: 150 | version "0.12.0" 151 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 152 | 153 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: 154 | version "1.1.3" 155 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 156 | dependencies: 157 | ansi-styles "^2.2.1" 158 | escape-string-regexp "^1.0.2" 159 | has-ansi "^2.0.0" 160 | strip-ansi "^3.0.0" 161 | supports-color "^2.0.0" 162 | 163 | clone-buffer@^1.0.0: 164 | version "1.0.0" 165 | resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" 166 | 167 | clone-stats@^0.0.1: 168 | version "0.0.1" 169 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" 170 | 171 | clone-stats@^1.0.0: 172 | version "1.0.0" 173 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" 174 | 175 | clone@^0.2.0: 176 | version "0.2.0" 177 | resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" 178 | 179 | clone@^1.0.0: 180 | version "1.0.2" 181 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 182 | 183 | cloneable-readable@^1.0.0: 184 | version "1.0.0" 185 | resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" 186 | dependencies: 187 | inherits "^2.0.1" 188 | process-nextick-args "^1.0.6" 189 | through2 "^2.0.1" 190 | 191 | co@^4.6.0: 192 | version "4.6.0" 193 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 194 | 195 | colors@^1.1.2: 196 | version "1.1.2" 197 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 198 | 199 | combined-stream@^1.0.5, combined-stream@~1.0.5: 200 | version "1.0.5" 201 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 202 | dependencies: 203 | delayed-stream "~1.0.0" 204 | 205 | commander@2.9.0, commander@^2.9.0: 206 | version "2.9.0" 207 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 208 | dependencies: 209 | graceful-readlink ">= 1.0.0" 210 | 211 | concat-map@0.0.1: 212 | version "0.0.1" 213 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 214 | 215 | convert-source-map@^1.1.1: 216 | version "1.5.0" 217 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" 218 | 219 | core-util-is@~1.0.0: 220 | version "1.0.2" 221 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 222 | 223 | cryptiles@2.x.x: 224 | version "2.0.5" 225 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 226 | dependencies: 227 | boom "2.x.x" 228 | 229 | dashdash@^1.12.0: 230 | version "1.14.1" 231 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 232 | dependencies: 233 | assert-plus "^1.0.0" 234 | 235 | dateformat@^2.0.0: 236 | version "2.0.0" 237 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" 238 | 239 | debug@2.6.0: 240 | version "2.6.0" 241 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" 242 | dependencies: 243 | ms "0.7.2" 244 | 245 | deep-assign@^1.0.0: 246 | version "1.0.0" 247 | resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" 248 | dependencies: 249 | is-obj "^1.0.0" 250 | 251 | delayed-stream@~1.0.0: 252 | version "1.0.0" 253 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 254 | 255 | diff@3.2.0, diff@^3.2.0: 256 | version "3.2.0" 257 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" 258 | 259 | duplexer2@0.0.2: 260 | version "0.0.2" 261 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" 262 | dependencies: 263 | readable-stream "~1.1.9" 264 | 265 | duplexer@~0.1.1: 266 | version "0.1.1" 267 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 268 | 269 | duplexify@^3.2.0: 270 | version "3.5.0" 271 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" 272 | dependencies: 273 | end-of-stream "1.0.0" 274 | inherits "^2.0.1" 275 | readable-stream "^2.0.0" 276 | stream-shift "^1.0.0" 277 | 278 | ecc-jsbn@~0.1.1: 279 | version "0.1.1" 280 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 281 | dependencies: 282 | jsbn "~0.1.0" 283 | 284 | end-of-stream@1.0.0: 285 | version "1.0.0" 286 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" 287 | dependencies: 288 | once "~1.3.0" 289 | 290 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: 291 | version "1.0.5" 292 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 293 | 294 | esutils@^2.0.2: 295 | version "2.0.2" 296 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 297 | 298 | event-stream@^3.3.1, event-stream@~3.3.4: 299 | version "3.3.4" 300 | resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" 301 | dependencies: 302 | duplexer "~0.1.1" 303 | from "~0" 304 | map-stream "~0.1.0" 305 | pause-stream "0.0.11" 306 | split "0.3" 307 | stream-combiner "~0.0.4" 308 | through "~2.3.1" 309 | 310 | exit@^0.1.2: 311 | version "0.1.2" 312 | resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" 313 | 314 | expand-brackets@^0.1.4: 315 | version "0.1.5" 316 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 317 | dependencies: 318 | is-posix-bracket "^0.1.0" 319 | 320 | expand-range@^1.8.1: 321 | version "1.8.2" 322 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 323 | dependencies: 324 | fill-range "^2.1.0" 325 | 326 | extend-shallow@^2.0.1: 327 | version "2.0.1" 328 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 329 | dependencies: 330 | is-extendable "^0.1.0" 331 | 332 | extend@^3.0.0, extend@~3.0.0: 333 | version "3.0.1" 334 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 335 | 336 | extglob@^0.3.1: 337 | version "0.3.2" 338 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 339 | dependencies: 340 | is-extglob "^1.0.0" 341 | 342 | extsprintf@1.0.2: 343 | version "1.0.2" 344 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 345 | 346 | fancy-log@^1.1.0: 347 | version "1.3.0" 348 | resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" 349 | dependencies: 350 | chalk "^1.1.1" 351 | time-stamp "^1.0.0" 352 | 353 | fd-slicer@~1.0.1: 354 | version "1.0.1" 355 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" 356 | dependencies: 357 | pend "~1.2.0" 358 | 359 | filename-regex@^2.0.0: 360 | version "2.0.1" 361 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 362 | 363 | fill-range@^2.1.0: 364 | version "2.2.3" 365 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 366 | dependencies: 367 | is-number "^2.1.0" 368 | isobject "^2.0.0" 369 | randomatic "^1.1.3" 370 | repeat-element "^1.1.2" 371 | repeat-string "^1.5.2" 372 | 373 | findup-sync@~0.3.0: 374 | version "0.3.0" 375 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" 376 | dependencies: 377 | glob "~5.0.0" 378 | 379 | first-chunk-stream@^1.0.0: 380 | version "1.0.0" 381 | resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" 382 | 383 | for-in@^1.0.1: 384 | version "1.0.2" 385 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 386 | 387 | for-own@^0.1.4: 388 | version "0.1.5" 389 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 390 | dependencies: 391 | for-in "^1.0.1" 392 | 393 | forever-agent@~0.6.1: 394 | version "0.6.1" 395 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 396 | 397 | form-data@~2.1.1: 398 | version "2.1.4" 399 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 400 | dependencies: 401 | asynckit "^0.4.0" 402 | combined-stream "^1.0.5" 403 | mime-types "^2.1.12" 404 | 405 | from@~0: 406 | version "0.1.7" 407 | resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" 408 | 409 | fs.realpath@^1.0.0: 410 | version "1.0.0" 411 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 412 | 413 | fstream@^1.0.2: 414 | version "1.0.11" 415 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 416 | dependencies: 417 | graceful-fs "^4.1.2" 418 | inherits "~2.0.0" 419 | mkdirp ">=0.5 0" 420 | rimraf "2" 421 | 422 | generate-function@^2.0.0: 423 | version "2.0.0" 424 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 425 | 426 | generate-object-property@^1.1.0: 427 | version "1.2.0" 428 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 429 | dependencies: 430 | is-property "^1.0.0" 431 | 432 | getpass@^0.1.1: 433 | version "0.1.7" 434 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 435 | dependencies: 436 | assert-plus "^1.0.0" 437 | 438 | glob-base@^0.3.0: 439 | version "0.3.0" 440 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 441 | dependencies: 442 | glob-parent "^2.0.0" 443 | is-glob "^2.0.0" 444 | 445 | glob-parent@^2.0.0: 446 | version "2.0.0" 447 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 448 | dependencies: 449 | is-glob "^2.0.0" 450 | 451 | glob-parent@^3.0.0: 452 | version "3.1.0" 453 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 454 | dependencies: 455 | is-glob "^3.1.0" 456 | path-dirname "^1.0.0" 457 | 458 | glob-stream@^5.3.2: 459 | version "5.3.5" 460 | resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" 461 | dependencies: 462 | extend "^3.0.0" 463 | glob "^5.0.3" 464 | glob-parent "^3.0.0" 465 | micromatch "^2.3.7" 466 | ordered-read-streams "^0.3.0" 467 | through2 "^0.6.0" 468 | to-absolute-glob "^0.1.1" 469 | unique-stream "^2.0.2" 470 | 471 | glob@7.1.1, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1: 472 | version "7.1.1" 473 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 474 | dependencies: 475 | fs.realpath "^1.0.0" 476 | inflight "^1.0.4" 477 | inherits "2" 478 | minimatch "^3.0.2" 479 | once "^1.3.0" 480 | path-is-absolute "^1.0.0" 481 | 482 | glob@^5.0.3, glob@~5.0.0: 483 | version "5.0.15" 484 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 485 | dependencies: 486 | inflight "^1.0.4" 487 | inherits "2" 488 | minimatch "2 || 3" 489 | once "^1.3.0" 490 | path-is-absolute "^1.0.0" 491 | 492 | glogg@^1.0.0: 493 | version "1.0.0" 494 | resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" 495 | dependencies: 496 | sparkles "^1.0.0" 497 | 498 | graceful-fs@^4.0.0, graceful-fs@^4.1.2: 499 | version "4.1.11" 500 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 501 | 502 | "graceful-readlink@>= 1.0.0": 503 | version "1.0.1" 504 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 505 | 506 | growl@1.9.2: 507 | version "1.9.2" 508 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 509 | 510 | gulp-chmod@^2.0.0: 511 | version "2.0.0" 512 | resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-2.0.0.tgz#00c390b928a0799b251accf631aa09e01cc6299c" 513 | dependencies: 514 | deep-assign "^1.0.0" 515 | stat-mode "^0.2.0" 516 | through2 "^2.0.0" 517 | 518 | gulp-filter@^5.0.0: 519 | version "5.0.0" 520 | resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-5.0.0.tgz#cfa81966fb67884f2ba754b067152929428d59bc" 521 | dependencies: 522 | gulp-util "^3.0.6" 523 | multimatch "^2.0.0" 524 | streamfilter "^1.0.5" 525 | 526 | gulp-gunzip@0.0.3: 527 | version "0.0.3" 528 | resolved "https://registry.yarnpkg.com/gulp-gunzip/-/gulp-gunzip-0.0.3.tgz#7b6e07b0f58fd3d42515c48ead5a63df0572f62f" 529 | dependencies: 530 | through2 "~0.6.5" 531 | vinyl "~0.4.6" 532 | 533 | gulp-remote-src@^0.4.2: 534 | version "0.4.2" 535 | resolved "https://registry.yarnpkg.com/gulp-remote-src/-/gulp-remote-src-0.4.2.tgz#ceb3770e3444328d61386fbaaab200bc11cd98a8" 536 | dependencies: 537 | event-stream "~3.3.4" 538 | node.extend "~1.1.2" 539 | request "~2.79.0" 540 | through2 "~2.0.3" 541 | vinyl "~2.0.1" 542 | 543 | gulp-sourcemaps@1.6.0: 544 | version "1.6.0" 545 | resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" 546 | dependencies: 547 | convert-source-map "^1.1.1" 548 | graceful-fs "^4.1.2" 549 | strip-bom "^2.0.0" 550 | through2 "^2.0.0" 551 | vinyl "^1.0.0" 552 | 553 | gulp-symdest@^1.1.0: 554 | version "1.1.0" 555 | resolved "https://registry.yarnpkg.com/gulp-symdest/-/gulp-symdest-1.1.0.tgz#c165320732d192ce56fd94271ffa123234bf2ae0" 556 | dependencies: 557 | event-stream "^3.3.1" 558 | mkdirp "^0.5.1" 559 | queue "^3.1.0" 560 | vinyl-fs "^2.4.3" 561 | 562 | gulp-untar@^0.0.6: 563 | version "0.0.6" 564 | resolved "https://registry.yarnpkg.com/gulp-untar/-/gulp-untar-0.0.6.tgz#d6bdefde7e9a8e054c9f162385a0782c4be74000" 565 | dependencies: 566 | event-stream "~3.3.4" 567 | gulp-util "~3.0.8" 568 | streamifier "~0.1.1" 569 | tar "^2.2.1" 570 | through2 "~2.0.3" 571 | 572 | gulp-util@^3.0.6, gulp-util@~3.0.8: 573 | version "3.0.8" 574 | resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" 575 | dependencies: 576 | array-differ "^1.0.0" 577 | array-uniq "^1.0.2" 578 | beeper "^1.0.0" 579 | chalk "^1.0.0" 580 | dateformat "^2.0.0" 581 | fancy-log "^1.1.0" 582 | gulplog "^1.0.0" 583 | has-gulplog "^0.1.0" 584 | lodash._reescape "^3.0.0" 585 | lodash._reevaluate "^3.0.0" 586 | lodash._reinterpolate "^3.0.0" 587 | lodash.template "^3.0.0" 588 | minimist "^1.1.0" 589 | multipipe "^0.1.2" 590 | object-assign "^3.0.0" 591 | replace-ext "0.0.1" 592 | through2 "^2.0.0" 593 | vinyl "^0.5.0" 594 | 595 | gulp-vinyl-zip@^1.4.0: 596 | version "1.4.0" 597 | resolved "https://registry.yarnpkg.com/gulp-vinyl-zip/-/gulp-vinyl-zip-1.4.0.tgz#56382f2ccb57231bb0478c78737ccd572973bee1" 598 | dependencies: 599 | event-stream "^3.3.1" 600 | queue "^3.0.10" 601 | through2 "^0.6.3" 602 | vinyl "^0.4.6" 603 | vinyl-fs "^2.0.0" 604 | yauzl "^2.2.1" 605 | yazl "^2.2.1" 606 | 607 | gulplog@^1.0.0: 608 | version "1.0.0" 609 | resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" 610 | dependencies: 611 | glogg "^1.0.0" 612 | 613 | har-schema@^1.0.5: 614 | version "1.0.5" 615 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 616 | 617 | har-validator@~2.0.6: 618 | version "2.0.6" 619 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 620 | dependencies: 621 | chalk "^1.1.1" 622 | commander "^2.9.0" 623 | is-my-json-valid "^2.12.4" 624 | pinkie-promise "^2.0.0" 625 | 626 | har-validator@~4.2.1: 627 | version "4.2.1" 628 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 629 | dependencies: 630 | ajv "^4.9.1" 631 | har-schema "^1.0.5" 632 | 633 | has-ansi@^2.0.0: 634 | version "2.0.0" 635 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 636 | dependencies: 637 | ansi-regex "^2.0.0" 638 | 639 | has-flag@^1.0.0: 640 | version "1.0.0" 641 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 642 | 643 | has-gulplog@^0.1.0: 644 | version "0.1.0" 645 | resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" 646 | dependencies: 647 | sparkles "^1.0.0" 648 | 649 | hawk@~3.1.3: 650 | version "3.1.3" 651 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 652 | dependencies: 653 | boom "2.x.x" 654 | cryptiles "2.x.x" 655 | hoek "2.x.x" 656 | sntp "1.x.x" 657 | 658 | hoek@2.x.x: 659 | version "2.16.3" 660 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 661 | 662 | http-signature@~1.1.0: 663 | version "1.1.1" 664 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 665 | dependencies: 666 | assert-plus "^0.2.0" 667 | jsprim "^1.2.2" 668 | sshpk "^1.7.0" 669 | 670 | inflight@^1.0.4: 671 | version "1.0.6" 672 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 673 | dependencies: 674 | once "^1.3.0" 675 | wrappy "1" 676 | 677 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: 678 | version "2.0.3" 679 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 680 | 681 | is-buffer@^1.1.5: 682 | version "1.1.5" 683 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 684 | 685 | is-dotfile@^1.0.0: 686 | version "1.0.2" 687 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 688 | 689 | is-equal-shallow@^0.1.3: 690 | version "0.1.3" 691 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 692 | dependencies: 693 | is-primitive "^2.0.0" 694 | 695 | is-extendable@^0.1.0, is-extendable@^0.1.1: 696 | version "0.1.1" 697 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 698 | 699 | is-extglob@^1.0.0: 700 | version "1.0.0" 701 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 702 | 703 | is-extglob@^2.1.0: 704 | version "2.1.1" 705 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 706 | 707 | is-glob@^2.0.0, is-glob@^2.0.1: 708 | version "2.0.1" 709 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 710 | dependencies: 711 | is-extglob "^1.0.0" 712 | 713 | is-glob@^3.1.0: 714 | version "3.1.0" 715 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 716 | dependencies: 717 | is-extglob "^2.1.0" 718 | 719 | is-my-json-valid@^2.12.4: 720 | version "2.16.0" 721 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" 722 | dependencies: 723 | generate-function "^2.0.0" 724 | generate-object-property "^1.1.0" 725 | jsonpointer "^4.0.0" 726 | xtend "^4.0.0" 727 | 728 | is-number@^2.0.2, is-number@^2.1.0: 729 | version "2.1.0" 730 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 731 | dependencies: 732 | kind-of "^3.0.2" 733 | 734 | is-obj@^1.0.0: 735 | version "1.0.1" 736 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 737 | 738 | is-posix-bracket@^0.1.0: 739 | version "0.1.1" 740 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 741 | 742 | is-primitive@^2.0.0: 743 | version "2.0.0" 744 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 745 | 746 | is-property@^1.0.0: 747 | version "1.0.2" 748 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 749 | 750 | is-stream@^1.0.1, is-stream@^1.1.0: 751 | version "1.1.0" 752 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 753 | 754 | is-typedarray@~1.0.0: 755 | version "1.0.0" 756 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 757 | 758 | is-utf8@^0.2.0: 759 | version "0.2.1" 760 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 761 | 762 | is-valid-glob@^0.3.0: 763 | version "0.3.0" 764 | resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" 765 | 766 | is@^3.1.0: 767 | version "3.2.1" 768 | resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" 769 | 770 | isarray@0.0.1: 771 | version "0.0.1" 772 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 773 | 774 | isarray@1.0.0, isarray@~1.0.0: 775 | version "1.0.0" 776 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 777 | 778 | isobject@^2.0.0: 779 | version "2.1.0" 780 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 781 | dependencies: 782 | isarray "1.0.0" 783 | 784 | isstream@~0.1.2: 785 | version "0.1.2" 786 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 787 | 788 | jasmine-core@~2.6.0: 789 | version "2.6.1" 790 | resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.6.1.tgz#66a61cddb699958e3613edef346c996f6311fc3b" 791 | 792 | jasmine@*: 793 | version "2.6.0" 794 | resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.6.0.tgz#6b22e70883e8e589d456346153b4d206ddbe217f" 795 | dependencies: 796 | exit "^0.1.2" 797 | glob "^7.0.6" 798 | jasmine-core "~2.6.0" 799 | 800 | jodid25519@^1.0.0: 801 | version "1.0.2" 802 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 803 | dependencies: 804 | jsbn "~0.1.0" 805 | 806 | js-tokens@^3.0.0: 807 | version "3.0.1" 808 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 809 | 810 | jsbn@~0.1.0: 811 | version "0.1.1" 812 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 813 | 814 | json-schema@0.2.3: 815 | version "0.2.3" 816 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 817 | 818 | json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 819 | version "1.0.1" 820 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 821 | dependencies: 822 | jsonify "~0.0.0" 823 | 824 | json-stringify-safe@~5.0.1: 825 | version "5.0.1" 826 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 827 | 828 | json3@3.3.2: 829 | version "3.3.2" 830 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 831 | 832 | jsonify@~0.0.0: 833 | version "0.0.0" 834 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 835 | 836 | jsonpointer@^4.0.0: 837 | version "4.0.1" 838 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 839 | 840 | jsprim@^1.2.2: 841 | version "1.4.0" 842 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 843 | dependencies: 844 | assert-plus "1.0.0" 845 | extsprintf "1.0.2" 846 | json-schema "0.2.3" 847 | verror "1.3.6" 848 | 849 | kind-of@^3.0.2: 850 | version "3.2.0" 851 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07" 852 | dependencies: 853 | is-buffer "^1.1.5" 854 | 855 | lazystream@^1.0.0: 856 | version "1.0.0" 857 | resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" 858 | dependencies: 859 | readable-stream "^2.0.5" 860 | 861 | lodash._baseassign@^3.0.0: 862 | version "3.2.0" 863 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 864 | dependencies: 865 | lodash._basecopy "^3.0.0" 866 | lodash.keys "^3.0.0" 867 | 868 | lodash._basecopy@^3.0.0: 869 | version "3.0.1" 870 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 871 | 872 | lodash._basecreate@^3.0.0: 873 | version "3.0.3" 874 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 875 | 876 | lodash._basetostring@^3.0.0: 877 | version "3.0.1" 878 | resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" 879 | 880 | lodash._basevalues@^3.0.0: 881 | version "3.0.0" 882 | resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" 883 | 884 | lodash._getnative@^3.0.0: 885 | version "3.9.1" 886 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 887 | 888 | lodash._isiterateecall@^3.0.0: 889 | version "3.0.9" 890 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 891 | 892 | lodash._reescape@^3.0.0: 893 | version "3.0.0" 894 | resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" 895 | 896 | lodash._reevaluate@^3.0.0: 897 | version "3.0.0" 898 | resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" 899 | 900 | lodash._reinterpolate@^3.0.0: 901 | version "3.0.0" 902 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 903 | 904 | lodash._root@^3.0.0: 905 | version "3.0.1" 906 | resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 907 | 908 | lodash.create@3.1.1: 909 | version "3.1.1" 910 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 911 | dependencies: 912 | lodash._baseassign "^3.0.0" 913 | lodash._basecreate "^3.0.0" 914 | lodash._isiterateecall "^3.0.0" 915 | 916 | lodash.escape@^3.0.0: 917 | version "3.2.0" 918 | resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" 919 | dependencies: 920 | lodash._root "^3.0.0" 921 | 922 | lodash.isarguments@^3.0.0: 923 | version "3.1.0" 924 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 925 | 926 | lodash.isarray@^3.0.0: 927 | version "3.0.4" 928 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 929 | 930 | lodash.isequal@^4.0.0: 931 | version "4.5.0" 932 | resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" 933 | 934 | lodash.keys@^3.0.0: 935 | version "3.1.2" 936 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 937 | dependencies: 938 | lodash._getnative "^3.0.0" 939 | lodash.isarguments "^3.0.0" 940 | lodash.isarray "^3.0.0" 941 | 942 | lodash.restparam@^3.0.0: 943 | version "3.6.1" 944 | resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" 945 | 946 | lodash.template@^3.0.0: 947 | version "3.6.2" 948 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" 949 | dependencies: 950 | lodash._basecopy "^3.0.0" 951 | lodash._basetostring "^3.0.0" 952 | lodash._basevalues "^3.0.0" 953 | lodash._isiterateecall "^3.0.0" 954 | lodash._reinterpolate "^3.0.0" 955 | lodash.escape "^3.0.0" 956 | lodash.keys "^3.0.0" 957 | lodash.restparam "^3.0.0" 958 | lodash.templatesettings "^3.0.0" 959 | 960 | lodash.templatesettings@^3.0.0: 961 | version "3.1.1" 962 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" 963 | dependencies: 964 | lodash._reinterpolate "^3.0.0" 965 | lodash.escape "^3.0.0" 966 | 967 | map-stream@~0.1.0: 968 | version "0.1.0" 969 | resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" 970 | 971 | merge-stream@^1.0.0: 972 | version "1.0.1" 973 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" 974 | dependencies: 975 | readable-stream "^2.0.1" 976 | 977 | micromatch@^2.3.7: 978 | version "2.3.11" 979 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 980 | dependencies: 981 | arr-diff "^2.0.0" 982 | array-unique "^0.2.1" 983 | braces "^1.8.2" 984 | expand-brackets "^0.1.4" 985 | extglob "^0.3.1" 986 | filename-regex "^2.0.0" 987 | is-extglob "^1.0.0" 988 | is-glob "^2.0.1" 989 | kind-of "^3.0.2" 990 | normalize-path "^2.0.1" 991 | object.omit "^2.0.0" 992 | parse-glob "^3.0.4" 993 | regex-cache "^0.4.2" 994 | 995 | mime-db@~1.27.0: 996 | version "1.27.0" 997 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 998 | 999 | mime-types@^2.1.12, mime-types@~2.1.7: 1000 | version "2.1.15" 1001 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 1002 | dependencies: 1003 | mime-db "~1.27.0" 1004 | 1005 | "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: 1006 | version "3.0.4" 1007 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1008 | dependencies: 1009 | brace-expansion "^1.1.7" 1010 | 1011 | minimist@0.0.8: 1012 | version "0.0.8" 1013 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1014 | 1015 | minimist@^1.1.0: 1016 | version "1.2.0" 1017 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1018 | 1019 | minimist@~0.0.1: 1020 | version "0.0.10" 1021 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 1022 | 1023 | mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: 1024 | version "0.5.1" 1025 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1026 | dependencies: 1027 | minimist "0.0.8" 1028 | 1029 | mocha@^3.2.0: 1030 | version "3.4.1" 1031 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.1.tgz#a3802b4aa381934cacb38de70cf771621da8f9af" 1032 | dependencies: 1033 | browser-stdout "1.3.0" 1034 | commander "2.9.0" 1035 | debug "2.6.0" 1036 | diff "3.2.0" 1037 | escape-string-regexp "1.0.5" 1038 | glob "7.1.1" 1039 | growl "1.9.2" 1040 | json3 "3.3.2" 1041 | lodash.create "3.1.1" 1042 | mkdirp "0.5.1" 1043 | supports-color "3.1.2" 1044 | 1045 | ms@0.7.2: 1046 | version "0.7.2" 1047 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 1048 | 1049 | multimatch@^2.0.0: 1050 | version "2.1.0" 1051 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" 1052 | dependencies: 1053 | array-differ "^1.0.0" 1054 | array-union "^1.0.1" 1055 | arrify "^1.0.0" 1056 | minimatch "^3.0.0" 1057 | 1058 | multipipe@^0.1.2: 1059 | version "0.1.2" 1060 | resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" 1061 | dependencies: 1062 | duplexer2 "0.0.2" 1063 | 1064 | node.extend@~1.1.2: 1065 | version "1.1.6" 1066 | resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96" 1067 | dependencies: 1068 | is "^3.1.0" 1069 | 1070 | normalize-path@^2.0.1: 1071 | version "2.1.1" 1072 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1073 | dependencies: 1074 | remove-trailing-separator "^1.0.1" 1075 | 1076 | oauth-sign@~0.8.1: 1077 | version "0.8.2" 1078 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1079 | 1080 | object-assign@^3.0.0: 1081 | version "3.0.0" 1082 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 1083 | 1084 | object-assign@^4.0.0: 1085 | version "4.1.1" 1086 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1087 | 1088 | object.omit@^2.0.0: 1089 | version "2.0.1" 1090 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1091 | dependencies: 1092 | for-own "^0.1.4" 1093 | is-extendable "^0.1.1" 1094 | 1095 | once@^1.3.0: 1096 | version "1.4.0" 1097 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1098 | dependencies: 1099 | wrappy "1" 1100 | 1101 | once@~1.3.0: 1102 | version "1.3.3" 1103 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 1104 | dependencies: 1105 | wrappy "1" 1106 | 1107 | optimist@~0.6.0: 1108 | version "0.6.1" 1109 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1110 | dependencies: 1111 | minimist "~0.0.1" 1112 | wordwrap "~0.0.2" 1113 | 1114 | ordered-read-streams@^0.3.0: 1115 | version "0.3.0" 1116 | resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" 1117 | dependencies: 1118 | is-stream "^1.0.1" 1119 | readable-stream "^2.0.1" 1120 | 1121 | parse-glob@^3.0.4: 1122 | version "3.0.4" 1123 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1124 | dependencies: 1125 | glob-base "^0.3.0" 1126 | is-dotfile "^1.0.0" 1127 | is-extglob "^1.0.0" 1128 | is-glob "^2.0.0" 1129 | 1130 | path-dirname@^1.0.0: 1131 | version "1.0.2" 1132 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 1133 | 1134 | path-is-absolute@^1.0.0: 1135 | version "1.0.1" 1136 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1137 | 1138 | path-parse@^1.0.5: 1139 | version "1.0.5" 1140 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1141 | 1142 | pause-stream@0.0.11: 1143 | version "0.0.11" 1144 | resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" 1145 | dependencies: 1146 | through "~2.3" 1147 | 1148 | pend@~1.2.0: 1149 | version "1.2.0" 1150 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 1151 | 1152 | performance-now@^0.2.0: 1153 | version "0.2.0" 1154 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 1155 | 1156 | pinkie-promise@^2.0.0: 1157 | version "2.0.1" 1158 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1159 | dependencies: 1160 | pinkie "^2.0.0" 1161 | 1162 | pinkie@^2.0.0: 1163 | version "2.0.4" 1164 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1165 | 1166 | preserve@^0.2.0: 1167 | version "0.2.0" 1168 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1169 | 1170 | process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: 1171 | version "1.0.7" 1172 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1173 | 1174 | punycode@^1.4.1: 1175 | version "1.4.1" 1176 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1177 | 1178 | qs@~6.3.0: 1179 | version "6.3.2" 1180 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" 1181 | 1182 | qs@~6.4.0: 1183 | version "6.4.0" 1184 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1185 | 1186 | queue@^3.0.10, queue@^3.1.0: 1187 | version "3.1.0" 1188 | resolved "https://registry.yarnpkg.com/queue/-/queue-3.1.0.tgz#6c49d01f009e2256788789f2bffac6b8b9990585" 1189 | dependencies: 1190 | inherits "~2.0.0" 1191 | 1192 | randomatic@^1.1.3: 1193 | version "1.1.6" 1194 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" 1195 | dependencies: 1196 | is-number "^2.0.2" 1197 | kind-of "^3.0.2" 1198 | 1199 | "readable-stream@>=1.0.33-1 <1.1.0-0": 1200 | version "1.0.34" 1201 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 1202 | dependencies: 1203 | core-util-is "~1.0.0" 1204 | inherits "~2.0.1" 1205 | isarray "0.0.1" 1206 | string_decoder "~0.10.x" 1207 | 1208 | readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5: 1209 | version "2.2.9" 1210 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" 1211 | dependencies: 1212 | buffer-shims "~1.0.0" 1213 | core-util-is "~1.0.0" 1214 | inherits "~2.0.1" 1215 | isarray "~1.0.0" 1216 | process-nextick-args "~1.0.6" 1217 | string_decoder "~1.0.0" 1218 | util-deprecate "~1.0.1" 1219 | 1220 | readable-stream@~1.1.9: 1221 | version "1.1.14" 1222 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 1223 | dependencies: 1224 | core-util-is "~1.0.0" 1225 | inherits "~2.0.1" 1226 | isarray "0.0.1" 1227 | string_decoder "~0.10.x" 1228 | 1229 | regex-cache@^0.4.2: 1230 | version "0.4.3" 1231 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1232 | dependencies: 1233 | is-equal-shallow "^0.1.3" 1234 | is-primitive "^2.0.0" 1235 | 1236 | remove-trailing-separator@^1.0.1: 1237 | version "1.0.1" 1238 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" 1239 | 1240 | repeat-element@^1.1.2: 1241 | version "1.1.2" 1242 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1243 | 1244 | repeat-string@^1.5.2: 1245 | version "1.6.1" 1246 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1247 | 1248 | replace-ext@0.0.1: 1249 | version "0.0.1" 1250 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" 1251 | 1252 | replace-ext@^1.0.0: 1253 | version "1.0.0" 1254 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" 1255 | 1256 | request@^2.79.0: 1257 | version "2.81.0" 1258 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 1259 | dependencies: 1260 | aws-sign2 "~0.6.0" 1261 | aws4 "^1.2.1" 1262 | caseless "~0.12.0" 1263 | combined-stream "~1.0.5" 1264 | extend "~3.0.0" 1265 | forever-agent "~0.6.1" 1266 | form-data "~2.1.1" 1267 | har-validator "~4.2.1" 1268 | hawk "~3.1.3" 1269 | http-signature "~1.1.0" 1270 | is-typedarray "~1.0.0" 1271 | isstream "~0.1.2" 1272 | json-stringify-safe "~5.0.1" 1273 | mime-types "~2.1.7" 1274 | oauth-sign "~0.8.1" 1275 | performance-now "^0.2.0" 1276 | qs "~6.4.0" 1277 | safe-buffer "^5.0.1" 1278 | stringstream "~0.0.4" 1279 | tough-cookie "~2.3.0" 1280 | tunnel-agent "^0.6.0" 1281 | uuid "^3.0.0" 1282 | 1283 | request@~2.79.0: 1284 | version "2.79.0" 1285 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" 1286 | dependencies: 1287 | aws-sign2 "~0.6.0" 1288 | aws4 "^1.2.1" 1289 | caseless "~0.11.0" 1290 | combined-stream "~1.0.5" 1291 | extend "~3.0.0" 1292 | forever-agent "~0.6.1" 1293 | form-data "~2.1.1" 1294 | har-validator "~2.0.6" 1295 | hawk "~3.1.3" 1296 | http-signature "~1.1.0" 1297 | is-typedarray "~1.0.0" 1298 | isstream "~0.1.2" 1299 | json-stringify-safe "~5.0.1" 1300 | mime-types "~2.1.7" 1301 | oauth-sign "~0.8.1" 1302 | qs "~6.3.0" 1303 | stringstream "~0.0.4" 1304 | tough-cookie "~2.3.0" 1305 | tunnel-agent "~0.4.1" 1306 | uuid "^3.0.0" 1307 | 1308 | resolve@^1.3.2: 1309 | version "1.3.3" 1310 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" 1311 | dependencies: 1312 | path-parse "^1.0.5" 1313 | 1314 | rimraf@2: 1315 | version "2.6.1" 1316 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1317 | dependencies: 1318 | glob "^7.0.5" 1319 | 1320 | safe-buffer@^5.0.1: 1321 | version "5.0.1" 1322 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 1323 | 1324 | semver@^5.3.0: 1325 | version "5.3.0" 1326 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1327 | 1328 | sntp@1.x.x: 1329 | version "1.0.9" 1330 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1331 | dependencies: 1332 | hoek "2.x.x" 1333 | 1334 | source-map-support@^0.4.11: 1335 | version "0.4.15" 1336 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" 1337 | dependencies: 1338 | source-map "^0.5.6" 1339 | 1340 | source-map@^0.5.6: 1341 | version "0.5.6" 1342 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1343 | 1344 | sparkles@^1.0.0: 1345 | version "1.0.0" 1346 | resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" 1347 | 1348 | split@0.3: 1349 | version "0.3.3" 1350 | resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" 1351 | dependencies: 1352 | through "2" 1353 | 1354 | sshpk@^1.7.0: 1355 | version "1.13.0" 1356 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" 1357 | dependencies: 1358 | asn1 "~0.2.3" 1359 | assert-plus "^1.0.0" 1360 | dashdash "^1.12.0" 1361 | getpass "^0.1.1" 1362 | optionalDependencies: 1363 | bcrypt-pbkdf "^1.0.0" 1364 | ecc-jsbn "~0.1.1" 1365 | jodid25519 "^1.0.0" 1366 | jsbn "~0.1.0" 1367 | tweetnacl "~0.14.0" 1368 | 1369 | stat-mode@^0.2.0: 1370 | version "0.2.2" 1371 | resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" 1372 | 1373 | stream-combiner@~0.0.4: 1374 | version "0.0.4" 1375 | resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" 1376 | dependencies: 1377 | duplexer "~0.1.1" 1378 | 1379 | stream-shift@^1.0.0: 1380 | version "1.0.0" 1381 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 1382 | 1383 | streamfilter@^1.0.5: 1384 | version "1.0.5" 1385 | resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.5.tgz#87507111beb8e298451717b511cfed8f002abf53" 1386 | dependencies: 1387 | readable-stream "^2.0.2" 1388 | 1389 | streamifier@~0.1.1: 1390 | version "0.1.1" 1391 | resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f" 1392 | 1393 | string_decoder@~0.10.x: 1394 | version "0.10.31" 1395 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1396 | 1397 | string_decoder@~1.0.0: 1398 | version "1.0.0" 1399 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" 1400 | dependencies: 1401 | buffer-shims "~1.0.0" 1402 | 1403 | stringstream@~0.0.4: 1404 | version "0.0.5" 1405 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1406 | 1407 | strip-ansi@^3.0.0: 1408 | version "3.0.1" 1409 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1410 | dependencies: 1411 | ansi-regex "^2.0.0" 1412 | 1413 | strip-bom-stream@^1.0.0: 1414 | version "1.0.0" 1415 | resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" 1416 | dependencies: 1417 | first-chunk-stream "^1.0.0" 1418 | strip-bom "^2.0.0" 1419 | 1420 | strip-bom@^2.0.0: 1421 | version "2.0.0" 1422 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1423 | dependencies: 1424 | is-utf8 "^0.2.0" 1425 | 1426 | supports-color@3.1.2: 1427 | version "3.1.2" 1428 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 1429 | dependencies: 1430 | has-flag "^1.0.0" 1431 | 1432 | supports-color@^2.0.0: 1433 | version "2.0.0" 1434 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1435 | 1436 | tar@^2.2.1: 1437 | version "2.2.1" 1438 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1439 | dependencies: 1440 | block-stream "*" 1441 | fstream "^1.0.2" 1442 | inherits "2" 1443 | 1444 | through2-filter@^2.0.0: 1445 | version "2.0.0" 1446 | resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" 1447 | dependencies: 1448 | through2 "~2.0.0" 1449 | xtend "~4.0.0" 1450 | 1451 | through2@^0.6.0, through2@^0.6.1, through2@^0.6.3, through2@~0.6.5: 1452 | version "0.6.5" 1453 | resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" 1454 | dependencies: 1455 | readable-stream ">=1.0.33-1 <1.1.0-0" 1456 | xtend ">=4.0.0 <4.1.0-0" 1457 | 1458 | through2@^2.0.0, through2@^2.0.1, through2@~2.0.0, through2@~2.0.3: 1459 | version "2.0.3" 1460 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 1461 | dependencies: 1462 | readable-stream "^2.1.5" 1463 | xtend "~4.0.1" 1464 | 1465 | through@2, through@~2.3, through@~2.3.1: 1466 | version "2.3.8" 1467 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1468 | 1469 | time-stamp@^1.0.0: 1470 | version "1.1.0" 1471 | resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" 1472 | 1473 | to-absolute-glob@^0.1.1: 1474 | version "0.1.1" 1475 | resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" 1476 | dependencies: 1477 | extend-shallow "^2.0.1" 1478 | 1479 | tough-cookie@~2.3.0: 1480 | version "2.3.2" 1481 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1482 | dependencies: 1483 | punycode "^1.4.1" 1484 | 1485 | tslib@^1.6.0: 1486 | version "1.7.0" 1487 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.7.0.tgz#6e8366695f72961252b35167b0dd4fbeeafba491" 1488 | 1489 | tslint-microsoft-contrib@*: 1490 | version "5.0.0" 1491 | resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.0.0.tgz#0ff6389ce3dbc5ea103782900a7806fffa1450ff" 1492 | 1493 | tslint@*: 1494 | version "5.2.0" 1495 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.2.0.tgz#16a2addf20cb748385f544e9a0edab086bc34114" 1496 | dependencies: 1497 | babel-code-frame "^6.22.0" 1498 | colors "^1.1.2" 1499 | diff "^3.2.0" 1500 | findup-sync "~0.3.0" 1501 | glob "^7.1.1" 1502 | optimist "~0.6.0" 1503 | resolve "^1.3.2" 1504 | semver "^5.3.0" 1505 | tslib "^1.6.0" 1506 | tsutils "^1.8.0" 1507 | 1508 | tsutils@1.6.0: 1509 | version "1.6.0" 1510 | resolved "http://repo.bison-group.com:80/artifactory/api/npm/npm-cache/tsutils/-/tsutils-1.6.0.tgz#1fd7fac2a61369ed99cd3997f0fbb437128850f2" 1511 | 1512 | tsutils@^1.8.0: 1513 | version "1.9.1" 1514 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" 1515 | 1516 | tunnel-agent@^0.6.0: 1517 | version "0.6.0" 1518 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1519 | dependencies: 1520 | safe-buffer "^5.0.1" 1521 | 1522 | tunnel-agent@~0.4.1: 1523 | version "0.4.3" 1524 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 1525 | 1526 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1527 | version "0.14.5" 1528 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1529 | 1530 | typescript@*: 1531 | version "2.3.2" 1532 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.2.tgz#f0f045e196f69a72f06b25fd3bd39d01c3ce9984" 1533 | 1534 | unique-stream@^2.0.2: 1535 | version "2.2.1" 1536 | resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" 1537 | dependencies: 1538 | json-stable-stringify "^1.0.0" 1539 | through2-filter "^2.0.0" 1540 | 1541 | util-deprecate@~1.0.1: 1542 | version "1.0.2" 1543 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1544 | 1545 | uuid@^3.0.0: 1546 | version "3.0.1" 1547 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 1548 | 1549 | vali-date@^1.0.0: 1550 | version "1.0.0" 1551 | resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" 1552 | 1553 | verror@1.3.6: 1554 | version "1.3.6" 1555 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1556 | dependencies: 1557 | extsprintf "1.0.2" 1558 | 1559 | vinyl-fs@^2.0.0, vinyl-fs@^2.4.3: 1560 | version "2.4.4" 1561 | resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" 1562 | dependencies: 1563 | duplexify "^3.2.0" 1564 | glob-stream "^5.3.2" 1565 | graceful-fs "^4.0.0" 1566 | gulp-sourcemaps "1.6.0" 1567 | is-valid-glob "^0.3.0" 1568 | lazystream "^1.0.0" 1569 | lodash.isequal "^4.0.0" 1570 | merge-stream "^1.0.0" 1571 | mkdirp "^0.5.0" 1572 | object-assign "^4.0.0" 1573 | readable-stream "^2.0.4" 1574 | strip-bom "^2.0.0" 1575 | strip-bom-stream "^1.0.0" 1576 | through2 "^2.0.0" 1577 | through2-filter "^2.0.0" 1578 | vali-date "^1.0.0" 1579 | vinyl "^1.0.0" 1580 | 1581 | vinyl-source-stream@^1.1.0: 1582 | version "1.1.0" 1583 | resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz#44cbe5108205279deb0c5653c094a2887938b1ab" 1584 | dependencies: 1585 | through2 "^0.6.1" 1586 | vinyl "^0.4.3" 1587 | 1588 | vinyl@^0.4.3, vinyl@^0.4.6, vinyl@~0.4.6: 1589 | version "0.4.6" 1590 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" 1591 | dependencies: 1592 | clone "^0.2.0" 1593 | clone-stats "^0.0.1" 1594 | 1595 | vinyl@^0.5.0: 1596 | version "0.5.3" 1597 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" 1598 | dependencies: 1599 | clone "^1.0.0" 1600 | clone-stats "^0.0.1" 1601 | replace-ext "0.0.1" 1602 | 1603 | vinyl@^1.0.0: 1604 | version "1.2.0" 1605 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" 1606 | dependencies: 1607 | clone "^1.0.0" 1608 | clone-stats "^0.0.1" 1609 | replace-ext "0.0.1" 1610 | 1611 | vinyl@~2.0.1: 1612 | version "2.0.2" 1613 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c" 1614 | dependencies: 1615 | clone "^1.0.0" 1616 | clone-buffer "^1.0.0" 1617 | clone-stats "^1.0.0" 1618 | cloneable-readable "^1.0.0" 1619 | is-stream "^1.1.0" 1620 | remove-trailing-separator "^1.0.1" 1621 | replace-ext "^1.0.0" 1622 | 1623 | vscode@^1.0.0: 1624 | version "1.1.0" 1625 | resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.0.tgz#b04c2399b6ec768135c9688e7873d776e28dcb95" 1626 | dependencies: 1627 | glob "^7.1.1" 1628 | gulp-chmod "^2.0.0" 1629 | gulp-filter "^5.0.0" 1630 | gulp-gunzip "0.0.3" 1631 | gulp-remote-src "^0.4.2" 1632 | gulp-symdest "^1.1.0" 1633 | gulp-untar "^0.0.6" 1634 | gulp-vinyl-zip "^1.4.0" 1635 | mocha "^3.2.0" 1636 | request "^2.79.0" 1637 | semver "^5.3.0" 1638 | source-map-support "^0.4.11" 1639 | vinyl-source-stream "^1.1.0" 1640 | 1641 | wordwrap@~0.0.2: 1642 | version "0.0.3" 1643 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 1644 | 1645 | wrappy@1: 1646 | version "1.0.2" 1647 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1648 | 1649 | "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: 1650 | version "4.0.1" 1651 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1652 | 1653 | yauzl@^2.2.1: 1654 | version "2.8.0" 1655 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2" 1656 | dependencies: 1657 | buffer-crc32 "~0.2.3" 1658 | fd-slicer "~1.0.1" 1659 | 1660 | yazl@^2.2.1: 1661 | version "2.4.2" 1662 | resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.2.tgz#14cb19083e1e25a70092c1588aabe0f4e4dd4d88" 1663 | dependencies: 1664 | buffer-crc32 "~0.2.3" 1665 | --------------------------------------------------------------------------------